當 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 + 2 // => 3: 加法
"1" + "2" // => "12": 字符串連接
"1" + 2 // => "12": 數字轉換為字符串后進行字符串連接
1 + {} // => "1[object Object]": 對象轉換為字符串后進行字符串連接
true + true // => 2: 布爾值轉換為數字后做加法
2 + null // => 2: null轉換為0后做加法
2 + undefined// => NaN: undefined轉換為NaN后做加法
需要特別注意的是,當加號運算符和字符串和數字一起使用時,需要考慮加法的結合性的對運算順序的影響。也就是說,運算結果是依賴於運算符的運算順序的,比如:
1 + 2 + " blind mice"; // => "3 blind mice"
1 +(2 + " blind mice"); // => "12 blind mice"
第一行沒有圓括號,“+”運算符具有從左至右的結合性,因此兩個數字首先進行加法計算,計算結果和字符串進行連接。在第二行中,圓括號改變了運算順序:數字2和字符串連接,生成一個新字符串,然后數字1和這個新字符串再次連接,生成了最終結果。
二元減法(-)
當“-”用做二元運算符時,它會根據需要把操作數轉換為數字,然后再進行減法運算。
1-0 // => 1: 減法
'1'-0 => 1: 字符串轉為數字后進行減法運算
'1'-'0' => 1: 字符串轉為數字后進行減法運算
遞增(++)
需要注意的是,“++”運算符從不進行字符串連接操作,它總是會將操作數轉換為數字並增1。表達式++x並不總和x=x+1完全一樣。
var x='1';
var y=x+1; //y的值是‘11’
var z=++x;//z的值是2
typeof(y));// "string"
typeof(z));//"number"
總結:
JavaScript中的某些運算符會做隱式的類型轉換,有時用於類型轉換。一元運算符“+”,“-”,“++”,二元元算法“-”都會把操作數隱式的轉換為數字,二元運算符“+”比較特殊,當有操作數是字符串,它將會把另外一個操作數轉換為字符串。
x + "" // 等價於String(x)
+x // 等價於Number(x)
當 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 + 2 // => 3: 加法
"1" + "2" // => "12": 字符串連接
"1" + 2 // => "12": 數字轉換為字符串后進行字符串連接
1 + {} // => "1[object Object]": 對象轉換為字符串后進行字符串連接
true + true // => 2: 布爾值轉換為數字后做加法
2 + null // => 2: null轉換為0后做加法
2 + undefined// => NaN: undefined轉換為NaN后做加法
需要特別注意的是,當加號運算符和字符串和數字一起使用時,需要考慮加法的結合性的對運算順序的影響。也就是說,運算結果是依賴於運算符的運算順序的,比如:
1 + 2 + " blind mice"; // => "3 blind mice"
1 +(2 + " blind mice"); // => "12 blind mice"
第一行沒有圓括號,“+”運算符具有從左至右的結合性,因此兩個數字首先進行加法計算,計算結果和字符串進行連接。在第二行中,圓括號改變了運算順序:數字2和字符串連接,生成一個新字符串,然后數字1和這個新字符串再次連接,生成了最終結果。
二元減法(-)
當“-”用做二元運算符時,它會根據需要把操作數轉換為數字,然后再進行減法運算。
1-0 // => 1: 減法
'1'-0 => 1: 字符串轉為數字后進行減法運算
'1'-'0' => 1: 字符串轉為數字后進行減法運算
遞增(++)
需要注意的是,“++”運算符從不進行字符串連接操作,它總是會將操作數轉換為數字並增1。表達式++x並不總和x=x+1完全一樣。
var x='1';
var y=x+1; //y的值是‘11’
var z=++x;//z的值是2
typeof(y));// "string"
typeof(z));//"number"
總結:
JavaScript中的某些運算符會做隱式的類型轉換,有時用於類型轉換。一元運算符“+”,“-”,“++”,二元元算法“-”都會把操作數隱式的轉換為數字,二元運算符“+”比較特殊,當有操作數是字符串,它將會把另外一個操作數轉換為字符串。
x + "" // 等價於String(x)
+x // 等價於Number(x)