0

例如,假设我有一个名为str. 我知道我可以使用str.substr,因为浏览器,在幕后,

  1. 转换str成字符串包装对象,相当于使用new String(str)
  2. 使用步骤 1 返回substr的对象上的正确参数调用方法String
  3. String对象的处置
  4. 从步骤 2 返回字符串(原始)。

https://stackoverflow.com/a/9110389/1529630

但是如果我想str.substr多次使用会发生什么?例如

var positions = [1, 5, 8, 9, 15, ...],    //long array
    substrings = new Array(positions.length);

for ( var i = positions.length - 1;  i >= 0;  --i ) {
    substrings[i] = str.substr(positions[i], 2);
}

我是否应该str在该循环之前转换为对象以避免在每一步都创建和销毁对象?

4

1 回答 1

1

这里有一个专门讨论这个问题的博客条目。

简而言之,由于大多数 JS 引擎进行了优化,大多数情况下使用原始值更快。但是,当访问原语上的非本地成员时,情况可能并非如此。

例如,我们可以在文章中读到:

例如,在 SpiderMonkey JS 引擎中,处理“获取属性”操作的伪代码如下所示:

  // direct check for the "length" property
  if (typeof(value) == "string" && property == "length") {
    return StringLength(value);
  }
  // generalized code form for properties
  object = ToObject(value);
  return InternalGetProperty(object, property);

因此,当您请求字符串原语的属性,并且属性名称为“length”时,引擎会立即返回其长度,从而避免了完整的属性查找以及临时包装对象的创建。

这是结论:

基于上述基准,我们已经看到了许多关于我们的字符串声明中的细微差别如何产生一系列不同的性能结果的方法。建议您像往常一样继续声明您的字符串变量,除非有非常具体的原因需要您创建字符串对象的实例。另外,请注意浏览器的整体性能,尤其是在处理 DOM 时,不仅取决于页面的 JS 性能;浏览器中的内容比它的 JS 引擎要多得多。

于 2013-08-26T20:27:01.260 回答