演算子
JavaScriptで使用できる演算子や式を解説します。
算術演算子
四則演算が可能です。
console.log(1 + 0); // 足し算 1
console.log(1 - 1); // 引き算 0
console.log(1 * 1); // 掛け算 1
console.log(1 / 1); // 割り算 1
0除算も例外にはならず可能です。
console.log(1 / 0); // Infinity
console.log(-1 / 0); // -Infinity
余り(剰余)は%
を使います。
console.log(10 % 4); // 剰余 2
指数の計算には**
を使用します。
console.log(10**6); // 1000000
console.log(2**10); // 1024
console.log(2**0.5); // 1.4142135623730951
インクリメント(++)は単項演算子で対象の数値に1を加算します。 演算子を数値の前に置いても、後に置いても加算されるという結果は変わりませんが、その式が返却する値は異なります。 数値の前に置いた場合、加算後の値を返却します。 数値の後においた場合、加算前の値を返却します。
let a = 0;
console.log(++a); // 1
console.log(a); // 1
let b = 0;
console.log(b++); // 0
console.log(b); // 1
デクリメント(–)は1減算します。
let a = 1;
console.log(--a); // 0
console.log(a); // 0
let b = 1;
console.log(b--); // 1
console.log(b); // 0
単項演算子として+を使うと対象のインスタンス・値を数値に変換した値を返却します。 -の場合は符号が反転されます。
console.log(+'1'); // 1
console.log(-'1'); // -1
代入演算子 =
演算子の右の値を左の値に代入します。
let x = 1;
配列の部分を代入する事もできます(分割代入 Destructuring assignment)。
let [x, y] = [1, 2, 3];
console.log(x); // 1
console.log(y); // 2
let [x, y, ...others] = [1, 2, 3, 4, 5];
console.log(x); // 1
console.log(y); // 2
console.log(others); // [3, 4, 5]
let { x, z } = { x: 1, y: null, z: 'a' };
console.log(x); // 1
console.log(z); // 'a'
let {p, r, ...others} = {p: 1, q: null, r: 'a', s: undefined, t:true};
console.log(p); // 1
console.log(r); // 'a'
console.log(others); //{q: null, s: undefined, t: true}
比較演算子
2つの値を比較して、論理値を返却する演算子です。
演算子 | 説明 | trueとなる例 | falseとなる例 |
---|---|---|---|
== | 等しい | 1 == ‘1’ | 1 == 2 |
=== | 型も含めて等しい | 1 === 1 | 1 === ‘1’ |
!= | 等しくない | 1 != 2 | 1 != ‘1’ |
!== | 型も含めて等しくない | 1 !== ‘1’ | 1 !== 1 |
< | より小さい | 1 < 2 | 1 < 0 |
<= | 以下 | 1 <= 1 | 1 <= 0 |
> | より大きい | 1 > 0 | 1 > 1 |
>= | 以上 | 1 >= 0 | 1 >= 2 |
論理演算子
論理積(AND)は&&
、論理和(OR)は||
、否定(NOT)は!
で表現されます。
let bools = [true, false];
for(let a of bools){
for(let b of bools){
console.log(`${a} && ${b} => ${a && b}`);
console.log(`${a} || ${b} => ${a || b}`);
// true && true => true
// true || true => true
// true && false => false
// true || false => true
// false && true => false
// false || true => true
// false && false => false
// false || false => false
}
}
for(let a of bools){
console.log(`!${a} => ${!a}`);
// !true => false
// !false => true
}
論理式は左から右に、短絡 (short-circuit)で評価されます。
true || condition1 || condition2 || …
やfalse && condition1 && condition2 && …
は
最初の項より後を評価することなく、それぞれtrueとfalseと評価されます。
let getSecondValue = function getSecondValue(array){
if(Array.isArray(array) && 2 <= array.length ){
return array[1];
}else{
return null;
}
}
console.log(getSecondValue(null)); // null (array.lengthでエラーになりません)
console.log(getSecondValue(1)); // null (array.lengthでエラーになりません)
console.log(getSecondValue([1, 2, 3])); //2
三項演算子
3つの引数から1つの値を取り出す演算子です。
条件 ? 条件がTrueの場合の値 : 条件がFalseの場合の値 ;
の形式となります。
let a = 1;
console.log( a == 1 ? 'a is one' : 'a is not one' ); // 'a is one'
文字列演算子
文字列は+
の記号で連結できます。
console.log( 'abra' + 'kada' + 'bra' ); // 'abrakadabra'
型演算子
typeof インスタンス
とすることで、対象のインスタンスの型を示す文字列を取得できます。
console.log(typeof 1); // number
console.log(typeof 123n); // bigint
console.log(typeof 'abc'); //string
console.log(typeof true); // boolean
console.log(typeof undefined); //undefined
console.log(typeof null); //object
console.log(typeof Symbol('a')); // symbol
console.log(typeof parseInt); //function
関係演算子
in
は指定したプロパティがインスタンスに存在するかを真偽値で返却します。
let array = ['a','b','c'];
console.log('b' in array); // false
console.log(1 in array); // true
console.log('length' in array); // true
console.log('push' in array); // true
console.log('E' in Math); // true
let obj = { name : 'Taro', age : 20, 5 : 'Test' }
console.log('age' in obj); // true
console.log('Taro' in obj); // false
console.log(3 in obj); // false
instanceof
は指定したインスタンスが指定した型であるかを真偽値で返却します。
console.log(['a','b','c'] instanceof Array); //true
console.log(new Date instanceof Date); // true
削除演算子
キーワードdelete
で、プロパティや配列の削除を行えます。
let a = {name:'Taro', age:100};
delete a.age;
console.log(a); //Object {name: "Taro"}
let b = ['a', 'b', 'c'];
delete b[1];
console.log(b); // ['a', 'c']
ビット演算子
let a = 0b1100; // 12
let b = 0b1010; // 10
// ビット論理積 (AND) a & b = 0b1000 = 8
console.log(`a & b = 0b${(a & b).toString(2)} = ${a & b}`);
// ビット論理和 (OR) a | b = 0b1110 = 14
console.log(`a | b = 0b${(a | b).toString(2)} = ${a | b}`);
// ビット排他的論理和 (XOR, exclusive or) a ^ b = 0b110 = 6
console.log(`a ^ b = 0b${(a ^ b).toString(2)} = ${a ^ b}`);
// ビット否定 (NOT) [note] /~a = 0b11111111111111111111111111110011 = -13
// (「>>> 0」は右に0ビットシフトしており値は動かない。文字列表示上の理由によります。)
console.log(`~a = 0b${(~a >>> 0).toString(2)} = ${~a}`);
// 左シフト * 右側は0埋め a << 3 = 0b1100000 = 96
console.log(`a << 3 = 0b${(a << 3).toString(2)} = ${a << 3}`);
// 右シフト * 符号そのまま a >> 3 = 0b1 = 1
console.log(`a >> 3 = 0b${(a >> 3).toString(2)} = ${a >> 3}`);
// 右シフト * 左側は0埋め a >>> 3 = 0b1 = 1
console.log(`a >>> 3 = 0b${(a >>> 3).toString(2)} = ${a >>> 3}`);
複合代入演算子
計算とその結果の代入を一度に行う演算子です。
形式としては計算する演算子の右横にイコール=をつなげた長さ2以上の記号の列になります。
例えば、加算の複合代入演算子はa += b
のような形式になります。
let a = 12;
a += 1; // a = a + 1 = 12 + 1 = 13
a -= 1; // a = a - 1 = 13 - 1 = 12
a *= 2; // a = a * 2 = 12 * 2 = 24
a /= 3; // a = a / 3 = 24 / 3 = 8
a %= 5; // a = a % 3 = 8 % 5 = 3
a **= 4; // a = a ** 4 = 3 ** 4 = 81
let a = 0b1010; // 10
a <<= 2; // a = a<<2 = 0b101000 = 40
a >>= 3; // a = a>>3 = 0b101 = 5
a >>= 1; // a = a>>3 = 0b10 = 2