摘要:前言為是可以實現(xiàn)的。在中,非對象參數(shù)將被視為一個凍結(jié)的普通對象,因此會返回。注意所以一定要是對象,如果是非對象的其他基本類型如,,被視為凍結(jié)對象,不能重寫,則不起效果。第四步為這時已經(jīng)為,運行返回值也為。最后為如上所示為,為,則為其他鏈接
前言
a==3 && a==4為True是可以實現(xiàn)的。
具體代碼如下所示:
let a=[]; var x=3; a.valueOf=()=>{ return x++ }; a==3 && a==4 ? console.log("succeed") : console.log("failed"); //succeed
下面妹子我將一一解析其原理。
第一步 let a=[]定義一個變量a,并賦值一個對象,方便后面重寫它的valueOf方法。
可以通過Object.isFrozen()方法來判斷一個對象的屬性是否可以重寫。
根據(jù) MDN Web 文檔-Object.isFrozen():https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen
在 ES5 中,如果參數(shù)不是一個對象類型,將拋出一個TypeError異常。在 ES2015 中,非對象參數(shù)將被視為一個凍結(jié)的普通對象,因此會返回true。
Object.isFrozen(""); // true (ES2015 code) Object.isFrozen({}); // false (ES2015 code)
注意:所以a一定要是對象,如果a是非對象的其他基本類型如String,,被視為凍結(jié)對象,不能重寫valueOf,則不起效果。
let a=""; //非對象 var x=3; a.valueOf=()=>{ return x++ }; a==3 && a==4 ? console.log("succeed") : console.log("failed"); //failed第二步 a==3 && a==4
根據(jù) MDN Web 文檔-運算符優(yōu)先級:[https://developer.mozilla.org...
](https://developer.mozilla.org...
==的優(yōu)先級為10 ,&&的優(yōu)先級為6,==的優(yōu)先級更高,所以先運行a==3,再運行a==3,最后進行&&判斷。
第三步 a==3為True根據(jù) MDN Web 文檔-比較操作符:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators
如果一個對象與數(shù)字或字符串相比較,JavaScript會嘗試返回對象的默認值。操作符會嘗試通過方法valueOf和toString將對象轉(zhuǎn)換為其原始值(一個字符串或數(shù)字類型的值)。
所以將會運行a.valueOf(),x加1。
let a=[]; var x=3; a.valueOf=()=>{ return x++ }; if(a==3){ console.log(x); } //4第四步 a==4為True
這時x已經(jīng)為4,運行a.valueOf返回值也為4。
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其他鏈接
https://raoenhui.github.io/js/2018/09/22/compare1/
https://raoenhui.github.io/js/2018/09/23/compare2/
https://raoenhui.github.io/js/2018/09/28/compare3/
Happy coding .. :)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/97976.html
本篇文章主要是講述在JavaScript中判斷兩個值相等,不要認為很簡單,要注意的是在JavaScript中存在4種不同的相等邏輯。 ECMAScript 是 JavaScript 的語言規(guī)范,在ECMAScript 規(guī)范中存在四種相等算法,如下圖所示: 上圖中每個依次寫下來,很多前端應該熟悉嚴格相等和非嚴格相等,但對于同值零和同值卻不熟悉,現(xiàn)在就依次下面四種方法?! ⊥怠 ⊥盗恪 》?..
摘要:的簡介是一個基于的模板引擎。使用,也可以寫成。所以,應該使用規(guī)范的格式書寫現(xiàn)在知道變量是而不是。如當頁面中包含,如果對象有值,將顯示的值,如果不存在對象同,則在頁面中將顯示字符。 velocity的簡介 Velocity是一個基于java的模板引擎(template engine)。它允許任何人僅僅簡單的使用模板語言(template language)來引用由java代碼定義的對象,...
摘要:的簡介是一個基于的模板引擎。使用,也可以寫成。所以,應該使用規(guī)范的格式書寫現(xiàn)在知道變量是而不是。如當頁面中包含,如果對象有值,將顯示的值,如果不存在對象同,則在頁面中將顯示字符。 velocity的簡介 Velocity是一個基于java的模板引擎(template engine)。它允許任何人僅僅簡單的使用模板語言(template language)來引用由java代碼定義的對象,...
let和const let和const兩者并不存在變量提升 這里要說明的是變量一定要在聲明后使用,否則報錯。 vara=[]; for(vari=0;i<10;i++){ a[i]=function(){ console.log(i); }; } a[6]();//10 變量i是var聲明的,我們要知道這里在全局范圍內(nèi)都有效。我們要知道在每一次循環(huán)中,新的...
摘要:所以為為第二步轉(zhuǎn)成根據(jù)文檔比較操作符如果一個對象與數(shù)字或字符串相比較,會嘗試返回對象的默認值。嘗試將數(shù)字字面量轉(zhuǎn)換為數(shù)字類型的值。 [] == false; //為True !![] == false; //為False 一、[] == false為True 第一步 轉(zhuǎn)成[] == 0 根據(jù) MDN Web 文檔-比較操作符:https://developer.mozilla.org...
閱讀 3073·2023-04-26 00:49
閱讀 3733·2021-09-29 09:45
閱讀 1007·2019-08-29 18:47
閱讀 2753·2019-08-29 18:37
閱讀 2738·2019-08-29 16:37
閱讀 3301·2019-08-29 13:24
閱讀 1784·2019-08-27 10:56
閱讀 2355·2019-08-26 11:42