可以使用 typeof
来确定一个值是原始值还是装箱值。
考虑:
typeof "foo"; // "string"
typeof new String("foo"); // "object"
结合 Object.prototype.toString
我们可以定义以下两个函数
var toString = Object.prototype.toString;
var is_primitive_string = function(s) {
return toString.call(s) === "[object String]" && typeof s === "string";
};
var is_boxed_string = function(s) {
return toString.call(s) === "[object String]" && typeof s === "object";
};
这两个功能是否有任何用例? (或 Number
、Boolean
等类似函数)。
这个问题背后的概念来自以下Comment by T.J.Crowder .
我们是否应该关心我们拥有的值是原始值还是盒装值?
最佳答案
我想说这几乎没有意义,您几乎从不关心您是在处理 string
原语还是 String
对象。
有一些极端情况。例如,String
对象是一个实际对象,您可以向其添加属性。这使您可以执行以下操作:
function test(arg) {
arg.foo = "bar";
}
如果调用代码传入一个字符串
原始:
var s1 = "str";
test(s1);
...arg
被提升为 String
对象并向其添加属性,但未使用该 String
对象通过 test
返回后的任何内容。
相反,如果调用代码传入一个String
object:
var s2 = new String("str");
test(s2);
...然后该属性被添加到该对象并且调用代码可以看到它。考虑 ( live copy ):
var s1, s2;
s1 = "str";
display("[Before] typeof s1.foo = " + typeof s1.foo);
test(s1);
display("[After] typeof s1.foo = " + typeof s1.foo);
s2 = new String("str");
display("[Before] typeof s2.foo = " + typeof s2.foo);
test(s2);
display("[After] typeof s2.foo = " + typeof s2.foo);
function test(arg) {
arg.foo = "bar";
}
输出:
[Before] typeof s1.foo = undefined [After] typeof s1.foo = undefined [Before] typeof s2.foo = undefined [After] typeof s2.foo = string
请注意 s2.foo
是一个字符串,但 s1.foo
不是(因为 s1
是一个字符串 原始的,我们在 test
中提升它时创建的对象与调用代码无关)。
这有什么用例吗?不知道。如果是这样,我会说这将是一个非常前卫的边缘案例。
关于javascript - 值是原始值还是盒装值是否重要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6793228/