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