Javascript if语句中的逗号
我在一些JavaScript中遇到了一个相当混乱的语句: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
如果(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');
}