Javascript 如果我想多次访问它的(object';s)属性,我应该将原语转换为object吗?

Javascript 如果我想多次访问它的(object';s)属性,我应该将原语转换为object吗?,javascript,performance,object,primitive,Javascript,Performance,Object,Primitive,例如,假设我有一个名为str的长字符串原语。我知道我可以使用str.substr,因为浏览器在幕后 将str转换为字符串包装器对象,相当于使用newstring(str) 使用步骤1返回的String对象上的正确参数调用substr方法 处置字符串对象 返回步骤2中的字符串(原语) () 但是如果我想多次使用str.substr会发生什么呢?比如说 var positions = [1, 5, 8, 9, 15, ...], //long array substrings = ne

例如,假设我有一个名为
str
的长字符串原语。我知道我可以使用
str.substr
,因为浏览器在幕后

  • str
    转换为字符串包装器对象,相当于使用
    newstring(str)
  • 使用步骤1返回的
    String
    对象上的正确参数调用
    substr
    方法
  • 处置
    字符串
    对象
  • 返回步骤2中的字符串(原语)
  • ()

    但是如果我想多次使用
    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
    转换为一个对象,以避免在每个步骤中创建和销毁一个对象?

    有一篇博客专门讨论这个问题

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

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

    例如,在SpiderMonkey JS引擎中,处理 使用“get property”操作时,如下所示:

    因此,当您请求字符串原语的属性时 属性名为“length”,引擎立即返回其 长度,避免完整属性查找和临时属性查找 包装器对象创建

    结论如下:

    基于上述基准,我们看到了许多方法 关于字符串声明中的细微差异如何产生 一系列不同的性能结果。建议您 继续像往常一样声明字符串变量,除非 创建的实例有一个非常具体的原因 字符串对象。另外,请注意浏览器的总体性能, 特别是在处理DOM时,它不仅基于 页面的JS性能;浏览器中的内容远不止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);