js ++(递加 | 双加)运算符的一个小问题 和 探讨 ++ 运算符发生了什么

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 的值不等的情况

你可能感兴趣的:(js'随笔,javascript,es6)