算術演算子

演算子はデータを処理するための基本的な方法であり、既存の値から新しい値を取得するために使用されます。 JavaScript には、すべての主要な操作をカバーするさまざまな演算子が用意されています。

概要

JavaScript には、基本的な算術演算を実行するために合計 10 個の算術演算子が用意されています。

  • 加算演算子: x + y
  • 減算演算子: x - y
  • 乗算演算子: x * y
  • 除算演算子: x/y
  • 指数演算子: x ** y
  • 剰余演算子: x % y
  • インクリメント演算子: ++x または x++
  • デクリメント演算子: --x または x--
  • 数値演算子: +x
  • 負の数値演算子: -x

減算、乗算、除算の演算は比較的単純で、対応する数学演算を実行するだけです。加算演算子に焦点を当てて、他のいくつかの算術演算子を以下に紹介します。

加算演算子

基本ルール

加算演算子 (+) は最も一般的な演算子で、2 つの数値の合計を求めるために使用されます。

1 + 1 // 2

JavaScript では数値以外の加算が可能です。

true + true // 2
1 + 真 // 2

上記のコードでは、最初の行は 2 つのブール値の加算であり、2 行目は数値とブール値の加算です。どちらの場合も、ブール値は自動的に数値に変換されて加算されます。

特別なのは、2 つの文字列を追加すると、加算演算子が接続演算子になり、新しい文字列を返し、元の 2 つの文字列を連結することです。

'a' + 'bc' // "abc"

一方の演算子が文字列で、もう一方の演算子が非文字列の場合、非文字列は文字列に変換されてから連結されます。

1 + 'a' // "1a"
false + 'a' // "偽"

加算演算子は、実行時に加算を実行するか接続を実行するかを決定します。言い換えれば、異なる演算子は異なる文法動作を引き起こします。この現象は「オーバーロード」と呼ばれます。加算演算子はオーバーロードされているため、2 つの演算を実行する可能性があるため、使用する場合は注意が必要です。

'3' + 4 + 5 // "345"
3 + 4 + '5' // "75"

上記のコードでは、左から右への演算順序により、文字列の位置が異なると結果も異なります。

加算演算子を除き、他の算術演算子 (減算、除算、乗算など) はオーバーロードされません。ルールは次のとおりです。すべての演算子が数値に変換され、対応する数学演算が実行されます。

1 - '2' // -1
1 * '2' // 2
1 / '2' // 0.5

上記のコードでは、減算、除算、乗算の演算子が文字列を数値に自動的に変換して演算を実行します。

オブジェクトの追加

演算子がオブジェクトの場合、追加する前にプリミティブ型の値に変換する必要があります。

var obj = { p: 1 };
obj + 2 // "[オブジェクト オブジェクト]2"

上記のコードでは、オブジェクトobjを元の型に変換した値が[object Object]となり、2を加算すると上記の結果が得られます。

オブジェクトは以下の規則に従ってプリミティブ型の値に変換されます。

まず、オブジェクトの valueOf メソッドが自動的に呼び出されます。

var obj = { p: 1 };
obj.valueOf() // { p: 1 }

一般に、オブジェクトの valueOf メソッドは常にオブジェクト自体を返し、オブジェクトの toString メソッドが自動的に呼び出されて文字列に変換されます。

var obj = { p: 1 };
obj.valueOf().toString() // "[オブジェクト オブジェクト]"

オブジェクトの toString メソッドはデフォルトで [object Object] を返すため、前の例の結果が取得されます。

このルールを理解した後は、valueOf メソッドまたは toString メソッドを自分で定義して、望ましい結果を得ることができます。

var obj = {
  値の: 関数 () {
    1を返します。
  }
};

obj + 2 // 3

上記のコードでは、「1」を返すように「obj」オブジェクトの「valueOf」メソッドを定義しているため、「obj + 2」は「3」になります。この例では、valueOf メソッドがプリミティブ型の値を直接返すため、toString メソッドは呼び出されなくなります。

以下は toString メソッドをカスタマイズする例です。

var obj = {
  toString: function () {
    「こんにちは」を返します。
  }
};

obj + 2 // "hello2"

上記のコードでは、オブジェクト objtoString メソッドは文字列 hello を返します。前に述べたように、1 つの演算子が文字列である限り、加算演算子は接続演算子となり、接続された文字列を返します。

ここには特殊なケースがあり、演算子が Date オブジェクトのインスタンスである場合、toString メソッドが最初に実行されます。

var obj = 新しい日付();
obj.valueOf = function () { return 1 };
obj.toString = function () { return 'hello' };

obj + 2 // "hello2"

上記のコードでは、オブジェクト「obj」は「Date」オブジェクトのインスタンスであり、「valueOf」メソッドと「toString」メソッドがカスタマイズされています。その結果、「toString」メソッドが最初に実行されます。

