1

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循环


JS菌
6.4k 声望2k 粉丝