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

标签 javascript boxing typeof

可以使用 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/

相关文章:

Kotlin 盒装​​ Int 不一样

c# - 当装箱类型未知时检查不同类型的装箱值类型是否相等

Scala 转换为泛型类型

vb.net - 带有泛型的 VB typeof 运算符

javascript - 如何在构建 HTML 时剥离 JavaScript 代码?

javascript - Node.js 中未使用 RS256 算法生成 jsonwebtoken token

javascript - 将 OCRed 非结构化文本转换为正确的文本

c - C90 中的 Linux 内核 container_of 宏和通用容器

javascript - typeof window == "undefined"在使用 ts-node 时抛出错误

javascript - 在 jQuery 中选择动态生成的元素