【问题标题】:Primitive wrapper behavior in JavaScriptJavaScript 中的原始包装器行为
【发布时间】:2012-10-23 17:00:15
【问题描述】:

Professional Javascript for Web Developers 一书中,我读到 JavaScript 在尝试访问原始对象的属性和方法时会在内部使用原始包装器。这是否意味着每次我尝试访问字符串原语的长度属性时,都会重新计算值?我的直觉告诉我,由于字符串是固定的,所以它们的长度值存储在某个地方并且只能由包装器访问,但我宁愿确定。

【问题讨论】:

标签: javascript ecma262


【解决方案1】:

按规范,是的(§11.2.1§8.7.1§9.9§15.5.5)。

但这并不意味着实际的实现会在内存中创建字符串对象,这肯定是优化的。

【讨论】:

    【解决方案2】:

    我认为这是真的,当您尝试访问原始 values 的属性时,原始包装器是动态创建的,如下所示:

    "foo".length; // behaves as new String('foo').length
    

    不仅length 是在您尝试访问该属性时计算的,而且还会创建一个全新的对象(该对象是实际包含该属性的对象)。然后立即丢弃包装器。

    如果您担心性能,请不要担心。很少有必须使用原始包装对象的情况,它们的性能似乎比仅使用原始值慢几个数量级(请参阅test)。让解释器关心优化。

    【讨论】:

    • These Mozilla Benchmarks 显示对原始 'foo' 的访问比对大多数属性(包括 length)的对象 new String('foo') 快几个数量级。
    猜你喜欢
    • 2021-09-11
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 2016-06-16
    • 2012-07-02
    相关资源
    最近更新 更多