js雙等號探索(二): a==3&&a==4 爲true ?

前言

a==3 && a==4True是能夠實現的。
具體代碼以下所示: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

isFrozen.png

在 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

compare.png

==的優先級爲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

image.png

若是一個對象與數字或字符串相比較,JavaScript會嘗試返回對象的默認值。操做符會嘗試經過方法valueOf和toString將對象轉換爲其原始值(一個字符串或數字類型的值)。

因此將會運行a.valueOf()x1對象

let a=[];
var x=3;
a.valueOf=()=>{
   return x++
};
if(a==3){
  console.log(x); 
}
//4

第四步 a==4爲True

這時x已經爲4,運行a.valueOf返回值也爲4ip

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==3Truea==4True,則true && trueTrue

let a=[];
var x=3;
a.valueOf=()=>{
   return x++
};
a==3 && a==4 ? console.log("succeed") : console.log("failed");
//succeed

其餘連接

Happy coding .. :)

相關文章
相關標籤/搜索