表达式
原始表达式
原始表达式是表达式的最小单位,它们不再包含其他表达式。
- 数字直接量
- 字符串直接量
- 正则表达式直接量
- 一些保留字
- 变量
对象和数组的初始化表达式
对象和数组的初始化表达式实际上是一个新创建的对象和数组。
数组初始化表达式是通过一对方括号和其内由逗号隔开的列表构成的。初始化的结果是一个新创建的数组。
[1, 2, 3] //一个拥有三个元素的数组
[[1, 2], [2, 3], [3, 4]] //一个拥有三个元素的数组,每个元素是一个数组(可嵌套)
对数组初始化表达式进行求值的时候,数组初始化表达式中的元素表达式也都会各自计算一次,所以,数组初始化表达式每次计算的值有可能是不同的。(?)
数组直接量中的列表逗号之间的元素可以省略,这时省略的空位会填充undefined。
var sparseArray = [1, , , , 5]; //这个数组有5个元素,其中三个是undefined
对象初始化表达式和数组初始化表达式非常类似,只是方括号被花括号代替,并且每个子表达式都包含一个属性名和一个冒号作为前缀。
var p = {x: 2, y: 3}; //一个拥有两个属性成员的对象
var rectangle = {upperleft: {x: 2, y: 3}, lowerright: {x: 4, y: 5}}; //包含两个对象的对象(可嵌套)
对象直接量中的属性名称可以是字符串而不是标识符。
var rectangle = {"upperleft": {x: 2, y: 3}, "lowerright": {x: 4, y: 5}};
函数定义表达式
函数定义表达式定义一个JavaScript函数,表达式的值是这个新定义的函数。
一个典型的函数定义表达式包含关键字function,跟随其后是一对圆括号,括号内是一个以逗号分割的列表,列表包含有0个或多个标识符(参数名),然后再跟随一个由花括号包裹的JavaScript代码段(函数体)。
var square = function(x) {return x*x;}
属性访问表达式
属性访问表达式运算得到一个对象属性或一个数组元素的值。
//两种语法都是合法的
expression.identifier
expression[expression]
如果属性名称是一个保留字或者包含空格和标点符号,或是一个数字(对于数组来说),则必须使用方括号的写法。当属性名是通过运算得出的值而不是固定的值的时候,这时必须使用方括号写法。
调用表达式
以一个函数表达式开始,这个函数表达式知道了要调用的函数。函数表达式后跟随一对圆括号,括号内是一个以逗号隔开的参数列表。
f(0) //f是一个函数表达式,0是一个参数表达式
如果这个表达式是一个属性访问表达式,那么这个调用被称为“方法调用”。
对象创建表达式
对象创建表达式(object creation expression)创建一个对象并调用一个函数(这个函数称为构造函数)初始化新对象的属性。对象创建表达式和函数调用表达式非常类似,只是对象创建表达式之前多了一个关键字new。
new Object() //不传入参数,空括号可以省略
new Point(2,3)
那些被当成构造函数的函数不会返回一个值,并且这个新创建并被初始化后的对象就是整个对象创建表达式的值。如果一个构造函数确实返回了一个对象值,那么这个对象就作为整个对象表达式的值,而新创建的对象就废弃了。
运算符
in运算符
in运算符希望它的左操作数是一个字符串或可以转换为字符串,希望它的右操作数是一个对象。
如果右侧的对象拥有一个名为左操作数值的属性名,那么表达式返回true。
//对象
var point = {x: 1, y: 1};
"x" in point //返回true,对象中有一个名为"x"的属性
"z" in point //返回false,对象中不存在名为"z"的属性
"toString" in point //返回true,对象继承了toString()方法
//数组
var data = [7, 8, 9];
"0" in data //返回true,因为data["0"]存在
1 in data //返回true,因为data[1]存在
3 in data //返回false,因为data[3]不存在
instanceof运算符
instanceof操作符希望左操作数是一个对象,右操作数标识对象的类。如果左侧的对象是右侧类的实例,则表达式返回true,否则返回false。
var d = new Date(); //通过Date()构造函数来创建一个新对象
d instanceof Date; //计算结果为true,d是由Date()创建的
d instanceof Object; //计算结果为true,所有对象都是Object的实例
d instanceof Number; //false,d不是一个Number对象
var a = [1, 2, 3]; //通过数组直接量的写法创建一个数组
a instanceof Array; //true,a是一个数组
a instanceof Object; //true,所有的数组都是对象
a instanceof RegExp; //false,数组不是正则表达式
typeof运算符
typeof是一元运算符,放在其单个操作数前面,操作数可以是任意类型。返回值为表示操作数类型的一个字符串。
delete运算符
delete是一元运算符,它用来删除对象属性或者数组元素。delete也是具有副作用的,它是用来做删除操作的,不是用来返回一个值的。
var o = {x: 1, y: 2};
delete o.x; //删除一个属性
"x" in o //false,这个属性在对象中不再存在
var a = [1, 2, 3];
delete a[2]; //删除最后一个数组元素
2 in a; //false,元素2在数组中已经不存在了
a.length //返回3,数组长度并没有改变,尽管删除了这个元素,但是留下了一个“洞”
然而并不是所有的属性都是可删除的,一些内置核心和客户端属性是不能删除的,用户通过var语句声明的变量不能删除。同样,通过function语句定义的函数和函数参数也不能删除。