剰余演算子

剰余演算子 (%) は、前の演算子を次の演算子で除算して得られた剰余を返します。

12% 5 // 2

演算結果の符号は最初の演算子の符号によって決まることに注意してください。

-1 % 2 // -1
1% -2 // 1

したがって、負の数の正しい剰余値を取得するには、まず絶対値関数を使用します。

//書き方が間違っています
関数 isOdd(n) {
  n % 2 === 1 を返します。
}
isOdd(-5) // false
isOdd(-4) // false

// 正しい書き方
関数 isOdd(n) {
  戻り値 Math.abs(n % 2) === 1;
}
isOdd(-5) // true
isOdd(-4) // false

剰余演算子は浮動小数点数の演算にも使用できます。ただし、浮動小数点数は正確な値ではないため、完全に正確な結果を得ることができません。

6.5% 2.1
// 0.19999999999999973

インクリメント演算子とデクリメント演算子

インクリメント演算子とデクリメント演算子は単項演算子であり、必要な演算子は 1 つだけです。これらの機能は、まず演算子を数値に変換し、次に 1 を加算または 1 を減算することです。元の変数を変更します。

var x = 1;
++x // 2
× // 2

--x // 1
× // 1

上記のコードの変数「x」は、インクリメントして「2」を返し、次にデクリメントして「1」を返します。どちらの場合も、元の変数 x の値が変更されます。

操作後に変数の値が変化することを操作の副作用と呼びます。インクリメント演算子とデクリメント演算子は、副作用がある 2 つの演算子のみであり、他の演算子は変数の値を変更しません。

自動インクリメント演算子と自動デクリメント演算子について注意すべき点は、変数の後に配置すると、変数演算の前の値が最初に返され、配置時に自動インクリメント/自動デクリメント演算が実行されることです。変数の前では、自動インクリメント/自己デクリメント演算が最初に実行され、変数演算の後に値が返されます。

var x = 1;
変数y = 1;

x++ // 1
++y // 2

上記のコードでは、「x」は最初に現在の値を返し、次にインクリメントして「1」を取得します。「y」は最初にインクリメントしてから新しい値を返すため、「2」を取得します。

数値演算子、負の数値演算子

数値演算子 (+) もプラス記号を使用しますが、これは単項演算子 (オペランドが 1 つだけ必要) であるのに対し、加算演算子は二項演算子 (オペランドが 2 つ必要) です。

数値演算子の目的は、任意の値を数値に変換することです (「Number」関数と同じ)。

+true // 1
+[] // 0
+{} // NaN

上記のコードは、数値演算子を通過すると数値以外の値が数値になることを示しています (NaN の最後の行も数値です)。特定の型変換ルールについては、「データ型変換」の章を参照してください。

負の数値演算子 (-) も値を数値に変換する機能を持ちますが、得られる値は正と負の値になります。 2 つの負の数値演算子を一緒に使用することは、数値演算子と同等です。

var x = 1;
-x // -1
-(-x) // 1

上記のコードの最後の行のかっこは必須です。そうでないと、減分演算子になってしまいます。

数値演算子と負の数値演算子は、元の変数の値を変更せずに新しい値を返します。

指数演算子

指数演算子 (**) は指数演算を完了します。前者の演算子は基数であり、後者の演算子は指数です。

2 ** 4 // 16

指数演算子は左結合ではなく右結合であることに注意してください。つまり、複数の指数演算子を一緒に使用すると、右端の指数演算子が最初に計算されます。

// 2 ** (3 ** 2) に相当
2**3**2
// 512

上記のコードでは、指数演算子は右結合であるため、最初の指数演算子ではなく 2 番目の指数演算子が最初に計算されます。

代入演算子

代入演算子は変数に値を代入するために使用されます。

最も一般的な代入演算子は、もちろん等号 (=) です。

// 変数 x に 1 を代入します
var x = 1;

// 変数 y の値を変数 x に代入します
変数x = y;

代入演算子を他の演算子と組み合わせてバリエーションを形成することもできます。以下は算術演算子との組み合わせです。

// x = x + y と同等
x += y

// x = x - y と同等
x -= y

// x = x * y と同等
x*=y

// x = x / y と同等
x /= y

// x = x % y と同等
x%=y

// x = x ** y と同等
x**=y

以下はビット演算子との組み合わせです (ビット演算子については、後の紹介を参照してください)。

// x = x >> y と同等
x >>= y

// x = x << y と同等
x <<= y

// x = x >>> y と同等
x >>>>= y

// x = x & y と同等
x &= y

// x = x y | と同等
x |= y

// x = x ^ y と同等
x^=y

これらの複合代入演算子は、まず指定された演算を実行し、次に取得した値を左側の変数に返します。


作者: wangdoc

アドレス: https://wangdoc.com/

ライセンス: クリエイティブ・コモンズ 3.0