从新理解连续赋值

之前我觉得:node

var x = y = 100
复制代码

就是连续赋值。测试

实际上,上边的语句中, var x 只是声明一个 x ,而后用 y = 100 的结果值去初始化 x 。spa

那什么是连续赋值呢?举个🌰:code

var a = {n:1},
// 这才是连续赋值
a.x = a = {n:2};
复制代码

可是:console

console.log(a.x); // --> undefined
复制代码

为何呢?class

缘由是:a 被从新赋值为 {n:2} 后, a 的引用变成了全新的,而 js 遵循从左向右的执行原则,a.x 拿到的是老的 a 的属性引用,console.log(a.x) 中的 a 是新的 a ,因此 undefined 。object

如何证实:引用

var a = {n:1}, ref = a; // ref暂存了“原始的a”
a.x = a = {n:2};

console.log(a.x); // undefined
console.log(ref.x); // object {n:2}
console.log(ref.n); // 1 
复制代码

因而咱们能够利用连续赋值实现一个链表:链表

var i = 10, root = {index: "NONE"}, node = root;// 建立链表
while (i > 0) {
  node.next = node = new Object; node.index = i--; // 这里能够开始给新node添加成员
  node.name = `name ${i + 1}`
}
// 测试
node = root;
while (node = node.next) { console.log(node);}
复制代码

补充:关于 . 运算:next

若是点运算在后续运算中被做为 lhs,例如 node.next = ...,那么它就是做为“引用”来使用,这样就能够访问到x这个属性,并置值;若是它在后续运算中被做为 rhs,例如 console.log(node.next),那么它就会被 GetValue() 取值(并做为值来使用)。

点运算总体被做为“一个操做数”,它的用法与它被使用的位置是有关的。可是“获得它(亦便是对a.x这个表达式求 Result )”的过程并无什么不一样。

相关文章
相关标签/搜索