我正在尝试检测Number原型中函数内的数字是否为负数。对于语法糖,我使用“..”将数字转换为对象。但是,当我评估一个负数时,它结果是一个积极的数字:
Number.prototype.test = function() {
n = this.valueOf();
console.log(n);
console.log(typeof n);
return n;
};
-11..test()
// 11 - why???
// number
// -11
如果我使用Number对象,结果是预期的结果:
Number(-11).test()
// -11
// number
// -11
有人知道为什么会这样吗?谢谢。 :)
答案 0 :(得分:3)
根据MDN's Operator Precendence,成员访问运算符(.
)具有第二高优先级,并且一元否定位于第5位。
由于.
运算符的优先级高于一元否定,因此表达式实际上是按此计算的
-(11..test())
因此,test
的结果实际上是被一元否定的。您可以像这样确认
console.log(-11..test());
// -11
要获得预期结果,您需要用括号(具有最高优先级的运算符)包装数字,如下所示
(-11).test()
现在,我们将首先评估-11
,并在结果上调用test
,-11
本身。
答案 1 :(得分:1)
作为运算符,一元减号的优先级低于.
。
(-11).test();