gpt4 book ai didi

javascript - 值是原始值还是盒装值是否重要

转载 作者:可可西里 更新时间:2023-11-01 01:25:36 26 4
gpt4 key购买 nike

可以使用 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";
};

这两个功能是否有任何用例? (或 NumberBoolean 等类似函数)。

这个问题背后的概念来自以下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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com