6

看看下面的代码:

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'

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

4

5 回答 5

10

这是一个语法错误,因为您代表的是一个数字。字符串可以这样工作,但数字不能,因为紧跟在数字后面的句点表示十进制值。之后的字符.导致错误。

于 2009-12-07T16:18:14.393 回答
7

大多数答案已经表明,数字文字后的点被视为该数字的一部分,作为分数分隔符。但是,如果您仍想将点用作运算符,那么快速简便的解决方法是在数字和空格之间留一个空白区域。

2 .isIn(1,2,3,4,5) // <- notice the space between 2 and .
于 2009-12-07T19:18:55.730 回答
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)
于 2009-12-07T17:35:47.613 回答
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()将导致语法错误,因为.被视为小数点,并且foo()不是要解析为数字的有效字符序列. (10).foo()将作为封闭括号(10)使整个构造在 the 之前.成为一个表达式。计算此表达式并返回原始数字值10。然后将.其视为在对象上下文中处理该原始值,因此它会自动包装在类型对象中Number(这是实际的自动类型转换)。然后foo引用该对象在其原型链上的属性;和决赛()导致该属性被视为函数引用并在 Number 对象的“this”上下文中调用,该对象在遇到..

于 2009-12-07T17:17:52.963 回答
-1

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

执行以下操作;

var x = 10;

和去是一样的;

var x = new Number(10);

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

于 2009-12-07T16:27:43.810 回答