JS的隱式轉換 從 false 說起

2021-09-11 14:54:27 字數 2747 閱讀 2272

最近和大創扯淡時說到了 == false,從結果上來看我倆都答錯了,從氣勢上來說我倆的歪理都能出書了(恩,程式猿的驕傲),但是這其實背後隱藏了一潭很深的水,對,很深。。。

首先,回想一下js的型別都有什麼。

原始值(primitives): undefined, null, booleans, numbers,strings, symbol(es6)

物件值(objects): object

ok, 這就是全部了,我們接下來看看到底發生了什麼導致隱式轉換如此不可捉摸。

在發生轉換的時候,js其實都是會將操作物件轉化為原始的物件,這也是最為詬病的地方,因為js很難直接丟擲錯誤,她會用一套自己的方法去理解我們的錯誤,並做相應的調整,哪怕這些錯誤我們是無意識的。所以我們要知道她的轉換方式,才能做到知己知彼,對**的控制更為精準。

簽名:toprimitive(input, preferredtype?) //preferredtype: number 或者 string

流程如下:

input為原始值,直接返回;

不是原始值,呼叫該物件的valueof()方法,如果結果是原始值,返回原始值;

呼叫valueof()不是原始值,呼叫此物件的tostring()方法,如果結果為原始值,返回原始值;

如果返回的不是原始值,丟擲異常typeerror。

其中preferredtype控制線調取valueof()還是tostring()。

ps: date型別按照string去呼叫。

ok,通過這個隱式裝箱,我們得到了運算元的原始值。接下來,我們根據不同情況,看看發生了什麼呢~

想必大家用過以下做法去完成型別轉換吧

var str = '1';

var num = str - 0;

var num = 2;

var str = num + '';複製**

這種類似的數**算會做型別轉換,但是『+』尤為致命,為啥捏?

當'+'作為雙目運算子時,如a+b。

它的執行如下:

計算兩個運算元的原始值: prima = toprimitive(a), prima = toprimitive(b);

如果原始值有string,全部轉換為string,返回string相加後的結果;

如果原始值沒有string,全部轉換為number, 返回number相加後的結果;

當'+'作為單目運算子時, 例如 +a.

流程是這樣的:

將a轉換為number,number(a);

舉個栗子:

1. 轉換為原始型別 toprimitive();

.valueof();//,不是原始型別

.tostring();//"",真是令人髮指的轉換

2. 都為string,所以返回字串想家的結果

return

"" + "";複製**

{} + 與 + {}

{} + 

1. 在瀏覽器中,js引擎認為第乙個{}為空**塊,所以 這裡的 '+'是單目運算子(node中認為是物件,解析為"[object object]")

toprimitive(); //""

2. number("");//0

+ {}

1. toprimitive(); //""

toprimitive({}); //"[object object]"

2. 都為string

return

"" + "[object object]";//"[object object]"

複製**

複製**

ps: .valueof 為, 但在es6中js會優先呼叫[symbol toprimitive]來轉換為原始型別。

首先,比較運算分為2種, 一種為嚴格比較(===),只有型別相等,值也一致時才會為true,否則為false, 另一種為抽象相等也叫寬鬆相等(==),現將運算數轉化為相同型別,再做比較,具體過程見 abstract equality comparison algorithm。

這個演算法大致說了這麼幾個情況,x+y

回到這篇文章的導火索, == false

1.存在object, 轉化為原始值

toprimitive(); // ''

2.乙個string, 另外為boolean,都轉為number

number('');//0

number(false);//0

3.return 0 == 0;/true

複製**

value

tonumber

tostring

toboolean

nannan

"nan"

false

infinity

infinity

"infinity"

true

0'""

true

[1]1

"1"true

null

0"null"

false

undefined

nan"undefined"

false

{}nan

"[object object]"

true

function()

nan"function"

true

js 隱式轉換

1.數字number與字串string相加的就,最後會得到乙個字串string 1 3 13 2.數字number與字串string相減,最後會得到乙個數字number 1 0 1,s 0 nan 3.數字number與字串string相乘 最後會得到乙個數字number 1 10 10,s 10 ...

js隱式轉換

js基礎資料型別 string number boolean null undefined symbol 當運算子在運算時,如果運算子兩邊的資料型別不一致,那麼cpu就無法進行計算。js的編輯器會自動將運算子兩邊的資料轉換為同一型別,從而讓計算機識別並可以進行計算,這一轉換過程由編譯器自動自行,不需...

js 隱式轉換

其它型別轉換成布林型別 1.未聲名的變數名 undefined false 2.變數名為 null 為空 null false 3.number 0 0.0 0 0 nan false 4.空字串 false 5.其它物件 true 1 其它型別轉換為數值型 number 1.undefined n...