JavaScript变量赋值逻辑疑问:4种场景输出及报错原因求解
四个JavaScript变量赋值场景的逻辑拆解
嘿,我来帮你把这四个场景的运行逻辑彻底搞清楚!核心其实就是逗号运算符的优先级和逗号在不同语境下的作用在作怪,咱们逐个唠:
场景1:var num = (1, 2, 3); → 输出3
var num = (1, 2, 3); console.log(num); // 3
这里括号里的是逗号表达式,逗号运算符的规则很简单:依次执行每个操作数(这里就是1、2、3),最后返回最后一个操作数的值。所以整个括号里的表达式执行完后返回3,再把3赋值给num,自然输出3,完全合法。
场景2:y = (1, 2, 3); → 输出3
y = (1, 2, 3); console.log(y); // 3
这个和场景1本质上是双胞胎!唯一的区别是没有用var声明y(在非严格模式下y会被挂载到全局对象上),但括号里的逗号表达式逻辑没变,还是返回最后一个操作数3,赋值给y后输出3,所以结果和场景1完全一致。
场景3:z = 1, 2, 3; → 输出1
z = 1, 2, 3; console.log(z); // 1
这里的关键点是逗号运算符的优先级比赋值运算符低!所以这条语句会被JavaScript引擎自动解析成:
(z = 1), 2, 3;
意思是先执行z = 1完成赋值,然后依次求值2和3,但这两个值没有被绑定到任何变量上,相当于“无效操作”。所以最终z的值就是1,输出自然是1。
场景4:var m = 1, 2, 3; → 报错Unexpected number
// var m = 1, 2, 3; // 取消注释会报错
这里的逗号不是逗号运算符,而是var声明语句中用来分隔多个变量的分隔符!正确的多变量声明写法应该是var m = 1, n = 2, p = 3;(每个变量名对应一个值)。但你写的var m =1,2,3中,逗号后面的2没有对应的变量名,语法完全不合法,所以引擎会抛出Unexpected number的错误。
内容的提问来源于stack exchange,提问作者Mohsen Alyafei
相关产品推荐
相关产品推荐

