#第4章 表达式和运算符
- <a href="#no1">4.1 原始表达式</a>
- <a href="#no2">4.2 对象和数组的初始化表达式</a>
- <a href="#no3">4.3 函数定义表达式</a>
- <a href="#no4">4.4 属性访问表达式</a>
- <a href="#no5">4.5 调用表达式</a>
- <a href="#no6">4.6 对象创建表达式</a>
- <a href="#no7">4.7 运算符概述</a>
- <a href="#no8">4.8 算术表达式</a>
- <a href="#no9">4.9 关系表达式</a>
- <a href="#no10">4.10 逻辑表达式</a>
- <a href="#no11">4.11 赋值表达式</a>
- <a href="#no12">4.12 表达式计算</a>
- <a href="#no13">4.13 其他运算符</a>
**表达式是JS中的一个短语。JS解释器会将其计算出一个结果。**
##<a name="no1">4.1 原始表达式</a>
> 原是表达式是表达式的最小单位——它们不再包含其他表达式。JS中原始表达式包含常量或直接量、关键字和变量。
##<a name="no2">4.2 对象和数组的初始化表达式</a>
> 对象和数组初始化表达式实际上是一个新建的对象和数组。这些初始化表达式有时称做“对象直接量”和“数组直接量”。它们不是原是表达式,因为它们所包含的成员或者元素都是子表达式。
##<a name="no3">4.3 函数定义表达式</a>
> 函数定义表达式定义一个JS函数。表达式的值是这个新定义的函数。
##<a name="no4">4.4 属性访问表达式</a>
> 属性访问表达式运算得到一个对象属性或一个数组元素的值。JS为属性访问定义了两种语法:
1. exoression.indentifier
2. expression[expression]
第一种方法写法更加简单,只适用于要访问的属性名称是合法的标识符,并且需要知道要访问的属性的名字。
##<a name="no5">4.5 调用表达式</a>
> JS中的调用表达式是一种调用(或者执行)函数或方法的语法表示。它以一个函数表达式开始,这个函数表达式指代了要调用的函数。函数表达式后跟随一对圆括号,括号内是一个以逗号隔开的参数列表。
##<a name="no6">4.6 对象创建表达式</a>
> 对象创建表达式创建一个对象并调用一个函数(这个函数称作构造函数)初始化新对象的属性。前面有一个关键字`new`。
##<a name="no7">4.7 运算符概述</a>
> JS中运算符用于算术表达式、比较表达式、逻辑表达式、赋值表达式等。
###4.7.1 操作数的个数
略
###4.7.2 操作数类型和结果类型
略
###4.7.3 左值
> 表达式只能出现在赋值运算符的左侧。在JS中,变量、对象属性和数组元素均是左值。
###4.7.4 运算符的副作用
略
###4.7.5 运算符优先级
> 《JavaScript权威指南-第六版》P66按照优先级从高到底排序。
###4.7.6 运算符的结合性
> 结合性指定了在多个具有同样优先级的运算符表达式中的运算顺序。
###4.7.7 运算顺序
> JS中严格按照从左到右的顺序来计算表达式。
##<a name="no8">4.8 算术表达式</a>
基本的算术运算符:
1. `*`(乘法)
2. `/`(除法)
3. `%`(求余)
4. `+`(加法)
5. `-`(减法)
###4.8.1 “+”运算符
> 二元加法运算符“+”可以对两个数字做加法,也可以做字符串连接操作。
###4.8.2 一元算术运算符
> 一元算术运算符作用于一个单独的操作数,并产生一个新值。
###4.8.3 位运算符
> 位运算符可以对由数字表示的二进制数据进行更低层级的按位运算。(`& 、 | 、 ^ 、 ~ 、 << 、 >> 、 >>>`)
##<a name="no9">4.9 关系表达式</a>
> 关系运算符用于测试两个值之间的关系,根据关系是否存在而返回`true`或`false`。关系表达式总是返回一个布尔值。
###4.9.1 相等和不想等运算符
> `==`和`===`运算符用于比较两个值是否相等。
> `!=`和`!==`与前面两个相反。
> 它们之间的区别略。
###4.9.2 比较运算符
> 比较运算符用来检测两个操作数的大小关系(数值大小或者字母表的顺序)。返回结果为布尔值。
1. `<`(小于)
2. `>`(大于)
3. `<=`(小于等于)
4. `>=`(大于等于)
###4.9.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()方法
###4.9.4 instanceof运算符
> `instanceof`运算符希望左操作数是一个对象,右操作数标识对象的类。如果左侧的对象是右侧类的实例,则表达式返回`true`;否则返回`false`。
例如:
var d = new Date();
d instanceof Datel //=> true,d是由Date()创建的
d instanceof Object //=> true
d instanceof Number //=> false
##<a name="no10">4.10 逻辑表达式</a>
- `&&`
- `||`
- `!`
###4.10.1 逻辑与(`&&`)
> `&&`对两个值执行布尔与(AND)操作,只有在第一个操作数和第二个操作数均为`true`时,它才返回`true`。如果其中一个操作数是`false`,它返回`false`。
###4.10.2 逻辑或(`||`)
> `||`运算符对两个操作数做布尔或(OR)操作。如果其中一个或者两个操作数是真值,它返回一个真值。如果两个操作数都是假值,它返回一个假值。
###4.10.3 逻辑非(`!`)
> `!`运算符是一元运算符。它防止在一个单独的操作数之前。它的目的是将操作数的布尔值进行求反。
##<a name="no11">4.11 赋值表达式</a>
> JS使用`=`运算符来给变量或者属性赋值。
##<a name="no12">4.12 表达式计算</a>
> JS可以解释运行由JS源代码组成的字符串,并产生一个值。JS通过全局函数`eval()`来完成这个工作。
eval('3+2'); //=> 5
###4.12.1 eval()
> `eval()`只有一个参数。如果传入的参数不是字符串,它直接返回这个参数。如果是字符串,它会当成JS代码进行编译,编译失败则抛出语法错误异常。如果编译程刚,则开始执行这段代码,并返回字符串中的最后一个表达式或语句的值,如果最后一个表达式或语句没有值,则最终返回`undefined`。
###4.12.2 全局`eval()`
略(P85)
###4.12.3 严格`eval()`
略(P86)
##<a name="no13">4.13 其他运算符</a>
###4.13.1 条件运算符(?;)
> 条件运算符是JS中唯一一个三元运算符。条件运算符的操作数可以是任意类型。第一个操作数当成布尔值,如果它是真值,那么将计算第二个操作数,并返回其计算结果。否则,将计算第三个操作数,并返回其计算结果。第二个和第三个操作俗话总是会计算其中之一,不可能两者同时执行。
###4.13.2 typeof 运算符
> `typeof`是一元运算符,放在其单个操作数的前面,操作数可以是任意类型。返回值为表示操作数类型的一个字符串。
###4.13.3 delete运算符
> `delete`是一元操作符,它用来删除对象属性或者数组元素。它是用来做删除操作的,不是用来返回一个值的。
###4.13.4 void运算符
> `void`是一元运算符,它出现在操作数之前,操作数可以是任意类型。不是很常用。。。。
###4.13.5 逗号运算符(,)
> 逗号运算符是二元运算符,它的操作数可以是任意类型。它首先计算左操作数,然后计算右操作数,最后返回右操作数的值。
例:
i=0, j=1, k=2;
计算结果是2,它和下面的代码基本上是等价的:
i=0; j=1; k=2;
**整章到P90完结**