在javascript中将基元包装为对象的开销是多少?

时间:2013-05-22 20:14:06

标签: javascript gwt

通过包装原始JavaScript值使它们成为对象会产生什么(如果有的话)?

例如:

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

VS

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

我的理由是:我正在使用GWT代码来转换JavaScript和Java代码之间的值(后来编译成Javascript代码)。由于Java非常关注类型和GWT JSNI(互操作方法)支持基元和对象,我想知道为什么不返回'盒装'基元(例如,对象(12)是12的盒装版本)。

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

2 个答案:

答案 0 :(得分:3)

原语不是对象,所以它们更便宜(参见Alex Wayne的回答)。另一方面

  

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

see the MDN manual

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

答案 1 :(得分:3)

var x = Object(12);似乎比var x = 12;

慢约97%

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

但是,如果您打算在号码上调用方法,差异会小得多,但在号码上调用Object()的速度更快。


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

var x = 12.1234;
x.toFixed(2); // "12.12"