5

这是对此问题的后续问题。

看看这两个例子:

var number1 = new Number(3.123);
number1 = number1.toFixed(2); 
alert(number1);

var number2 = 3.123;
number2 = number2.toFixed(2);
alert(number2);

我意识到它们最终都具有相同的值,但是引用原始值的方法是否正确?(换句话说,3.123.method 与 object.method 相对?)

4

3 回答 3

7

从技术上讲,没有。您可以将其视为原始值的方法,因为 number2 将被转换为Number对象,然后toFixed在该对象上调用 is。

当您在字符串上调用方法时,也会发生同样的事情。

为了说明发生了什么,您可以运行以下代码:

Object.prototype.type = function() { return typeof this; }

var string = "a string";
var number = 42;

alert(typeof string); // string
alert(string.type()); // object

alert(typeof number); // number
alert(number.type()); // object
于 2008-12-15T19:40:54.110 回答
4

在 JavaScript 中,一切都是对象,甚至函数和整数。考虑数字和字符串的方法是完全可以的。例如:

>>> (3.123).toString()
"3.123"
于 2008-12-15T19:41:03.890 回答
3

对使用原始值初始化的字面量值或变量调用方法与首先将值强制为适当类型的 Object 然后在其上调用方法具有相同的效果。下面的实验比试图用语言解释这一点要好:

Object.prototype.getPrototype = function() { return "Object"; };
Number.prototype.getPrototype = function() { return "Number"; };

function test(v) {
    alert("proto: " + v.getPrototype()
        + ", type: " + typeof v
        + ", is a Number: " + (v instanceof Number)
        + ", is an Object: " + (v instanceof Object));
}

// proto: Number, type: number, is a Number: false, is an Object: false
test(42);

// proto: Number, type: number, is a Number: false, is an Object: false
test(Number(42));

// proto: Number, type: object, is a Number: true, is an Object: true
test(Object(42));

// proto: Number, type: object, is a Number: true, is an Object: true
test(new Number(42));
于 2008-12-15T20:39:44.507 回答