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轮回