使用文字符号丢​​失负数

Negative number is lost using literal notation

我正在尝试检测 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

有人知道为什么会这样吗?谢谢。 :)

作为运算符,一元减号的优先级低于 .

(-11).test();

根据MDN's Operator Precendence,成员访问运算符 (.) 具有第二高的优先级,一元否定出现在位置 5。

由于.运算符的优先级高于一元取反,表达式实际上是这样计算的

-(11..test())

所以,test的结果实际上是试图被一元取反。你可以确认一下,像这样

console.log(-11..test());
// -11

要得到预期的结果,需要用括号(优先级最高的运算符)将数字括起来,像这样

(-11).test()

现在,-11 将首先被评估,test 被调用在结果上,即 -11 本身。