if(a == 1 && a == 2 && a == 3){
console.log("我走進來了");
}
<!--答案1:-->
var a = {num:0};
a.valueOf = function(){
return ++a.num
}
<!--答案2:-->
var num = 1;
function a(){
return num++;
}
if(a() == 1 && a() == 2 && a() == 3){
console.log("我走進來了");
}
<!--答案3:-->
var num = 0;
Function.prototype.toString = function(){
return ++num;
}
function a(){}
<!--答案4:-->
var a = {[Symbol.toPrimitive]: ((i) => () => ++i) (0)};
複製代碼
==
和 ===
寬鬆相等==
和嚴格相等===
都是來判斷兩個值是夠「相等」,可是他們有兩個有一個很重要的區別 ==
容許在相等比較中進行強制類型轉換,而===
不容許 那麼這也是這道題之因此成爲這道題的緣由。編程
關於(對象/函數/數組)和標量基本類型(字符串/數字/布爾值)之間相等比較,ES5有下面規定:數組
Type(x)
是字符串或數字,Type(y)
是對象,則返回x == ToPrimitive(y)
的結果;Type(x)
是對象,Type(y)
是字符串或數字,則返回ToPromitive(x) == y
的結果。那麼ToPromitive操做是什麼呢?bash
對象(包括數組)會轉換爲相應的基本類型,
ToPromitive
會首先檢查該值是否有valueOf()
方法。若是有並返回基本類型值,就使用該值進行強制類型轉換。若是沒有就使用toString()
的返回值(若是存在)來進行強制類型轉換。函數若是
valueOf()
和toString()
均不返回基本類型值,會產生TypeError
錯誤。ui
那麼按照這個規則那麼答案一的原理就顯而易見了。spa
那麼按照這個規則下面代碼也能夠正常運行prototype
var a = [3,4]
a.i = 0;
a.valueOf = function() {
return ++a.i
}
// 或者
// a.toString = function() {
// return ++a.i
// }
if(a == 1 && a == 2 && a == 3){
console.log("我走進來了");
}
複製代碼
注意:數組也是對象,因此也能夠賦值屬性,因此a.i是正確的寫法,通常不推薦這麼作!!code
你們能夠看到在答案一和答案二中有一個區別是 ++a
和 a++
那麼他們的初始值也是不同的,那麼這個是爲何呢? 這個就要說到++a
和a++
的反作用了。對象
大部分的表達式是沒有反作用的,咱們來看下下面的代碼原型鏈
function foo(){
a = a + 1
}
var a = 1
foo() // 結果值:undefined。反作用:a的值被改變
複製代碼
再看
var a = 1
var b = a++
複製代碼
a++
首先返回變量a
的當前值1,再將值賦值給b,而後將a
的值加1:
var a = 1
var b = a++
a // 2
b // 1
複製代碼
看下面代碼
var a = 1
a++ // 1
a // 2
++a // 3
a++ // 3
複製代碼
++
在前面時,它的反作用產生在表達式返回結果以前,而a++
的反作用則產生在以後。
根據上面的這些原理,那麼也就解釋了num++
和a.num++
和爲何他們的初始值不相同了。
Symbol.toPrimitive
這是元編程的裏面的東西。那麼什麼是元編程呢?
元編程是針對程序自己的行爲進行操做的編程。換句話說,它是爲你的程序的編程而進行的編程。
元編程關注幾點:代碼檢視本身,代碼修改本身,或者代碼修改默認的語言行爲而使其她代碼受影響
那麼咱們來看toPrimitive
== 操做符將在一個對象上不使用任何提示來調用ToPrimitive
操做--若是存在@@toPrimitive方法
的話,將使用default
被調用
Function.prototype.toString
因爲原型鏈的關係,方法a(){}能夠調用到Function上的toString()方法。 那固然下面的代碼也可使用開發中不要這麼作
var num = 0;
Object.prototype.toString = function(){
return ++num;
}
複製代碼
以上就是這道題的原理解析,有什麼不一樣的錯誤請你們指正和提出意見建議。
但願你們知其然知其因此然,也但願社區裏關於這些題能給出更多的原理分析和解析,而不是簡單的寫出一個答案。
願世界和平!
封面: ColiN00B