通过包装原始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提到的那样翻转)
答案 0 :(得分:3)
原语不是对象,所以它们更便宜(参见Alex Wayne的回答)。另一方面
您可以在字符串文字值上调用String对象的任何方法 - JavaScript会自动将字符串文字转换为临时String对象,调用该方法,然后丢弃临时String对象。您还可以将String.length属性与字符串文字一起使用。
所以使用原语,但如果你想调用它们的方法,你应该改为创建对象。
答案 1 :(得分:3)
var x = Object(12);
似乎比var x = 12;
http://jsperf.com/object-wrap-number-overhead
但是,如果您打算在号码上调用方法,差异会小得多,但不在号码上调用Object()
的速度更快。
但真正的问题是你为什么要这样做?您可以在没有这种显式转换的情况下调用数字上的方法。
var x = 12.1234;
x.toFixed(2); // "12.12"