まず、算術演算子
図1に示すように、加算(+)
これは、加算演算を表し、
特別な値を処理するためのルール:
-
- 両方のオペランドが文字列である場合、第一のオペランドへの第2オペランドが一緒にスプライス。
- オペランドの一方のみが文字列であれば、もう一方のオペランドが文字列に変換され、その後、一緒に2つの文字列をステッチ。
- ターゲット・オペランド、または呼ばれるブール値がある場合のtoString()に対応する文字列の値を取得し、その文字列の前にルールを適用する方法。
- 以下のために未定義とnullを、それぞれ呼び出して文字列()関数、文字列取得「未定義」と「ヌル」を。
- 両方のオペランドが文字列である場合、第一のオペランドへの第2オペランドが一緒にスプライス。
図2に示すように、減算( - )
これは減算演算を表します。
特別な値を処理するためのルール:
-
- いずれかのオペランドがある場合はNaN 3を、そして、結果はNaN 3を。
- 場合無限保存無限、結果はNaN 3を、(同様に:場合-Infinity 保存-Infinity 、結果はNaN 3を; )
- 場合無限保存-Infinity 、結果は無限;(同様に:場合-Infinity 保存インフィニティ、結果は -Infinity。 )
- いずれかのオペランドが文字列、ブール値である場合、ヌルまたは未定義の背景に、最初の呼数()値に変換する関数は、次いで上記のルールの減算を行います。変換の結果である場合にはNaN 、次いで減算の結果はNaNに。
- 一方のオペランドがオブジェクトの場合、オブジェクトの呼び出しのvalueOf()オブジェクトの数値を得るための方法を。得られた値である場合はNaNを、その後、減算結果はNaNに。オブジェクトがない場合のvalueOf()と呼ばれる方法、のtoString()文字列変換方法、得られた数値。
- いずれかのオペランドがある場合はNaN 3を、そして、結果はNaN 3を。
3、乗算(*)
これは、2つの数の積を表し、
特殊な値のための処理規則:
-
- オペランドが数字である場合、従来の乗算を実行するが、生成物はECMAスクリプトの範囲外の場合、戻り無限または-Infinityを、
- いずれかのオペランドがある場合はNaN 3を、そして、結果はNaN 3を。
- 場合は無限大と0が乗算され、結果はNaN 3を。
- 場合無限NAND 0は値が乗算され、結果は無限または-Infinity 符号付き演算の記号表現の数に応じて、。
- 場合は無限と無限が乗じ、結果は無限大。
- オペランドは、バックグラウンドの値が呼び出されていない場合の数()上記の規則の、アプリケーション、値に変換します
- オペランドが数字である場合、従来の乗算を実行するが、生成物はECMAスクリプトの範囲外の場合、戻り無限または-Infinityを、
4、除算(/)
第2オペランドが第一加算オペランドを表します。
特殊な値のための処理規則:
-
- オペランドが数字である場合、従来の分割の計算を行うが、ECMAスクリプトの範囲サプライヤ外場合、戻り 無限 または-Infinityを、
- いずれかのオペランドがある場合はNaN 3を、そして、結果はNaN 3を。
- 場合は無限大であるインフィニティ加えて、結果はNaN 3を。
- ゼロがゼロの場合、結果はNaN 3を。
- ゼロでない有限の数がゼロの場合、結果は無限または-Infinity 符号付き演算の記号表現の数に応じて、。
- 場合無限にゼロ以外の値に追加され、結果は無限または-Infinity 符号付きオペランドの符号に応じて、。
- オペランドが呼び出され、バックグラウンドの値でない場合数()値に変換し、その後、上記のルールを適用します。
- オペランドが数字である場合、従来の分割の計算を行うが、ECMAスクリプトの範囲サプライヤ外場合、戻り 無限 または-Infinityを、
図5に示すように、モジュロ(%)
オペレータは、モジュロ数を示します。
特殊な値のための処理規則:
-
- オペランドが数字である場合、分割の残りの部分に分割演算ルーチン復帰を行います。
- 被除数が無限大値と除数が有限の値である場合、結果はNaN 3を。
- 被除数が除数の有限の値がゼロである場合、結果はNaN 3を。
- 場合は無限大であるインフィニティ加えて、結果はNaN 3を。
- 除数が無限大値である被除数が有限の値である場合、結果は被除数です。
- 配当がゼロの場合、結果はゼロです。
- オペランドは、バックグラウンドの値が呼び出されていない場合の数()上記の規則の、アプリケーション、値に変換します
- オペランドが数字である場合、分割の残りの部分に分割演算ルーチン復帰を行います。
第二に、単項演算子
自体プラス1:プラス(+)ので1、
前置++:++变量名;参与运算时,先自身加1,再参与运算。
后置++:变量名++;参与运算时,自身先参与运算,然后再自身加1。
2、自减(- -):自身减1
前置 --:- -变量名;参与运算时,先自身减1,再参与运算;
后置 --:变量名- -;参与运算时,先自身参与运算,然后再自身减1;
注意:操作符对任何值都适用,也就是它们不仅适用于整数,还可以用于字符串、布尔值、浮点数值和对象。在应用于非整数的时候,先把对象的类型转化为整数再进行计算。
三、逻辑运算符
1、逻辑与(&&)
真值表:
第一个操作数 | 第二个操作数 | 结果 |
true | true | true |
true | false | false |
false | true | false |
false | false | false |
逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值;此时,它遵循下列规则:
-
- 如果第一个操作数是对象,则返回第二个操作数;
- 如果第二个操作数是对象,则只有在第一个操作数的求值结果为 true 的情况下才会返回该对象;
- 如果两个操作数都是对象,则返回第二个操作数;
- 如果有一个操作数是 null,则返回 null;
- 如果有一个操作数是 NaN,则返回 NaN ;
- 如果有一个操作数是 undefined,则返回 ;
- 如果第一个操作数是对象,则返回第二个操作数;
注意:逻辑与存在短路运算,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值。
对于逻辑与操作而言,如果第一个操作数是 false,则无论第二个操作数是什么值,结果都不再可能是true 了。
2、逻辑或(||)
真值表:
第一个操作数 | 第二个操作数 | 结果 |
true | true | true |
true | false | true |
false | true | true |
false | false | false |
与逻辑与操作相似,如果有一个操作数不是布尔值,逻辑或也不一定返回布尔值;此时,它遵循下列规则:
-
- 如果第一个操作数是对象,则返回第一个操作数;
- 如果第一个操作数的求值结果为 false,则返回第二个操作数;
- 如果两个操作数都是对象,则返回第一个操作数'
- 如果两个操作数都是 null,则返回 null;
- 如果两个操作数都是 NaN,则返回 NaN ;
- 如果两个操作数都是 undefined,则返回 undefined;
- 如果第一个操作数是对象,则返回第一个操作数;
注意:与逻辑与操作符相似,逻辑或操作符也是短路操作符。也就是说,如果第一个操作数的求值结果为true,就不会对第二个操作数求值了。
3、逻辑非( ! )
无论这个值是什么数据类型,这个操作符都会返回一个布尔值。
逻辑非操作符首先会将它的操作数转换为一个布尔值,然后再对其求反。
规则:对 true 取反为 false,对 false 取反为 true。
四、关系运算符(比较运算符)
1、相等操作符
相等操作符由两个等于号( ==)表示,如果两个操作数相等,则返回 true。
不相等操作符由叹号后跟等于号( !=)表示,如果两个操作数不相等,则返回 true。
注意:比较的是两个值是否相等。
处理特殊值规则:
-
- 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
- null 和 undefined 是相等的。
- 要比较相等性之前,不能将 null 和 undefined 转换成其他任何值。
- 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回 true;否则,返回 false。
注意:NaN 与任何都不相等,包括它自身。
2、全等与不全等
全等操作符由3个等号(===)表示,它只在两个操作数未经转换就相等的情况下返回 true ;
不全等操作符由 (!==)表示,它在两个操作数未经转换就不相等的情况下返回 true。
注意:全等和不全等即比较类型也比较值。
Tips: null == undefined 会返回 true,因为它们是类似的值;但 null === undefined 会返回 false,因为它们是不同类型的值。
3、关系操作符
小于(<)、大于(>)、小于等于(<=)和大于等于(>=) 这几个关系运算符对两个值进行比较,都返回一个布尔值。
处理特殊值规则:
-
- 如果两个操作数都是数值,则执行数值比较。
- 如果两个操作数都是字符串,则比较两个字符串对应的字符编码值。
- 如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较 。
- 如果一个操作数是对象,则调用这个对象的 valueOf()方法,用得到的结果按照前面的规则执行比较。如果对象没有 valueOf()方法,则调用 toString()方法,并用得到的结果根据前面的规则执行比较。
- 如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。
- 如果两个操作数都是数值,则执行数值比较。
五、赋值运算符
简单的赋值操作符由等于号( =)表示,其作用就是把右侧的值赋给左侧的变量;
如果在等于号( =)前面再添加乘性操作符、加性操作符或位操作符,就可以完成复合赋值操作。
这种复合赋值操作相当于是对下面常规表达式的简写形式:
Demo:
var num = 10;
num = num + 10; // 等价于 num += 10;
其他的复合赋值操作符还有:*=、/=、%=、+=、-=。
六、条件操作符(三元运算符)
语法格式:
表达式? value1 : value2;
如果表达式值为 true,取 value1的值;如果表达式为 false ,取 value2 的值。(等价于 if...else 语句)
七、运算符的优先级
优先级从高到低:
1、 () 优先级最高
2、 一元运算符 ++ -- !
3、 算数运算符 先* / % 后 + -
4、 关系运算符 > >= < <=
5、 相等运算符 == != === !==
6、 逻辑运算符 先&& 后||
7、 赋值运算符