之前我觉得: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 )”的过程并无什么不一样。