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

写对象不应该

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. 线段树 + 矩阵 --- ZOJ 3772 Calculate the Function

    Calculate the Function Problem's Link:   http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCod ...

  2. 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符

    [源码下载] 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 ...

  3. 回文串---Palindrome

    POJ   3974 Description Andy the smart computer science student was attending an algorithms class whe ...

  4. .NET Core创建一个控制台(Console)程序

    .NET Core版本:1.0.0-rc2 Visual Studio版本:Microsoft Visual Studio Community 2015 Update 2 开发及运行平台:Window ...

  5. 初识你---------Swift【下篇】

    Swift中的结构体 Swift的结构体对比OC来说,可以添加初始化方法.可以遵守代理协议等,同时:Swift的Bool类型的变量也是一个结构体,所以只能选择true和false. Swift中声明结 ...

  6. mongodb c#语法基础

    这里采用的是mongoDB官网推荐使用.net驱动: http://mongodb.github.io/mongo-csharp-driver/2.0/getting_started/quick_to ...

  7. DOM应用实例(寻找房祖名)

    在上一篇我讲到了DOM的一些总结,这一次我就用我前几天做的一个游戏demo来讲讲DOM的一些用法吧. 首先简单说说这个游戏,如下图所示(大家忽略样式/(ㄒoㄒ)/~~).当玩家点击开始后,只要选择了正 ...

  8. SharePoint 2013 设置自定义布局页

    在SharePoint中,我们经常需要自定义登陆页面.错误页面.拒绝访问等:不知道大家如何操作,以前自己经常在原来页面改或者跳转,其实SharePoint为我们提供了PowerShell命令,来修改这 ...

  9. linq 动态组合条件

    http://www.albahari.com/nutshell/predicatebuilder.aspx Dynamically Composing Expression Predicates S ...

  10. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q77-Q80)

    Question 77You have a SharePoint list named Announcements.You have an event receiver that contains t ...