如下 3 个表达式的区别:
//sample1
var str = 123;
var str1 = 123;
var str2 = 123;
//sample2
var str = 123,str1 = 123,str2 = 123;
//sample3
var str = str1 = str2 = 123;
//`sample1` = `sample2`,区别仅仅是代码风格而已;
//sample2
var str = 123,str1 = 123,str2 = 123; //str,str1,str2 全部为局部变量
//sample3
var str = str1 = str2 = 123; //str 局部变量,str1,str2 为全局变量

最新补充
比如:
var str=str1=str2=123;
解析过程如下:
注意: str1 和 str2 ,由于他俩前面并没有直接有 var 符号,但是又得为它们赋值,这时候 JS 引擎赋值时,就会把他们挂到全局对象 window 对象上,因为 window 对象已经存在,所以不会在定义了;而对象的属性,只有在赋值时,才会动态在堆内存中追加。所以, var1 和 var2 也不会创建。
记住:变量提升创建的,只包含:基本类型、对象和声明的函数,不包含对象上的属性。
接下来就是一步步赋值的过程了,见下面第 2 步的解释。
比如:
var str=str1=str2=123;
并不是: 将 123 先赋值给 str2,再将 str2 赋值给 str1,再将 str1 赋值给 str;
而是: 将 123 赋值给 str2,再将 123 赋值给 str1,再将 123 赋值给 str;
也就是上方的连等式可以理解为:
var str;
str = 123;
str1 = 123;
str2 = 123;
请大家给出如下表达式的执行结果:
var a = {n:1};
var b = a;
a.x = a = {n:2};
console.log('a.x=',a.x);//?
console.log('b.x=',b.x);//?
大家先自己给出一个答案,然后看看下面的分析跟你想的一样不?
第一步:先将代码中的变量提升,不存在的变量先定义。
于是代码片段变为:
//第一步做的事情
var a;
var b;
//第二步开始的地方
a = {n:1};
b = a;
a.x = a = {n:2};
console.log('a.x=',a.x);//?
console.log('b.x=',b.x);//?
第二步:一步步执行代码片段并赋值。


console.log('a.x=',a.x);//undefined
console.log('b.x=',b.x);//{n:2}

其实本题最容易绕晕的 2 个地方:

