解释器根据表达式计算出结果。
原始表达式
- 常量
数值(123),字符串(’abc’),正则表达式(/pattern/)
- 保留字
true, false, null, this…等更多保留字 - 变量
i; // 一个 i 变量
undefined 不是保留字,是全局变量初始化表达式
- 对象初始化(花括号包含元素,逗号隔开)
每个子表达式都包含一个属性名和一个冒号作为前缀- 空对象
{}
- 两个元素的对象
{a:1, b:2}
- 嵌套对象
{a:{a:1}, b:{b:2}}
- 空对象
- 数组初始化(中括号包含值,值用逗号隔开)
- 空数组
[]
- 给定起始值
[1,2]
- 嵌套数组,二维数组
[[11,22],[33,44]]
- 省略中间值,中间未给定的值结果为 undefined
[1,,,,2]
- 空数组
函数表达式
函数表达式与函数声明有所不同。
函数表达式要先定义才能使用,这样的函数也是匿名函数。
1 | var say = function() { |
函数声明的函数可以直接调用,在代码执行之前就会读取函数的声明
1 | say(); |
对象创建表达式
内置构造函数创建对象,括号里可以传入不同的参数(数值,字符串,布尔值)
1
var obj = new Object()
字面量创建对象。当参数不稳定时,建议使用字面量来创建对象(原因不详)。
1
var obj = {a:1};
自定义构造函数创建对象
如果没有指定的 return 对象,默认 return this,不需要明写,返回的必须是对象,如果不是,返回值将会被忽略,跟默认返回一样1
2
3
4
5
6var Person = function (name){
this.name = name;
// return this;
};
var obj = new Person('zhu');
console.log(obj.name);自定义构造函数看起来跟普通函数一样,如果在创建对象时,没有使用 new 就直接调用了,虽然没有报错,却也得不到自己要的结果,因为此时构造函数里的 this 指向的是全局的 window 对象,使用 window.xxx 即可查看到相应的值。
顺便提一下,数组的创建,可以通过 new Array() 或者字面量来创建,一般采取字面量来创建,方便简洁,并且不容易出错。注意的一点是 Array() 参数为 一个数值 时,代表的是数组的长度,字面量可以直接赋予第一个的值,这也意味着如果 Array() 参数传递的是一个浮点型的值,将会出错。1
2
3
4var arr = new Array(2);
console.log(arr[0]) // undefined
var arr = [2];
console.log(arr[0]) // 2
属性访问表达式
点号表示法只适用于当访问的属性名称是合法的标识符且知道要访问的属性名字时,如果属性名是通过求值得到、或包含空格、或为数值、或为保留字,此时应该使用方括号表示法