4

将原始 JavaScript 值包装成对象会产生什么开销(如果有的话)?

例如:

> var x = Object(12);
undefined
> typeof x
"object"
> ({}).toString.call(x);
"[object Number]"

对比

> var y = 12;
undefined
> typeof y
"number"
> ({}).toString.call(y);
"[object Number]"

我问的原因:我正在使用在 JavaScript 和 Java 代码(后来编译成 Javascript 代码)之间转换值的 GWT 代码。由于 Java 非常关心类型并且 GWT JSNI(互操作方法)支持原语和对象,我想知道为什么不只返回“盒装”原语(例如 Object(12) 是 12 的盒装版本)。

答案是我所期望的明确的——速度。我没有意识到它会如此严重,但如果可以的话,显然要避免盒装的 Javascript 原语,或者在性能上付出沉重的代价。(需要注意的是,方法调用的开销会像 Jan 提到的那样翻转)

4

2 回答 2

3

基元不是对象,因此它们更便宜(请参阅 Alex Wayne 的回答)。另一方面

您可以在字符串文字值上调用 String 对象的任何方法——JavaScript 自动将字符串文字转换为临时 String 对象,调用该方法,然后丢弃临时 String 对象。您还可以将 String.length 属性与字符串文字一起使用。

见 MDN 手册

所以使用原语,但如果你想在它们上调用方法,你应该创建对象。

于 2013-05-22T20:17:18.817 回答
3

var x = Object(12);似乎比大约慢 97%var x = 12;

http://jsperf.com/object-wrap-number-overhead

但是,如果您打算在号码上调用方法,则差异要小得多,尽管调用Object()号码仍然更快。


但真正的问题是你为什么要这样做?您可以在没有这种显式转换的情况下调用数字上的方法。

var x = 12.1234;
x.toFixed(2); // "12.12"
于 2013-05-22T20:17:41.007 回答