Javascript:{}vs new Object()性能

Javascript:{}vs new Object()性能,javascript,performance,Javascript,Performance,我想了解为什么两者做相同的事情时性能会有差异 {}的性能可以解释为: {}是Javascript中对象的文字,文字的计算速度更快 另外,文字在代码中占用的空间更少,因此总体文件大小为 小一点 literal代码的最终结果与新的Object()代码相同,但在几乎所有浏览器中执行速度都更快(Firefox 3.5几乎没有任何区别) 随着对象属性和数组项数量的增加,使用文字的好处也随之增加 由于Javascript中的作用域管理机制,对象文本{}的执行速度更快 在执行JavaScript代码时,将创

我想了解为什么两者做相同的事情时性能会有差异


{}的性能可以解释为:

  • {}是Javascript中对象的文字,文字的计算速度更快
  • 另外,文字在代码中占用的空间更少,因此总体文件大小为
    小一点
  • literal代码的最终结果与新的Object()代码相同,但在几乎所有浏览器中执行速度都更快(Firefox 3.5几乎没有任何区别)
  • 随着对象属性和数组项数量的增加,使用文字的好处也随之增加
  • 由于Javascript中的作用域管理机制,对象文本{}的执行速度更快

    在执行JavaScript代码时,将创建一个执行上下文。执行上下文(有时也称为范围)定义执行代码的环境

    在页面加载时创建全局执行上下文,并在执行函数时创建其他执行上下文,最终创建一个执行上下文堆栈,其中最顶层的上下文是活动上下文

    每个执行上下文都有一个与之关联的作用域链,用于标识符解析。作用域链包含一个或多个变量对象,这些对象为执行上下文定义作用域内标识符

    全局执行上下文在其作用域链中只有一个变量对象,该对象定义JavaScript中可用的所有全局变量和函数

    创建(但未执行)函数时,其内部[[Scope]]属性被指定为包含创建该函数的执行上下文的作用域链(无法通过JavaScript访问内部属性,因此无法直接访问该属性)

    稍后,当执行流入函数时,将创建一个激活对象,并使用该对象的值、参数、命名参数和函数本地的任何变量初始化该对象。激活对象首先出现在执行上下文的作用域链中,然后是函数的[[scope]]属性中包含的对象

    在代码执行期间,通过搜索执行上下文的范围链来解析变量和函数名等标识符

    标识符解析从作用域链的前端开始,然后向后进行。考虑下面的代码:

    function Add(n1, n2) {
      this.n1 = n1;
      this.n2 = n2;
      this.val = this.n1 + this.n2;
    }
    
    var result = new Add(5, 10);
    
    执行此代码时,add函数有一个[[Scope]]属性,该属性仅包含全局变量对象

    当执行流入add函数时,将创建一个新的执行上下文,并将包含该上下文、参数、n1和n2的激活对象放入范围链中

    下图“执行上下文和范围链的关系”说明了执行add函数时发生的幕后对象关系

    在add函数内部,当函数执行时,需要解析标识符num1和num2

    通过检查作用域链中的每个对象直到找到特定标识符,可以执行此解析

    搜索从范围链中的第一个对象开始,该对象是包含函数局部变量的激活对象

    如果在那里找不到标识符,将检查作用域链中的下一个对象的标识符。找到标识符后,搜索停止

    在本例中,标识符num1和num2存在于本地激活对象中,因此搜索永远不会继续到全局对象

    理解JavaScript中的作用域和作用域链管理非常重要,因为标识符解析性能与作用域链中要搜索的对象数量直接相关


    标识符存在的范围链越高,搜索持续的时间越长,访问该变量所需的时间也越长;如果没有正确管理作用域,它们可能会对脚本的执行时间产生负面影响。

    一般来说,我认为literal将比构造函数更快。基本上,
    new Object()
    {}
    做更多的事情。这个答案更接近:在与Pilot密切相关的mdn中,请在上面的回答中的性能标题下找到我的更新。{}是文字,在javascript中文字的计算速度更快,但new Object()是对函数Object()的构造函数调用,函数Object()有自己的定义,需要花费相对更多的时间来计算。通过{}创建对象时我们实际上是在声明它,在javascript中,声明是在函数之外首先处理的。嘿,Pilot,你对解释满意吗?这个答案中有一个非常好的观点:--总之,你可以设置一个函数来创建文本符号或构造函数形式的实例。使用文字符号创建实例时,每个实例都携带所有方法,而使用构造函数时,所有实例都引用原型方法。Ie构造函数在创建多个实例时具有更好的内存性能。