JS-隱士類型轉換‘1’+1、‘1’-1、++‘1’為什么不一樣?


當 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 + ""   // 等價於Stringx

+x      // 等價於Numberx

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 + ""   // 等價於Stringx

+x      // 等價於Numberx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM