let cont = 0;
let b = cont++
我以为会是这样
b // 1
结果是这样
b // 0
我再加了个括号
let cont = 0;
let b = (cont++)
结果还是一样,应该是 赋值运算符 的优先级比 递加运算符 高吧。。
分开就没问题了
let cont = 0;
cont++;
let b = cont;
b // 1
但是我突然意识到逻辑有点走不通,如果是优先级的问题那么()的优先级应该更高,很明显 ++ 对cont的赋值已经发生了之后才进行的 对b的赋值,如果把++解析为函数,返回的值不是cont本身那么一切都解释的通了
那就要开始探讨 cont++ 这段运算符发生了什么
编译器解析到++,我们姑且将其解析为一个函数
function ++(obj){ //只是示例
//一段运算
}
这个函数做了什么呢?
我们来看看++的特性
let b = '2'
b++;
b // 3
let c = 'ksk'
c++;
c //NaN
在示例中不难看出,++运算符中,并没有盲目的 对被递加数 进行 直接+1这种赋值操作
不然 c 返回的数应该是 'ksk1' , b 返回的应该是 '21', 对于被 递加数应该是有个判定
再看一组示例
let b = '123'
let k = b++
k // 123 (Number类型的)
b // 124 (Number类型的)
b = 'ksk'
k = b++
k // NaN
b // NaN
更加佐证了我一上的观点,现在我们通过函数对其模拟
function add(cont){
let c = Number(win[cont]) //声明一个临时变量来存储
win[cont] = isNaN(c) ? c : (c + 1) //对cont进行赋值
return c //将临时变量返回
}
模拟下++
function add(cont){
let c = Number(win[cont]) //声明一个临时变量来存储
win[cont] = isNaN(c) ? c : (c + 1) //对cont进行赋值
return c //将临时变量返回
}
let win = {}
win.a = 0 //let a = 0
win.b = add('a') //let b = a++
win.a // 1
win.b // 0
win.a = '123'
win.b = add('a')
win.a // 124
win.b // 123
ok,解决
总结,对 被递加数 的赋值是已经发生了,早于=赋值,不过++后(例如k++)返回的不是已经被赋值后的 被递加数,而是在++运算符中被创建的一个临时变量,导致 b = cont++ 后 b 的值与 cont 的值不等的情况