# 淦!五行代码,难倒几十个前端群的小伙伴
下面三道题,你能非常清晰的知道为什么结果会是那样么?是否符合你心中的预期呢?🤪
- first
let a={n:1}
let prevA=a
a.x=a={n:2}
console.log(a.x)//undefined
console.log(prevA.x)//{n:2}
1
2
3
4
5
2
3
4
5
- second
function good() {
var var1 = 1, var2 = 1, var3 = 1;
}
function bad() {
var var1 = var2 = var3 = 1;
}
good();
console.log(window.var2); // undefined
bad();
console.log(window.var2); // 1. Aggh!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
- third
function go(){
let a=b=c=1
}
go()
console.log(b)//1
console.log(c)//1
1
2
3
4
5
6
2
3
4
5
6
- four
var president = {name:"Pooh",next:president}
console.log(president)
1
2
2
- five
let president = {name:"Pooh",next:president}
console.log(president)
1
2
2
# mdn对连等的解释
连等为右结合性
根据以上题目代码的执行结果,我更倾向于将连等的想象成下面这样的模型
let a=b=c=1
👇
let a=b b=c c=1
or
let a=(b=(c=1))
# 第一题的详细解析🔥
Source code
let a ={n:1}
let prevA=a
a.x=(a={n:2})
console.log(a.x)
console.log(prevA)
1
2
3
4
5
2
3
4
5
下面是对javascript代码的模型构建👇
line 1
let a ={n:1}
1
line 2
let prevA=a
1
line3
a.x=(a={n:2})
1

# 结论
Tip
:如果你还是无法理解,你可以理解为a.x
作为表达式的左侧它被缓存
住了,不受表达式右侧
的影响,如果你的心智模型足够强壮💪,你就能像我一样画出上面的图来解释这段代码了
- 永远记住在
javascript模型
中=
左边是wire
(线) - 永远记住在
javascript模型
中=
右边是value
(值) - let a=b=c=1 👉 let a=(b=(c=1))