a==3 && a==4
爲True
是能夠實現的。
具體代碼以下所示:javascript
let a=[]; var x=3; a.valueOf=()=>{ return x++ }; a==3 && a==4 ? console.log("succeed") : console.log("failed"); //succeed
下面妹子我將一一解析其原理。java
let a=[]
定義一個變量a
,並賦值一個對象,方便後面重寫它的valueOf
方法。
能夠經過Object.isFrozen()
方法來判斷一個對象的屬性是否能夠重寫。git
根據 MDN Web 文檔-Object.isFrozen():https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozengithub
在 ES5 中,若是參數不是一個對象類型,將拋出一個TypeError
異常。在 ES2015 中,非對象參數將被視爲一個凍結的普通對象,所以會返回true
。
Object.isFrozen(""); // true (ES2015 code) Object.isFrozen({}); // false (ES2015 code)
注意:因此a
必定要是對象,若是a是非對象的其餘基本類型如String
,,被視爲凍結對象,不能重寫valueOf
,則不起效果。app
let a=""; //非對象 var x=3; a.valueOf=()=>{ return x++ }; a==3 && a==4 ? console.log("succeed") : console.log("failed"); //failed
a==3 && a==4
根據 MDN Web 文檔-運算符優先級:[https://developer.mozilla.org...
](https://developer.mozilla.org...ui
==
的優先級爲10 ,&&
的優先級爲6,==
的優先級更高,因此先運行a==3
,再運行a==3
,最後進行&&
判斷。spa
a==3
爲True根據 MDN Web 文檔-比較操做符:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operatorscode
若是一個對象與數字或字符串相比較,JavaScript會嘗試返回對象的默認值。操做符會嘗試經過方法valueOf和toString將對象轉換爲其原始值(一個字符串或數字類型的值)。
因此將會運行a.valueOf()
,x
加1
。對象
let a=[]; var x=3; a.valueOf=()=>{ return x++ }; if(a==3){ console.log(x); } //4
a==4
爲True這時x
已經爲4
,運行a.valueOf
返回值也爲4
。ip
let a=[]; var x=3; a.valueOf=()=>{ return x++ }; if(a==3){ console.log(x); } //4 if(a==4){ console.log(x); } //5
a==3 && a==4
爲true如上所示a==3
爲True
,a==4
爲True
,則true && true
爲True
let a=[]; var x=3; a.valueOf=()=>{ return x++ }; a==3 && a==4 ? console.log("succeed") : console.log("failed"); //succeed
Happy coding .. :)