Javascript高级程序设计Ch3-5
基本概念
3.5操作符
1 一元操作符
只能操作一个值得操作符叫做一元操作符。
递增和递减操作符
++和–; 分前置和后置的区别(即递增和递减操作是在包含它们的语句被求值之前还是之后执行的)
递增和递减操作符不仅适用于整数,还可以用于字符串、布尔值、浮点数值和对象。在应用于不同的值时,遵循如下规则:- 在应用于一个包含有效数字字符字符的字符串时,先将其转换为数字值,再执行加减 1 的操作。字符串变量变成数值变量。
- 在应用于一个不包含有效数字字符的字符串时,将变量的值设置为 NaN。字符串变量变成数值变量。
- 在应用于布尔值 false 时,先将其转换为 0 再执行加减 1 的操作。布尔值变量变成数值变量。
- 在应用于布尔值 true 时,先将其转换为 1 再执行加减 1 的操作。布尔值变量变成数值变量。
- 在应用于浮点数值时,执行加减 1 的操作。
- 在应用于对象时,先调用对象的 valueOf()方法以取得一个可供操作的值。然后对该值应用前述规则。如果是 NaN,则在调用 toString()方法后再应用前述规则。对象变量变成数值变量。
一元加减操作符 += -=的应用
2 位操作符
二进制补码(负数用二进制码储存的时候格式为二进制补码)
计算步骤:- 1 求这个数值绝对值的二进制码;
- 2 求二进制反码,即将 0 替换为 1, 将 1 替换为0;
- 3 得到的二进制反码加 1;
以二进制字符串形式输出一个负数时,我们看到的只是这个负数绝对值的二进制码前面加上一个负号。
- 位操作:
- 按位非(NOT) 用 波浪线 ~ 表示,执行按位非的结果就是返回数值的反码
- 按位与(AND) 用 和号字符 & 表示, 都是 1 才为 1。
- 按位或(OR) 用 竖线负号 | 表示, 有 1 则为 1。
- 按位异或(XOR) 用 插入符号 ^ 表示, 不同为 1。
- 左移 用 两个小于号 << 表示,二进制码左移。
- 有符号右移 用 两个大于号 >> 表示, 数字转换为二进制(或二进制补码)右移,保留符号位,填充符号位,返回十进制。
- 无符号右移 用 三个大于号 >>> 表示, 符号位全动,用 0 填充, 对负数有影响。
3 布尔操作符
非(NOT)与(AND)或(OR)
- 逻辑非 由一个 叹号 ! 表示,可应用于任何值。
- 如果操作数是一个对象,返回 false;
- 如果操作数是一个空字符串,返回 true;
- 如果操作数是一个非空字符串,返回 false;
- 如果操作数是数值 0,返回 true;
- 如果操作数是任意非 0 数值(包括 Infinity),返回 false;
- 如果操作数是 null,返回 true;
- 如果操作数是 NaN,返回 true;
- 如果操作数是 undefined,返回 true。
连续使用两个逻辑非,则会使其等效于 Boolean() 转型函数的行为,第一个逻辑非操作会基于无论什么操作数返回一个布尔值,第二个逻辑非操作则对该布尔值求反,于是得到了这个只正真对应的布尔值。
- 逻辑与 由 两个和号 (&&) 表示,有两个操作数
其真值表如下:
第一个操作数 | 第二个操作数 | 结果 |
---|---|---|
true | true | true |
true | false | false |
false | true | false |
false | false | false |
逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值。再有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值;此时遵循以下规则:
- 如果第一个操作数是对象,则返回第二个操作数;
- 如果第二个操作数是对象,则只有在第一个操作数的求值结果为 true 的情况下才会返回该对象;
- 如果两个操作数都是对象,则返回第二个操作数;
- 如果有一个操作数是 null,则返回 null;
- 如果有一个操作数是 NaN,则返回 NaN;
- 如果有一个操作数是 undefined,则返回 undefined。
逻辑与属于短路操作,如果第一个操作能够决定结果,那么就不会在对第二个操作数求值。
如果第一个是 false(null,NaN,undefined), 则无论第二个是什么,都会返回 false(null,NaN,undefined)
- 逻辑或 由两个竖线符号 ( || ) 表示,有两个操作数
其真值表如下:
第一个操作数 | 第二个操作数 | 结果 |
---|---|---|
true | true | true |
true | false | true |
false | true | true |
false | false | false |
和逻辑与差不多,如果有一个操作数不是布尔值,结果不一定返回布尔值;此时遵循以下规则:
- 如果第一个操作数是对象,则返回第一个操作数;
- 如果第一个操作数的求值结果为 false,则返回第二个操作数;
- 如果两个操作数都是对象,则返回第一个操作数;
- 如果两个操作数都是 null,才返回 null;
- 如果两个操作数都是 NaN,才返回 NaN;
- 如果两个操作数都是 undefined,才返回 undefined。
和逻辑与类似,逻辑或操作符也是短路操作,如果第一个操作数的求值结果是 true,就不会对第二操作数求值。
我们利用逻辑或的这一行为,来避免为变量赋 null 或 undefined值!
例如:
var myObject = preferredObject || backupObject;
如果第一个不为 null 和 undefined,则优先赋 preferredObject 给 myObject,如果 preferredObject 中不包含有效值(null、undefined等)则将 backupObject作为后备值赋给 myObject。
4 乘性操作符
乘法
由一个星号(*)表示,遵循如下规则:- 如果操作数都是数值,按常规来;
- 如果有一个操作数是 NaN,则为 NaN;
- 如果是 Infinity 与 0 相乘,则为NaN;
- 如果是 Infinity 与非 0 数值相乘,则为Infinity或-Infinity;
- 如果是 Infinity 与 Infinity 相乘,结果依然为Infinity;
- 如果有一个操作数不是数值,则在后台调用 Number()将其转换为数值,再用上面的规则计算。
除法
由一个斜线符号(/)表示,遵循如下规则:- 如果都是数值,按常规来;
- 如果有一个操作数是 NaN,则为 NaN;
- 如果是 Infinity 被 Infinity 除,则为NaN;
- 如果是 0 被 0 除,则为 NaN;
- 如果是非 0 的有限数被 0 除,结果为 Infinity 或 -Infinity;
- 如果是 Infinity 被任何非 0 数除,则结果为 Infinity 或 -Infinity;
- 如果有一个操作数不是数值,则在后台调用 Number()将其转换为数值,再用上面的规则计算。
求模
由一个百分号(%)表示,遵循如下规则:- 如果都是数值,先算除法,返回余数;
- 如果被除数是无穷大值而除数是有限大的数值,则结果为 NaN;
- 如果被除数是有限大的数值而除数是 0 ,则结果为 NaN;
- 如果是 Infinity 被 Infinity 除,则为NaN;
- 如果被除数是有限大的数值而除数是无穷大的数值,则结果是被除数;
- 如果被除数是 0,则结果是 0;
- 如果有一个操作数不是数值,则在后台调用 Number()将其转换为数值,再用上面的规则计算。
5 加性操作符
加法
用加号(+)表示,遵循如下规则:- 如果有一个操作数是 NaN,则结果为 NaN;
- 如果是 Infinity 加 Infinity,则结果为 Infinity;
- 如果是 -Infinity 加 -Infinity,则结果为 -Infinity;
- 如果是 Infinity 加 -Infinity,则结果为 NaN;
- 如果是 +0 加 +0,则结果为 +0;
- 如果是 -0 加 -0,则结果为 -0;
- 如果是 +0 加 -0,则结果为 +0;
- 如果两个操作数都是字符串,则拼接;
- 如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后拼接。
如果有一个操作数是对象、数值或布尔值,则调用 toString()方法取得相应的字符串的值,对于 undefined和null调用 String()取得字符串 “undefined” 和 “null”。
- 减法
用减号(-)表示,遵循如下规则:
- 如果两个操作数都是数值,按常规来;
- 如果有一个操作数是 NaN,则结果为 NaN;
- 如果是 Infinity 减 Infinity,则结果为 NaN;
- 如果是 -Infinity 减 -Infinity,则结果为 NaN;
- 如果是 Infinity 减 -Infinity,则结果为 Infinity;
- 如果是 -Infinity 减 Infinity,则结果为 -Infinity;
- 如果是 +0 减 +0,则结果为 +0;
- 如果是 +0 减 -0,则结果为 +0;
- 如果是 -0 加 -0,则结果为 +0;
- 如果有一个操作数是字符串、布尔值、null 或 undefined,则现在后台调用 Number() 函数,再执行;
- 如果有一个操作数是对象,则调用对象的 valueOf() 方法取得表示该对象的数值。
6 关系操作符
小于(<)、大于(>)、小于等于(<=)和大于等于(>=),规则就是正常数学规则,比较大小,返回布尔值。
当关系操作符的操作数使用了非数值时,以下为相应规则:- 如果两个操作数都是数值,按常规来;
- 如果两个操作数都是字符串,则比较两个字符串对应的字符编码值;
- 如果一个操作数是数值,则将另一个操作数转换为一个数值,再比较;
- 如果一个操作数是对象,则调用这个对象的 valueOf() 方法,用得到的结果按上面的规则进行比较,如果对象没有 valueOf() 方法,则调用 toString() 方法,用得到的结果按上面的规则进行比较;
- 如果一个操作数是布尔值,先转换为数值,再比较;
- 和 NaN 比较的结果都是 false。
7 相等操作符
相等和不相等
相等由两个等号(==)表示,
不相等由叹号后跟等于号(!=)表示,
这两个操作符都会先转换操作数(通常称为强制转型),然后再比较,返回布尔值。遵循如下规则:
- 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值(false → 0; true → 1);
- 如果一个操作数是字符串,另一个是数值,比较前字符串转换为数值;
- 如果一个操作数是对象,另一个不是,现调用对象的 valueOf() 方法
- null 和 undefined 是相等的;
- 在比较相等性之前,不能将 null 和 undefined 转换为其他值;
- 如果有一个操作数是 NaN,则相等操作符返回 false 不相等操作符返回 true;
- 如果两个操作数都是对象,则比较它们是不是同一个对象,是则 true 否则 false。
下表列出了一些特殊情况及比较结果:
表达式 | 值 | 表达式 | 值 | |
---|---|---|---|---|
null == undefined | true | true == 1 | true | |
“NaN” == NaN | false | true == 2 | false | |
5 == NaN | false | undefined == 0 | false | |
NaN == NaN | false | null == 0 | false | |
NaN != NaN | true | “5” == 5 | true | |
false == 0 | true |
全等和不全等
全等由三个等于号(===)表示,
不全等由叹号后跟两个等于号(!==)表示,
除了在比较之前不转换操作数之外,全等和不全等操作符与相等不相等操作符没什么区别全等只在两个操作数未经转换就相等的情况下返回 true 。
null == undefined 会返回 true,因为他们是类似的值;但 null === undefined 会返回 false,因为它们是不同类型的值
8 条件操作符
- 模板:
variable = boolean_expression ? true_value : false_value;
例如
var max = (num1 > num2) ? num1 : num2;
它表示如果 num1 大于 num2 (关系表达式返回true),则将 num1 赋给 max,否则将 num2 赋给 max。
9 赋值操作符
- 简单的赋值操作符由等于号(=)表示,其作用是把右侧的值赋给左侧的变量,
如果在等于号(=)前面再添加乘性操作符、加性操作符或位操作符,可以完成复合赋值操作。
例如:
- 乘/赋值 (*=);
- 除/赋值 (/=);
- 模/赋值 (%=);
- 加/赋值 (+=);
- 减/赋值 (-=);
- 左移/赋值 (<<=);
- 有符号右移/赋值 (>>=);
- 无符号右移/赋值 (>>>=)。
10 逗号操作符
使用逗号操作符可以在一条语句中执行多个操作,多用于声明多个变量和赋值(用作赋值时,逗号操作符总会返回表达式中的最后一项)