PS:“+”和“-”既是一元運算符,也是二元運算符。
首先我們看看下面這幾道題的結果是什么:
當 x='1'時, x+1;x-1;+x;-x;++x; typeof(x+1); typeof(x-1); typeof(+x); typeof(-x); typeof(++x); 的結果分別是多少? 答案: x+1 //'11' x-1 //0 +x //1 -x //-1 ++x //2 typeof(x+1) //'string' typeof(x-1) //'number' typeof(+x) //'number' typeof(-x) //'number' typeof(++x) //'number'
一元加法(+)
一元加法運算符把操作數轉換為數字(或者NaN),並返回這個轉換后的數字。如果操作數本身就是數字,則直接返回這個數字。
+1 // => 1: 操作數本身就是數字,則直接返回這個數字 +'1' // => 1: 把字符串轉換為數字 +'-1' // => -1: 把字符串轉換為數字
一元減法(-)
當“-”用做一元運算符時,它會根據需要把操作數轉換為數字,然后改變運算結果的符號。
-1 // => -1: 操作數本身就是數字,直接改變運算結果的符號 -'1' // => -1: 把字符串轉換為數字,再改變運算結果的符號 -'-1'// => 1: 把字符串轉換為數字,再改變運算結果的符號
二元加法(+)
二元加法運算符“+”可以對兩個數字做加法,也可以做字符串連接操作。
當兩個操作數都是數字或都是字符串的時候,計算結果是顯而易見的。然而對於其他情況來說,則要進行一些必要的類型轉換,並且運算符的行為依賴於類型轉換的結果。加號的轉換規則優先考慮字符串連接,如果其中一個操作數是字符串或者轉換為字符串的對象,另外一個操作數將會轉換為字符串,加法將進行字符串的連接操作。如果兩個操作數都不是類字符串(string-like)的, 兩個操作數都將轉換為數字(或者NaN),然后進行算術加法運算。
這里有一些栗子:
1 + 1 // => 2: 加法 '1' + '1' // => '11': 字符串連接 '1' + 1 // => '11': 數字轉換為字符串后進行字符串連接 1 + {} // => '1[object Object]': 對象轉換為字符串后進行字符串連接 true + true // => 2: 布爾值轉換為數字后做加法 1 + null // => 1: null轉換為0后做加法 1 + undefined// => NaN: undefined轉換為NaN后做加法
需要特別注意的是,當加號運算符和字符串和數字一起使用時,需要考慮加法的結合性的對運算順序的影響。也就是說,運算結果是依賴於運算符的運算順序的,比如:
1 + 1 + '1'; // => '21' 1 +(1 + '1'); // => '111'
第一行沒有圓括號,“+”運算符具有從左至右的結合性,因此兩個數字首先進行加法計算,計算結果和字符串進行連接。在第二行中,圓括號改變了運算順序:數字1和字符串連接,生成一個新字符串,然后數字1和這個新字符串再次連接,生成了最終結果。
二元減法(-)
當“-”用做二元運算符時,它會根據需要把操作數轉換為數字,然后再進行減法運算。
1-0 // => 1: 減法 '1'-0 // => 1: 字符串轉為數字后進行減法運算 '1'-'0'// => 1: 字符串轉為數字后進行減法運算
遞增(++)
需要注意的是,“++”運算符從不進行字符串連接操作,它總是會將操作數轉換為數字並增1。表達式++x並不總和x=x+1完全一樣。
var x='1'; var y=x+1; // =>'11': 字符串連接 var z=++x; //=> 2:字符串轉為數字后增1
總結:
JavaScript中的某些運算符會做隱式的類型轉換。一元運算符“+”,“-”,“++”,二元運算符“-”都會把操作數隱式的轉換為數字,二元運算符“+”比較特殊,當有操作數是字符串,它將會把另外一個操作數轉換為字符串。
x + '' // 等價於String(x) +x // 等價於Number(x)
下面是我的公眾號,歡迎大家關注,大家一起學習一起進步
參考文章鏈接:https://www.javazhiyin.com/11742.html