1単項演算子
1つの値のみを操作する演算子は、単項演算子と呼ばれます。
(1)インクリメント演算子とデクリメント演算子
プレフィックスインクリメント演算子とプレフィックスデクリメント演算子のどちらを使用する場合でも、ステートメントが評価される前に変数の値が変更されます。
let age = 29;
let another = --age+2;
console.log(age); //28
console.log(another); //30
サフィックスバージョンとプレフィックスバージョンの主な違いは、サフィックスバージョンのインクリメントとデクリメントは、ステートメントが評価された後にのみ発生することです。
let num1 = 2;
let num2 = 20;
let num3 = num1-- + num2; //22
let num4 = num1 + num2; //21
インクリメント演算子とデクリメント演算子は任意の値に使用できます。つまり、整数、文字列、ブール値、浮動小数点値、さらにはオブジェクトに限定されません。インクリメント演算子とデクリメント演算子は次のルールに従います。
- 文字列の場合、それが有効な数値形式である場合は、それを数値に変換して変更を適用します。変数の型が文字列から数値に変わります。
- 文字列の場合、有効な数値形式でない場合、変数の値はNaNに設定されます。変数の型が文字列から数値に変わります。
- ブール値の場合、falseの場合、変更を適用する前に0に変換されます。変数タイプがブール値から数値に変わります。
- ブール値の場合、trueの場合は、1に変換して変更を適用します。変数タイプがブール値から数値に変わります。
- 浮動小数点値の場合、1を加算して1を減算します。
- オブジェクトの場合は、そのvalueOf()メソッドを呼び出して、操作可能な値を取得します。得られた値に上記のルールを適用します。NaNの場合は、toString()を呼び出して他のルールを再度適用すると、変数の型がオブジェクトから値に変わります。
(2)単項プラスと単項マイナス
単項プラスが非数値に適用される場合、Number()変換関数を使用するのと同じ型変換が実行されます:ブール値falseとtrueは0と1に変換され、文字列は特別なルールに従って解析されます。オブジェクトは、valueOf()メソッドやtoString()メソッドを呼び出して、変換可能な値を取得します。
let s1 = "01";
let s2 = "1.1";
let s3 = "z";
let b = false;
let o = {
valueOf() {
return -1;
}
};
s1 = +s1; //值变成数值1
s2 = +s2; //值变成数值1.1
s3 = +s3; //值变成NaN
b = +b; //值变成数值0
f = +f; //不变
o = +o; //值变成-1
2ブール演算子
ブール演算子には、論理否定、論理AND、論理ORの3つがあります。
(1)論理否定論理
否定演算子は感嘆符(!)で表され、ECMAScriptの任意の値に適用できます。この演算子は、適用されるデータ型に関係なく、常にブール値を返します。論理否定演算子は、最初にオペランドをブール値に変換してから、それを否定します。論理否定演算子は、次の規則に従います。
- オペランドがオブジェクトの場合、falseを返します
- オペランドが空の文字列の場合、trueを返します
- オペランドが空でない文字列の場合、falseを返します
- オペランドが値0の場合、trueを返します
- オペランドがゼロ以外の値の場合、falseを返します
- オペランドがnullの場合、trueを返します
- オペランドがNaNの場合、trueを返します
- オペランドが未定義の場合、trueを返します
論理否定演算子を使用して、任意の値をブール値に変換することもできます。2つの感嘆符(!!)を同時に使用することは、変換関数Boolean()を呼び出すことと同じです。
(2)論理AND
論理AND演算子は、2つのアンパサンド(&&)で表され、2つの値に適用されます。
第1オペランド | 第2オペランド | 結果 |
---|---|---|
true | true | true |
true | false | false |
false | true | false |
false | false | false |
論理AND演算子は、ブール値に限らず、任意のタイプのオペランドに使用できます。オペランドがブール値でない場合、論理ANDは必ずしもブール値を返すとは限りませんが、次の規則に従います。
- 最初のオペランドがオブジェクトの場合、2番目のオペランドを返します
- 2番目のオペランドがオブジェクトの場合、最初のオペランドがtrueと評価された場合にのみ、オブジェクトが返されます。
- 両方のオペランドがオブジェクトの場合、2番目のオペランドが返されます。
- オペランドの1つがnullの場合、nullを返します
- オペランドの1つがNaNの場合、NaNが返されます
- オペランドの1つが未定義の場合、undefinedを返します
論理AND演算子は短絡演算子です。つまり、最初のオペランドが結果を決定する場合、2番目のオペランドは評価されません。論理AND演算子の場合、第1オペランドがfalseの場合、第2オペランドの値に関係なく、結果をtrueに等しくすることはできません。
(3)論理OR
論理OR演算子は、2つのパイプ文字(||)で表され、次の規則に従います。
第1オペランド | 第2オペランド | 結果 |
---|---|---|
true | true | true |
true | false | true |
false | true | true |
false | false | false |
論理およびと同様に、オペランドの1つがブール値でない場合、論理OR演算子は必ずしもブール値を返すとは限りません。次の原則に従ってください。
- 第1オペランドがオブジェクトの場合、第1オペランドが返されます。
- 最初のオペランドがfalseと評価された場合、2番目のオペランドが返されます。
- 両方のオペランドがオブジェクトの場合、最初のオペランドが返されます。
- 両方のオペランドがnullの場合、nullを返します。
- 両方のオペランドがNaNの場合、NaNが返されます。
- 両方のオペランドが未定義の場合は、undefinedを返します。
論理積と同様に、論理積演算子にも短絡の特性があります。論理ORの場合、最初のオペランドはtrueと評価され、2番目のオペランドは再度評価されません。
この動作を使用すると、変数にnullまたはundefinedを割り当てることを回避できます。
let myObject = preferredObject || backupObject;
この例では、変数myObjectに2つの値のいずれかが割り当てられます。その中で、preferredObject変数にはpreferred値が含まれ、backupObject変数にはバックアップ値が含まれます。
3乗算演算子
ECMAScriptは、乗算、除算、モジュロの3つの乗法演算子を定義します。乗法演算子に数値ではないオペランドがある場合、そのオペランドはバックグラウンドでNumber()変換関数によって数値に変換されます。
乗算演算子
乗算演算子はアスタリスク(*)で表され、2つの値の積を計算するために使用できます。ただし、乗算演算子には、特別な値を処理するときにいくつかの特別な動作もあります。
- いずれかのオペランドがNaNの場合、NaNが返されます
- Infinityに0を掛けると、NaNが返されます
- Infinityにゼロ以外の有限値を掛けたものである場合は、第2オペランドの符号に応じてInfinityまたは-Infinityを返します。
- InfinityにInfinityを掛けたものの場合は、Infinityを返します。
- 数値ではないオペランドがある場合は、まずNumber()を使用してバックグラウンドで数値に変換してから、上記のルールを適用してください。
分割オペレータ
除算演算子は、スラッシュ(/)で表される第2オペランドによって分割された第1オペランドの商を計算するために使用されます。乗算演算子と同様に、除算演算子には、特別な値に対していくつかの特別な動作があります。
- いずれかのオペランドがNaNの場合、NaNが返されます
- 0を0で割ると、NaNが返されます
- ゼロ以外の有限値を0で割った値の場合は、第1オペランドの符号に応じてInfinityまたは-Infinityを返します。
- InfinityをInfinityで割った場合、NaNが返されます
- Infinityを任意の値で割った値の場合は、第2オペランドの符号に応じてInfinityまたは-Infinityを返します。
- 数値ではないオペランドがある場合は、まずバックグラウンドでNumber()関数を使用して数値に変換してから、上記のルールを適用してください。
モジュラス演算子
モジュラス(剰余)演算子はパーセント記号(%)で表されます。他の乗法演算子と同様に、モジュラス演算子には特別な値に対していくつかの特別な動作があります。
- 被除数が無制限で除数が有限値の場合、NaNが返されます
- 被除数が有限値で除数が0の場合、NaNが返されます
- InfinityをInfinityで割った場合、NaNが返されます
- 被除数が有限値で除数が無限大の場合、被除数が返されます。
- 被除数が0で、除数が0でない場合は、0を返します。
- 数値ではないオペランドがある場合は、まずバックグラウンドでNumber()関数を使用して数値に変換してから、上記のルールを適用してください。
4指数演算子
ECMAScript7は指数演算子を追加しました。Math.pow()には独自の演算子**があり、結果は同じです。
console.log(Math.pow(3, 2)); //9
console.log(3 ** 2); //9
5加法演算子
(1)加算演算子(+)は、2つの数値を合計するために使用されます。両方のオペランドが数値の場合、加算演算子は加算演算を実行し、次の規則に従って結果を返します。
- いずれかのオペランドがNaNの場合、NaNが返されます
- InfinityとInfinityの場合は、Infinityを返します。
- -Infinityと-Infinityの場合は、-Infinityを返します。
- Infinity plus -Infinityの場合、NaNが返されます
- +0 + +0の場合、+ 0を返します
- -0 + +0の場合、+ 0を返します
- -0 + -0の場合は、-0を返します。
オペランドの1つが文字列の場合、次の規則が適用されます。
- 両方のオペランドが文字列の場合、2番目の文字列は最初の文字列の後にスプライスされます
- 一方のオペランドのみが文字列の場合は、もう一方のオペランドを文字列に変換してから、2つの文字列を連結します。
いずれかのオペランドがオブジェクト、数値、またはブール値である場合は、それらのtoString()メソッドを呼び出して文字列を取得してから、前の文字列規則を適用します。undefinedとnullの場合は、String()関数を呼び出して、それぞれ「undefined」と「null」を取得します。
let result1 = 5+5;
console.log(result1); //10
let result2 = 5+"5";
console.log(result2);//"55"
(2)減算演算子
減算演算子(-)も頻繁に使用される演算子です。加算演算子と同様に、減算演算子にもECMAScriptで異なるタイプ間の変換を処理するための一連のルールがあります。
- いずれかのオペランドがNaNの場合、NaNが返されます
- InfinityからInfinityを引いた場合、NaNが返されます
- -Infinityマイナス-Infinityの場合、NaNが返されます
- Infinityマイナス-Infinityの場合は、Infinityを返します
- -InfinityからInfinityを引いたものの場合は、-Infinityを返します。
- +0マイナス+0の場合は、+ 0を返します
- +0マイナス-0の場合は、-0を返します。
- -0マイナス-0の場合、+ 0を返します。
- オペランドが文字列、ブール値、null、または未定義の場合は、最初にバックグラウンドでNumber()を使用して数値に変換してから、前の規則に従って数学演算を実行します。
- いずれかのオペランドがオブジェクトの場合、そのvalueOf()メソッドを呼び出して、それを表す値を取得します。値がNaNの場合、計算結果NaNが減算されます。オブジェクトにvalueOf()メソッドがない場合、そのtoString()メソッドが呼び出され、結果の文字列が値に変換されます。
6つの関係演算子
関係演算子は、より小さい(<)、より大きい(>)、以下(<=)、および以上(> =)を含む2つの値を比較する演算を実行します。これらの演算子はすべてブール値を返します。
ECMAScriptの他の演算子と同様に、型変換やその他の動作は、さまざまなデータ型に適用されると発生します。
- オペランドがすべて数値の場合は、数値比較を行ってください。
- オペランドがすべて文字列の場合は、文字列内の対応する文字のコードを1つずつ比較します。
- いずれかのオペランドが数値の場合は、別のオペランドを数値に変換して数値比較を行ってください。
- いずれかのオペランドがオブジェクトの場合は、valueOf()メソッドを呼び出し、結果を取得した後、前のルールに従って比較を実行します。valueOf()がない場合は、toString()メソッドを呼び出し、結果を取得した後、前のルールに従って比較を実行します。
- いずれかの演算子がブール値の場合、数値に変換されてから比較が実行されます。
文字列の場合、関係演算子は文字列内の対応する文字のコードを比較します。これらのコードは数値です。比較が完了すると、ブール値が返されます。大文字のエンコードは小文字のエンコードよりも小さいため、次の状況が発生します。
let result = "Brick"<"alphabet"; //true
ここでは、文字Bのコードが66で、文字aのコードが97であるため、文字列「Brick」は文字列「alphabet」よりも小さいと見なされます。アルファベット順で比較の結果を取得するには、両方を同じ大文字小文字(すべて大文字またはすべて小文字)に変換してから、以下を比較する必要があります。
let result = "Brick".toLowerCase<"alphabet".toLowerCase; //false
もう1つの奇妙な現象は、次のような2つの数値文字列を比較する場合です。
let result = "23"<"3"; //true
これは、文字列「23」と「3」を比較するときにtrueを返します。どちらのオペランドも文字列であるため、文字コードを1つずつ比較します(文字「2」のコードは50、文字「3」のコードは51)。ただし、オペランドの1つが数値の場合、比較結果は正しいです。
let result = "23"<3; //false
数値が文字列と比較される限り、文字列は最初に数値に変換され、次に数値が比較されます。数値文字列の場合、これにより正しい結果が保証されますが、文字列が数値に変換しますか?
let result = "a"<3;
「a」は意味のある値に変換できないため、NaNにのみ変換できます。NaNの比較を伴う場合、関係演算子はfalseを返すという規則があります。
let result1 = NaN<3; //false
let result2 = NaN>=3; //false
7等式演算子
(1)
ECMAScriptと等しいか等しくないECMAScriptの等号は2つの等号(==)で表されます。オペランドが等しい場合はtrueを返します。不等演算子は(!に等しい感嘆符で表されます。 =)。オペランドが等しくない場合、trueを返します。両方の演算子は、最初に型変換を実行してから、オペランドが等しいかどうかを判別します。
- いずれかのオペランドがブール値の場合は、それを数値に変換して、等しいかどうかを比較します。Falseは0に変換され、trueは1に変換されます。
- 一方のオペランドが文字列で、もう一方のオペランドが数値の場合は、文字列を数値に変換して、等しいかどうかを比較してみてください。
- 一方のオペランドがオブジェクトで、もう一方のオペランドがオブジェクトでない場合は、オブジェクトvalueOf()メソッドを呼び出して元の値を取得し、前のルールに従って比較します。
比較すると、これら2つの演算子は次のルールに従います。
- nullとundefinedは等しい
- ヌルおよび未定義は、他のタイプの値に変換してから比較することはできません。
- いずれかのオペランドがNaNの場合、等式演算子はfalseを返し、不等式演算子はtrueを返します。
- 両方のオペランドがオブジェクトの場合、それらが同じオブジェクトであるかどうかを比較します。両方のオペランドが同じオブジェクトを指している場合、等式演算子はtrueを返します。そうでなければ、2つは等しくありません。
(2)合同と不等式
合同と不等式の演算子は、等式を比較するときにオペランドを変換しないことを除いて、等式と不等式の演算子に似ています。合同演算子は3つの等号(===)で表され、変換なしで2つのオペランドが等しい場合にのみ、trueを返します。
let result1 = ("55"==55); //true
let result2 = ("55"===55); //false
不等演算子は、感嘆符と2つの等号(!==)で表され、変換なしで2つのオペランドが等しくない場合にのみ、trueを返します。
8 条件操作符
variable = boolean_expression?true_value:false_value;
上記のコードは、条件付き割り当て操作を実行します。つまり、条件式boolean_expressionの値に従って、変数変数に割り当てられる値を決定します。boolean_expressionがtrueの場合、true_valueが割り当てられ、boolean_expressionがfalseの場合、false_valueが割り当てられます。
9代入演算子
10コンマ演算子
コンマ演算子を使用すると、1つのステートメントで複数の操作を実行できます。
let num1 = 1,num2 = 2,num3 = 3;