1 原始表达式
直接量、保留字、变量
原始表达式(primary expression):表达式的最小单位
表达式:JavaScript中的短语,JavaScript解释器会将其计算为一个结果
2 对象和数据的初始化表达式
对象直接量和数组直接量,它们和布尔直接量不同,它们不是原始表达式
3 函数定义表达式
函数直接量也不是原始表达式
4 属性访问表达式
语法:
expression . identifier
expression [ expression ]
5 调用表达式
调用表达式(invocation expression):调用或者执行函数或方法的语法表示
方法调用(method invocation):如果这个表达式是一个属性访问表达式,那么这个调用称做“方法调用”
6 对象创建表达式
对象创建表达式(object creation expression):创建一个对象并调用一个构造函数初始化新对象的属性:
var obj = new Object(); //比函数调用表达式多了一个new操作符
Object();
7 运算符概述
7.1 操作数的个数
一元运算符(unary operator):将一个表达式转换为另一个复杂的表达式
二元运算符(binary operator):将两个表达式合并成一个复杂的表达式
三元运算符(ternary operator):条件判断运算符
?
7.2 左值
左值(lvalue):表达式只能出现在赋值运算符的左侧
7.3 运算符优先级
要注意的是,属性访问表达式和调用表达式的优先级非常高,当:typeof my.functions[x](y)
,尽管typeof是优先级最高的运算符之一,但typeof也是在两次属性访问和函数调用之后执行的
8 算数表达式
8.1 “+”运算符
有些时候要进行必要的转换:
var obj = {
toString: function() {
return "object";
}
};
console.log("hello " + obj); //hello object
var obj = {};
console.log("hello " + obj); //hello [object Object]
console.log(1 + null); //1
console.log(1 + undefined); //NaN
8.2 一元算数运算符
+
、-
是一元运算符,也是二元运算符
9 关系表达式
9.1 相等和不等运算符
如果两个引用值指向同一个对象、数组或函数,则它们是相等的
9.2 比较运算符
大写的ASCⅡ字幕都“小于”小写的ASCⅡ字幕;
加号运算符和比较运算符的行为不同,前者更偏爱字符串,如果其中一个操作数是字符串,则进行字符串连接;比较运算符则更偏爱数字,只有两个操作数都是字符串,才会进行字符串比较
当其中一个操作数是或能转成NaN的时候,比较运算符均返回false:
console.log("12" < NaN); //False;
console.log("12" > NaN); //False;
9.3 in运算符
左操作数是字符串或能够转换成字符串,右操作数则是对象
9.4 instanceof运算符
左操作数是对象,右操作数是标识对象的类
10 逻辑表达式
10.1 逻辑与(&&)
建议“&&”仅用来对真值和假值做布尔计算
10.2 逻辑或(||)
最常用的方式是从一组备选表达式中选出第一个真值表达式:var body = body || document.body;
function obj(p) {
p = p || {};
return p;
}
console.log(obj().toString()); //[oject Object]
console.log(obj({
toString: function() {
return "Oli";
}
}).toString()); //Oli
10.3 逻辑非(!)
“!”运算符首先将其操作数转换为布尔值,然后再对布尔值求反
11 赋值表达式
一次性对多个变量赋值:
var x, y, z;
x=y=z=10;
console.log(x+y+z); //30
12 表达式计算
12.1 eval()
它使用了调用它的变量作用域环境
12.2 全局eval()
直接调用eval()时,它总是在调用它的上下文作用域内执行。其他的间接调用则使用全局对象作为其上下文作用域,并且无法读写、定义局部变量和函数:
var geval = eval;
var x = "global",
y = "global";
function f() {
var x = "local";
eval("x += 'changed'"); //直接调用eval
return x;
}
console.log(f(), x); //localchanged global;
function g() {
var y = "local";
geval("y += 'changed'"); //间接调用eval
return y;
}
console.log(g(), y); //local globalchanged;
12.3 严格eval()
ECMAScript5在严格模式下,eval执行的代码段可以查询或更改局部变量,但不能在局部作用域中定义新的变量或函数;
此外,严格模式将“eval”列为保留字,不能用一个别名覆盖eval()函数(运算符)
// "use strict";
function f () {
eval("var x = 10");
console.log(x);
}
f(); //10
"use strict";
function f () {
eval("var x = 10");
console.log(x);
}
f(); //x is not defined
13 其他运算符
13.1 条件运算符(?:)
条件运算符中唯一一个三元运算符(三个操作数)
常用做法是:
var username;
var name = username ? username : "Oliver";
console.log(name); //"Oliver"
13.2 typeof运算符
最常用的做法是:
var value = 123;
var value = "hello";
console.log((typeof value === "string") ? "'" + value + "'" : value); //123 //'hello'
在IE9之前的版本中,非原生可执行对象的typeof运算将返回“object”
13.3 delete运算符
delete是一元操作符,它用来删除对象属性或者数组元素
13.4 void运算符
void让浏览器不必显示这个表达式的计算结果:
<a href="javascript: void window.open()">hello there</a>
以上代码不推荐,应该绑定一个事件处理程序
13.5 逗号运算符(,)
最常用于for循环
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。