js 连续赋值

JavaScript010

js 连续赋值,第1张

以下代码输出什么? 为什么?

var a = {n:1}

var b = a

a = {n:2}

a.x = a

console.log(a.x)

console.log(b.x)

var a = {n: 1}

var b = a

a.x = a = {n: 2}

console.log(a.x)

console.log(b.x)

第一个问题:

a.x --->{n:2,x:a}

b.x --->undefined

解答:a的值很清晰了,a第二次赋值以后变成了{n:2},随后添加了x属性指向自身。而对于b,在a第二次赋值以后,由于js中给变量赋值为object类型时,变量中存储的是对这个object的引用。

此时,a指向{n:2} ,而b指向了{n:1} ,a和b指向不同的对象,因此,在a上添加属性对于b无影响,b.x自然就是undefined。

第二个问题:

解答:第三句里的主要难点在js运算符的优先级,访问属性、调用方法运算符"."的优先级高于赋值运算符。因此执行顺序是

给a添加属性x,此时a,b都是 { n:1,x:undefined },a.x 运算后的结果即为这个object(可以说也就是b)的x属性值。

把{n:2}赋值给a,此时a是 {n:2},是一个新的对象。 b是{ n:1,x:undefined }。

由于( . 运算符最先计算)一开始js已经先计算了a.x,便已经解析了这个a.x是对象A的x,所以在同一条公式的情况下再回来给a.x赋值,也不会说重新解析这个a.x为对象B的x。

所以 a.x=a 应理解为对象A的属性x指向了对象B:

(这个时候a.x 已经运算完了,不会再与a产生任何关系,a.x依旧代表那个n为1对象的x属性值,和a已经没关系了。)

把{n:2}赋值给a.x 也就是 { n:1,x:undefined }这个对象的x属性,这个时候b依旧指向这个object,因此此时,a是{n:2},b是{n:1,x:{n:2}}

我只能举例说明,希望能帮助到你,望采纳,谢谢。

for(var i=0i<tform.lengthi++){

var e=tform[i]

if(e.type=='checkbox' &&e.checked)

{

S_ID+=e.value+","

}

}

解析:

最主要的是 a.x = a = {n: 2} 这句话

. 运算符的优先级高于 =

所以顺序是

第一步,a.x = (????),此时因为还没有生成{n: 2},所以这个a.x,是在老地址里面声明的x变量,

第二步,执行 (????)里面的内容,也就是 a = {n: 2},在这里a指向了新地址{n: 2}

第三步,也就是执行从左到右数的第一个=,那么就是(老地址.x) = a的新地址

老地址因为被b引用,无法被销毁,所以b.x 就是a的新地址,

所以 b.x 就是{n : 2},那么a.x此时因为a指向了新地址,新地址里面没有声明变量x,所以a.x 是undefined