递增++与递减--

77 阅读1分钟
let obj = {
  i:1,
  toString:function(){
    return obj.i++;
  }
}
console.log(obj==1); // true
console.log(obj==2); // true
console.log(obj==3); // true

let a = false,b=true,c='1n1a',d=1,obj1={};
a--;
b++;
c++;
d++;
obj1++;
console.log(a,b,c,d,obj1); // -1 2 NaN 2 NaN

递增递减遵循以下规则

类型++ 结果-- 结果备注
有效数字字符的字符串 “1”20先转为数字,再执行加1减1
不包含有效数字字符的字符串 “1n1a”NaNNaN
布尔值false/true1 /2-1/0先转为数字, 再执行加1减1
浮点数值 120
应用在对象上 let obj1={}NaNNaN先调用对象valueOf方法,取得可供操作的值,如果结果为NaN,再调用toString()方法

上述题目之所以obj递减后不是NaN,主要是因为obj改写了toString方法,不再继承来自原型链上的toString(等同于Object.prototype.toString()) toString()方法返回一个表示该对象的字符串。