# [JavaScript] 運算子 Operators ###### tags: `JavaScript` ## 運算子優先順序 | 運算子類型 | 運算子 | 結合性 | | -------- | ----- | ----- | | | `[]`、`()` | 從左到右 | | 邏輯、一元 | `!`、`+`(正)、`-`(負)、`++`、`--` | 從右到左 | | 算術運算子 | `*`、`/`、`%` | 從左到右 | | 算術運算子 | `+`(加)、`-`(減) | 從左到右 | | 比較運算子 | `<`、`<=`、`>`、`>=` | 從左到右 | | 比較運算子 | `==`、`!=`、`===`、`!==` | 從左到右 | | 邏輯運算子 | `&&` | 從左到右 | | 邏輯運算子 | `\|\|` | 從左到右 | | 條件運算子 | `... ? ... : ...` | 從左到右 | | 指定運算子 | `=`、`+=`、`-=`、`*=`、`/=`、`%=` | 從右到左 | ## 一元運算子 ```javascript= let i = 1; i++; // 1,回傳原始的數值 console.log(i); // 2 let j = 1; ++j; // 2,回傳 +1 後的結果 console.log(j); // 2 ``` ## 算數運算子 ### 乘號 * * 其中一個值不是數字時,會將其自動轉型為數字 ```javascript= 6 * 0; // 0 6 * Infinity; // Infinity 6 * '2'; // 12 6 * 'a'; // NaN 6 * true; // 6 6 * false; // 0 6 * null; // 0 6 * undefined; // NaN 6 * []; // 0 6 * {}; // NaN ``` ### 除號 / * 其中一個值不是數字時,會將其自動轉型為數字 ```javascript= 0 / 0; // NaN 6 / 0; // Infinity,正整數除以 0 -6 / 0; // -Infinity,負數除以 0 Infinity / 0; // Infinity -Infinity / 0; // -Infinity 0 / 6; // 0,0 除以正整數 0 / -6; // 0,0 除以負數 0 / Infinity; // 0 0 / -Infinity; // 0 6 / Infinity; // 0,正整數除以 Infinity -6 / Infinity; // 0,負數除以 Infinity Infinity / 6; // Infinity,Infinity 除以正整數 Infinity / -6; // -Infinity,Infinity 除以負數 -Infinity / 6; // -Infinity,-Infinity 除以正整數 -Infinity / -6; // Infinity,-Infinity 除以負數 Infinity / Infinity; // NaN -Infinity / -Infinity; // NaN ``` ### 餘數 % ```javascript= Infinity % 0; // NaN Infinity % 6; // NaN Infinity % Infinity; // NaN Infinity % -Infinity; // NaN 0 % Infinity; // 0 6 % Infinity; // 6 ``` ### 加號 + * 其中一個值是字串時,另一個會自動轉型為字串 ```javascript= Infinity + Infinity; // Infinity -Infinity + -Infinity; // -Infinity Infinity + -Infinity; // NaN Infinity + NaN; // NaN -Infinity + NaN; // NaN Infinity + undefine; // NaN 6 + '1'; // '61' 6 + true; // 7,因為 Number(true) → 1 6 + false; // 6,因為 Number(false) → 0 6 + null; // 6,因為 Number(null) → 0 6 + undefine; // NaN,因為 Number(undefine) → NaN 6 + []; // '6' 6 + {}; // '6[object Object]' ``` ### 減號 - * 其中一個值不是數字時,會將其自動轉型 * 基本型別透過 `Number()` * 物件型別透過 `valueOf()`,若沒有此方法,則改用 `toString()` 後再用 `Number()` ```javascript= Infinity - Infinity; // NaN -Infinity - -Infinity; // NaN Infinity - -Infinity; // Infinity -Infinity - Infinity; // -Infinity Infinity - NaN; // NaN -Infinity - NaN; // NaN 6 - 'a'; // NaN,因為 Number('a') → NaN 6 - '1'; // 5 6 - true; // 5 6 - []; // 6,因為 Number([].toString()) → 0 6 - {}; // NaN ``` ## 比較運算子 ### === 嚴格相等,不會替值做自動轉型 ```javascript= NaN === NaN; // false +0 === -0; // true ``` ### == 寬鬆相等 * boolean、string 會轉為 number ```javascript= true == 'true'; // false,因為 Number('true') → NaN true == 1; // true,因為 Number(true) → 1 '1' == !0; // true,因為 !0 → true,Number(!0) → 1 ``` * null、undefined 不會被轉為 number ```javascript= Number(null); // 0 null == 0; // false null == undefined; // true ``` * 物件與非物件,會使用包裹物件轉換 ```javascript= ['a'] == 'a'; // true,['a'] → String(['a']) → a [1] == 1; // true,[1] → Number([1]) → 1 // 一般不會這樣比對物件 '[object Object]' == {a: 'a'}; // true,String({a: 'a'}) → '[object Object]' {a: 'a'} == '[object Object]'; // Uncaught SyntaxError: Unexpected token '==' ``` * 物件與物件,比對時是比對他們的參考位置,不是比對值 ```javascript= {} == {}; // false [] == []; // false const a = []; const b = a; a == b; // true a === b; // true ``` ## 參考資料 * [Expressions and operators - JavaScript | MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators "Expressions and operators - JavaScript | MDN") --- :::info 建立日期:2021-03-08 更新日期:2024-02-10 :::