• JavaScript中的直接量与初始器的区别


    很多代码优化及公司规范都会提到

    写对象不应该

    var obj = new Object()
    

    而应该

    var obj = {}
    

    写数组不应该

    var arr = new Array()
    

    而应该

    var arr = []
    

    很多书籍《JavaScript高级程序设计》《JavaScript权威指南》也建议使用对象、数组直接量而别使用new方式。这里就引出了直接量(Literals)的概念。 

    ES1(1997.6)规定的直接量有四种:Null、Boolean、Numeric、String

    ES2(1998.8)规定的直接量和ES1相同

    到了ES3(1999.12),则加入了正则表达式直接量(Regular Expression Literals),有5种直接量

    最近的ES5.1(2011.6),也是5种

    以上规范可以看到,ES1到ES5中都没有将对象,数组纳入直接量的概念中。那为什么很多书籍都使用“对象直接量”、“数组直接量”呢?

    实际在ES3,ES5中,对象和数组被归纳到第十一章(表达式)里,有一个新名词称为 初始器(Initialiser)。

    ES3 

    ES5

    为何ES3中将正则对象纳入了直接量,数组和对象怎么没有呢?

    var reg = /abc/g
    var arr = [1, 2, 3]
    var obj = {name: 'John McCarthy'}
    

    以上代码让我们很自然的认为,数组/对象应该和正则一样纳入直接量的概念里。再看下面的代码

    var arr = [obj.a, 0, obj.a+1]
    var obj = {name: 'John' + 'McCarthy'}
    

    可以看到“obj.a”、“obj.a+1” 等都是表达式运算,故而从ES3开始把数组、对象纳入在11章表达式(Exrpessions)里,称为初始器(Initialiser)。

    正则表达式里则不会出现表达式运算,因此放在第7章直接量(Literals)里。

    由于初始器(Initialiser)的称呼晚于一些书籍的出版,《JavaScript权威指南》后续版本如第六版仍然采用 “对象直接量”,“数组直接量” 这样的名词。

      

    最后提一下Undefined,不知ES规范为什么没把Undefined纳入到直接量(Literals)的概念里。

    相关:

    ECMAScript各版本

    JavaScript权威指南(第六版)

  • 相关阅读:
    十天冲刺:第四天
    十天冲刺:第三天
    会议2.3
    会议2.2
    会议2.1
    团队绩效管理
    Alpha版(内部测试版)发布
    意见汇总
    建议汇总
    会议1.10
  • 原文地址:https://www.cnblogs.com/snandy/p/3439790.html
Copyright © 2020-2023  润新知