JavaScript中Number方法的奇怪语法

时间:2009-12-07 16:13:47

标签: javascript syntax extend

看看以下代码:

Number.prototype.isIn = function () {
    for (var i = 0, j = arguments.length; i < j; ++i) {
        if (parseInt(this, 10) === arguments[i]) {
            return true;
        }
    }
    return false;
};

var x = 2;
console.log(x.isIn(1,2,3,4,5)); // <= 'true'
console.log(2.isIn(1,2,3,4,5)); // <= Error: 'missing ) after argument list'

为什么当它是变量时,代码才能正常工作,但是当它是数字文字时,它会失败?


而且,奇怪的是,为什么以下行有效?

console.log((2).isIn(1,2,3,4,5)); // <= 'true'

在上面的一行中,我基本上将括号中的文字括起来了。

5 个答案:

答案 0 :(得分:10)

这是一个语法错误,因为您正在表示一个数字。字符串可以以这种方式工作,但不是数字,因为紧跟在数字后面的句点表示小数值。 .后面的字符导致错误。

答案 1 :(得分:7)

大多数答案已经说过,数字文字后面的点被视为此数字的一部分,作为分数分隔符。但是,如果您仍然希望使用点作为运算符,那么快速简便的修复将在数字和空格之间留下空白空间。

2 .isIn(1,2,3,4,5) // <- notice the space between 2 and .

答案 2 :(得分:2)

Josh是正确的,但您不必使用变量来使用数字方法, 虽然这样做通常更方便。

5.isIn(1,2,3,4,5) returns an error

5.0.isIn(1.2.3.4.5) returns true, as does
(5).isIn(1,2,3,4,5)

答案 3 :(得分:0)

虽然由于自动类型转换,这种区别通常不明显,但JavaScript支持许多基本类型和对象:

var foo = 10;
var bar = new Number(10);
alert(foo.toString(16)); // foo is automatically wrapped in an object of type Number 
                         // and that object's toString method is invoked
alert(bar.toString(16)); // bar is already an object of type Number, 
                         // so no type conversion is necessary before 
                         // invoking its toString method
var foo2 = "foo";
var bar2 = new String("foo");
alert(typeof foo2);      // "string" - note the lowercase "s", not a String object
alert(typeof bar2);      // "object"

alert(typeof true)       // "boolean"
alert(typeof new Boolean(true)) // "object"

这个问题真的让人困惑:

// the next line will alert "truthy"
alert("Boolean object with value 'false'" + (new Boolean(false) ? " is truthy" : " is falsy"));
// the next line will alert "falsy"
alert("boolean primitive with value 'false'" + (false ? " is truthy" : " is falsy"));

虽然依靠自动类型转换可以让生活变得更轻松,但是应该始终在一个人的脑海中充分理解你的原始值和对象实际上是什么类型;出现了大量的JS漏洞,因为人们没有意识到,例如,看起来像数字的东西实际上是一个字符串,或者他们执行的某些操作导致了一些过去包含数字的东西被分配了一个新的值,它是一个字符串或一个对象。

编辑:更密切地解决原始问题,我现在意识到我没有明确回答:10.foo()会导致语法错误,因为.被视为小数点,{ {1}}不是要解析为数字的有效字符序列。 foo()将作为括号(10).foo()(10)之前的整个构造转换为单个表达式。计算此表达式并返回基元数值.。然后10被视为在对象上下文中处理该原始值,因此它自动包装在.类型的对象中(这是自动类型转换)。然后引用在其原型链上找到的该对象的Number属性;最后foo导致该属性被视为函数引用,并在Number对象的'this'上下文中调用,该对象在遇到()时被原始值包围。< / p>

答案 4 :(得分:-1)

我的理解是数字是文字,不是对象。但是,当您将变量定义为数字时,它将成为新的Number()对象。

执行以下操作;

var x = 10;

和去的一样;

var x = new Number(10);

至于第二个例子;我只能假设在数字周围加上括号使得JavaScript编译器假定该值是一个匿名的Number()对象。这有道理我猜...