Javascript if语句中的逗号

Javascript if语句中的逗号,javascript,Javascript,我在一些JavaScript中遇到了一个相当混乱的语句: 如果(n=“value”,a==b){。。。 我认为这会首先分配值n,然后执行比较(a==b),以确定是否继续执行if语句。但是为什么呢?这样做有什么好处吗 n=“值”; 如果(a==b){。。。 或者 若(a==b){n=“值”。。。 在JavaScript中,每当您将多个表达式放在一对括号内时,它们将作为最后一个表达式进行计算,如下面的示例所示: var a = (1, 2); var b = a + 1; // b = 2

我在一些JavaScript中遇到了一个相当混乱的语句:

如果(n=“value”,a==b){。。。
我认为这会首先分配值
n
,然后执行比较(
a==b
),以确定是否继续执行
if
语句。但是为什么呢?这样做有什么好处吗

n=“值”;
如果(a==b){。。。
或者

若(a==b){n=“值”。。。

在JavaScript中,每当您将多个表达式放在一对括号内时,它们将作为最后一个表达式进行计算,如下面的示例所示:

var a = (1, 2);
var b = a + 1;    // b = 2 + 1 = 3
因此,在您的例子中,解释器执行属性
n=“value”
,然后以
a==b
为条件解析if。这与:

n = "value";
if (a == b) {
    // ...
}
解释了这种行为

编辑 但是,这并没有将
n
限制在
if
的范围内。同样的情况也发生在
for
循环中的var声明上:

for (var i = 0; i < 10; i++) {
    // Do stuff...
}
console.log(i);    // Logs 10
函数也是如此:

foo();
function foo() {
    console.log('bar');
}

你是对的-这只是一种非常令人困惑的方式,用短语指定一个变量,然后运行一个
if
语句。它是有效的代码,但相当于不那么令人费解的版本,所以这很可能只是某人太聪明的情况。

你对含义的评估是正确的。除了简洁之外没有其他好处很多人都会考虑这个糟糕的做法,但这并不困扰我。
棘手的是,当你开始调用有副作用的函数时……然后你可以做一些非常奇怪的事情。

这是我们工作领域经常遇到的问题……人们认为,因为他们学习/发现了一种鲜为人知的做事方法,所以这是一种很好的方式。@talemyn:我更喜欢在我开始工作之前知道我在做什么实际上,使用这样的结构!@Westie-这让你比许多同龄人高了一步!:D@tmcw:我必须说,我发现它可以使代码更具可读性!在上面我在Ehtan的回答中评论的示例中(
if(fail=sel.selectedIndex==0,fail)break;
)对
fail
的赋值变成了
if
语句的上下文。这是一件美丽而优雅的事情!因此
n
的范围仅限于
if
语句?很好地提到了变量范围,但您可能应该讨论或指向关于“变量提升”的资源,这对于真正理解JS中的变量范围是必要的。因此,仅参考编辑2,这是一个良好的实践还是刚刚被接受?并且
bla=2;var x=bla*2;var bla;
是否有效(即
bla
不仅被分配,而且在声明之前也被使用)是的,它是有效的,而且很好。但是,我不认为这是一个很好的实践,因为除非严格必要,否则代码会更难理解。是的,这就是我所想的。非常感谢您的详细解释。您的第三个片段与以前的两个片段不一样。在两个第一个片段中,代码> N< /Cord>是在任何情况下设置的。,在第三个代码段中,
n
将仅在
if
通过时设置。嗯。这是真的。我想,我的意思是,通过在
if
函数中删除
n
的范围,是否限制了它(下面由Danilo简洁地回答)理论上,如果
n
被限制在
if
语句的范围内,那么它就可以用于最终的比较,因此即使测试失败
n
也会得到
if
范围内的值。@但非常感谢你们帮助我理解这一点。我现在实际使用了它,发现它使代码更可读(在我目前的情况下)而不是更少。呵呵。发生的次数比你想象的要多。
var x=0;函数doSomething(){x++;};if(doSomething(),x==3){/*../}
Yep-我现在是这条语句的骄傲的新所有者:
if(fail=sel.selectedIndex==0,fail)break;
现在看这太傻了……赋值操作符返回赋值,所以这相当于说
if((fail=sel.selectedIndex)==0)
。不,它不是-将
sel.selectedIndex==0的比较指定给
fail
,以便以后在同一脚本中使用,然后
fail
也用作逗号运算符的后半部分。但可能它可以在比较周围加括号,因此可能应该是
if(fail=(sel.selectedIndex==0)(失败)break;
啊,你说得对,韦斯蒂。我想的是你想做什么,而不是声明实际上说了什么。
foo();
function foo() {
    console.log('bar');
}