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

写对象不应该

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权威指南(第六版)

JavaScript中的直接量与初始器的区别的更多相关文章

  1. javascript中对象字面量的理解

    javascript中对象字面量与数组字面量 第一部分 我们知道JavaScript中的数据类型有基本数据类型和引用类型,其中Object类型就是非常常用的类型.那么如果创建一个Object类型的实例 ...

  2. JavaScript中的Get和Set访问器

    今天要和大家分享的是JavaScript中的Get和Set访问器,和C#中的访问器非常相似. 标准的Get和Set访问器的实现   function Field(val){       this.va ...

  3. JavaScript中querySelector()和getElementById()(getXXXByXX)的区别

    在日常开发中,使用JavaScript获取元素的时候,最常用的方法就是document.getElementById(getXXXByXX)方法.但是最近发现有很多地方使用的是querySelecto ...

  4. JavaScript 中定义变量时有无var声明的区别

    关于JavaScript中定义变量时有无var声明的区别 var a=5; //正确 a=5; //正确 在javascript中,以上两种方法都是定义变量的正确方法.微软的Script56.CHM中 ...

  5. javascript中对象字面量与数组字面量

    第一部分 我们知道JavaScript中的数据类型有基本数据类型和引用类型,其中Object类型就是非常常用的类型.那么如果创建一个Object类型的实例呢?下面我介绍两种方法: 第一:构造函数法. ...

  6. JavaScript中instanceof与typeof运算符的用法及区别详细解析

    JavaScript中的instanceof和typeof常被用来判断一个变量是什么类型的(实例),但它们的使用还是有区别的: typeof 运算符 返回一个用来表示表达式的数据类型的字符串. typ ...

  7. javaScript中的return,break,continue的区别

    导语: javaScript中有三种方法可以跳出循环或者终止循环.分别为break.return.continue. 正文: 一.break break 会使得整个程序终止执行或者包含了最内层的循环或 ...

  8. JavaScript中的三种弹出框的区别与使用

    JavaScript中有三种原生的弹出框,分别是alert.confirm.prompt.分别表示弹出框.确认框.信息框. 以下是示例代码: <!DOCTYPE html> <htm ...

  9. javascript中的this在不同场景下的区别

    javascript在初版的设计上存在失误,导致了这门语言在使用时,经验型写法并不能得到像其它几个流行语言一样预期.其中的this的使用就是一个典型. this在javascript中是由解释器注入的 ...

随机推荐

  1. struts.xml中出现Package struts2 extends undefined package struts-default解决办法

    在struts.xml中出现extends undefined package struts-default,经过查阅资料原来是因为没有联网的缘故.这样解决:在myeclipse中关联本地的dtd文件 ...

  2. ADO.NET学习系列(三)----做一个登录案例

    总体思路.根据用户输入的用户名和密码,来判断,和数据库里面存的是不是一样,如果一样就表明登录成功,否则就登录失败. 方案一: 1.select* from 表名 where username=&quo ...

  3. Orleans 之 监控工具的使用

    这一节,我们来说说orleans 中的几个实用工具,OrleansHost.OrleansCounterControl.OrleansManager.ClientGenerator. 1.Orlean ...

  4. Winform里面的缓存使用

    缓存在很多情况下需要用到,合理利用缓存可以一方面可以提高程序的响应速度,同时可以减少对特定资源访问的压力.本文主要针对自己在Winform方面的缓存使用做一个引导性的介绍,希望大家能够从中了解一些缓存 ...

  5. Java集合框架之Collection接口

    Java是一门面向对象的语言,那么我们写程序的时候最经常操作的便是对象了,为此,Java提供了一些专门用来处理对象的类库,这些类库的集合我们称之为集合框架.Java集合工具包位于Java.util包下 ...

  6. [moka同学笔记]yii2.0缓存

    1.控制器中CacheDemoController.php <?php /** * Created by PhpStorm. * User: moka同学 * Date: 2016/06/29 ...

  7. linux下socket编程

    相关结构 //下边这两个结构定义在<sys/types.h>里 //一般的地址结构,只能用于覆盖(把其他地址转换为此类型),且只能引用该地址的sa_family字段 struct sock ...

  8. 我的Machine Learning学习之路

    从2016年年初,开始用python写一个简单的爬虫,帮我收集一些数据. 6月份,开始学习Machine Learning的相关知识. 9月开始学习Spark和Scala. 现在想,整理一下思路. 先 ...

  9. Android 手机卫士16--手机杀毒

    1.指定动画一直旋转 rotateAnimation.setRepeatCount(RotateAnimation.INFINITE); android:repeatCount 重复的次数,默认为0, ...

  10. 六个字符,带你领略JavaScript (js的艺术编写)

    正文从这开始- JavaScript是一门神奇且奇妙的编程语言,我们有时候用它来写一些看似疯狂的代码,但这些代码依然可被执行且运行结果十分有趣.JavaScript 试图帮助我们将一些数据类型转化为我 ...