最近和大創扯淡時說到了 == 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...