要是別人問您:“如何讓 x 等于 1 且讓 x 等于 2 且讓 x 等于 3 的等式成立?”
咋地,知道如何實(shí)現(xiàn)?想罵人有不
現(xiàn)在我們一起來分解思路:
我們先來講講寬松相等== 和嚴(yán)格相等 ===,這兩個(gè)都能用來判斷兩個(gè)值是否“相等”,但們明確上文提到的等于指的是哪一種,二者的區(qū)別看下:
(1) 這兩個(gè)基礎(chǔ)直接的區(qū)別:
(1.1) 不同類型間比較,== 比較“轉(zhuǎn)化成同一類型后的值”看“值”是否相等,=== 如果類型不同,其結(jié)果就是不等。
(1.2) 同類型比較,直接進(jìn)行“值”比較,兩者結(jié)果一樣
(2) 對(duì)于引用類型之間的比較,== 和 === 是沒有區(qū)別的,都進(jìn)行“指針地址”比較
(3) 基礎(chǔ)類型與引用類型之間的比較,== 和 === 是有區(qū)別的:
(3.1) 對(duì)于 ==,將引用類型轉(zhuǎn)化為基礎(chǔ)類型,進(jìn)行“值”比較
(3.2) 因?yàn)轭愋筒煌?== 結(jié)果為 false
“== 允許在相等比較中進(jìn)行強(qiáng)制類型轉(zhuǎn)換,而 === 不允許?!?/strong>
因此,我們可以看到等于指的寬松相等 ==,題目變?yōu)?“x == 1 && x == 2 && x == 3”。
在多種數(shù)據(jù)類型之間的相等比較出現(xiàn)哪些?現(xiàn)在我們看看:
同類型數(shù)據(jù)之間的相等比較
如果Type(x)等于Type(y)ES5 規(guī)范 11.9.3.1這樣定義:
如果Type(x)是Undefined,返回true。
如果Type(x)是Null,返回true。
如果Type(x)是Number,則
如果x是NaN,返回false。
如果y是NaN,返回false。
如果x與y的數(shù)字值相同,返回true。
如果x為+0,y為-0,返回true。
如果x為-0,y為+0,返回true。
如果Type(x)是String,則如果x和y是字符的序列完全相同(相同的長度和相同位置相同的字符),則返回true。否則,返回false。
如果Type(x)是Boolean,則如果x和y都為true或都為false,則返回true。否則,返回false。
如果x和y指向同一對(duì)象,則返回true。否則,返回false。
null 和 undefined 之間的相等比較
null和undefined之間的 == 也涉及隱式強(qiáng)制類型轉(zhuǎn)換。ES5 規(guī)范 11.9.3.2-3這樣定義:
如果x為null,y為undefined,則結(jié)果為true。
如果x為undefined,y為null,則結(jié)果為true。
在 == 中,null和undefined相等(它們也與其自身相等),除此之外其他值都不和它們兩個(gè)相等。
這也就是說, 在 == 中null和undefined是一回事。
var a = null; var b; a == b; // true a == null; // true b == null; // true a == false; // false b == false; // false a == ""; // false b == ""; // false a == 0; // false b == 0; // false
字符串和數(shù)字之間的相等比較
ES5 規(guī)范 11.9.3.4-5這樣定義:
如果Type(x)是數(shù)字,Type(y)是字符串,則返回x==ToNumber(y)的結(jié)果。
如果Type(x)是字符串,Type(y)是數(shù)字,則返回ToNumber(x)==y的結(jié)果?!?/p>
var a = 42; var b = "42"; a === b; // false a == b; // true
復(fù)制代碼
在不強(qiáng)制條件下,當(dāng)a===b為false,42 和 "42" 不相等。
按照規(guī)范來說"42" 應(yīng)該被強(qiáng)制類型轉(zhuǎn)換為數(shù)字以便進(jìn)行相等比較。
我們?cè)賮碚f說其他類型和布爾類型之間的相等比較
ES5 規(guī)范 11.9.3.6-7這樣定義:
如果Type(x)是布爾類型,則返回ToNumber(x)==y的結(jié)果;
如果Type(y)是布爾類型,則返回x==ToNumber(y)的結(jié)果。
仔細(xì)分析例子,首先:
var x = true; var y = "42"; x == y; // false
Type(x)是布爾值,所以ToNumber(x)將true強(qiáng)制類型轉(zhuǎn)換為 1,變成 1 == "42",二者的類型仍然不同,"42" 根據(jù)規(guī)則被強(qiáng)制類型轉(zhuǎn)換為 42,最后變成 1 == 42,結(jié)果為false。
對(duì)象和非對(duì)象之間的相等比較
關(guān)于對(duì)象(對(duì)象 / 函數(shù) / 數(shù)組)和標(biāo)量基本類型(字符串 / 數(shù)字 / 布爾值)之間的相等比較,ES5 規(guī)范 11.9.3.8-9做如下規(guī)定:
如果Type(x)是字符串或數(shù)字,Type(y)是對(duì)象,則返回x==ToPrimitive(y)的結(jié)果;
如果Type(x)是對(duì)象,Type(y)是字符串或數(shù)字,則返回ToPromitive(x)==y的結(jié)果。
那toPrimitive() 函數(shù)又是什么?
**應(yīng)用場(chǎng)景:**在JavaScript中,我們想將對(duì)象轉(zhuǎn)換成基本類型時(shí),再次從基本類型轉(zhuǎn)換為對(duì)應(yīng)的String或者Number,實(shí)質(zhì)就是調(diào)用valueOf和toString方法,這就是拆箱轉(zhuǎn)換。
**函數(shù)結(jié)構(gòu):**toPrimitive(input, preferedType?)
參數(shù)解釋:
input是輸入的值,即要轉(zhuǎn)換的對(duì)象,必選;
preferedType是期望轉(zhuǎn)換的基本類型,他可以是字符串,也可以是數(shù)字。選填,默認(rèn)為number;
執(zhí)行過程:
如果轉(zhuǎn)換的類型是number,會(huì)執(zhí)行以下步驟:
如果input是原始值,直接返回這個(gè)值;
否則,如果input是對(duì)象,調(diào)用input.valueOf(),如果結(jié)果是原始值,返回結(jié)果;
否則,調(diào)用input.toString()。如果結(jié)果是原始值,返回結(jié)果;
否則,拋出錯(cuò)誤。 如果轉(zhuǎn)換的類型是string,2和3會(huì)交換執(zhí)行,即先執(zhí)行toString()方法。
valueOf 和 toString 的優(yōu)先級(jí):
進(jìn)行對(duì)象轉(zhuǎn)換時(shí)(alert(對(duì)象)),優(yōu)先調(diào)用toString方法,如沒有重寫toString將調(diào)用valueOf方法,如果兩方法都不沒有重寫,但按Object的toString輸出。
進(jìn)行強(qiáng)轉(zhuǎn)字符串類型時(shí)將優(yōu)先調(diào)用toString方法,強(qiáng)轉(zhuǎn)為數(shù)字時(shí)優(yōu)先調(diào)用valueOf。
在有運(yùn)算操作符的情況下,valueOf的優(yōu)先級(jí)高于toString。
由此可知,若 x 為對(duì)象時(shí),我們改寫 x 的 valueOf 或 toString 方法可以讓標(biāo)題的等式成立:
const x = { val: 0, valueOf: () => { x.val++ return x.val }, }
或者:
const x = { val: 0, toString: () => { x.val++ return x.val }, }
給對(duì)象 x 設(shè)置一個(gè)屬性 val 并賦值為 0,并修改其 valueOf、toString 方法,在 “x == 1 && x == 2 && x == 3”判斷執(zhí)行時(shí),每次等式比較都會(huì)觸發(fā) valueOf、toString 方法,都會(huì)執(zhí)行 val++ ,同時(shí)把最新的 val 值用于等式比較,三次等式判斷時(shí) val 值分別為 1、2、3 與等式右側(cè)的 1、2、3 相同,從而使等式成立。
相關(guān)內(nèi)容已講述完畢,希望對(duì)大家有幫助。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/128015.html
摘要:原始類型值比較原始類型值有五種布爾值字符串?dāng)?shù)值。用來比較兩個(gè)值是否嚴(yán)格相等,與嚴(yán)格比較運(yùn)算符的行為基本一致。返回布爾值,相等返回,不相等返回。 比較運(yùn)算符之相等運(yùn)算符 ES5 比較兩個(gè)值是否相等,只有兩個(gè)運(yùn)算符:相等運(yùn)算符(==)和嚴(yán)格相等運(yùn)算符(===)。前者在比較時(shí)對(duì)于不同數(shù)據(jù)類型的值會(huì)進(jìn)行類型轉(zhuǎn)換;而后者不會(huì)轉(zhuǎn)換,且結(jié)果更容易預(yù)測(cè),并且因?yàn)闆]有隱式轉(zhuǎn)換,全等比較的運(yùn)行會(huì)更快。因此...
摘要:等式右邊的問號(hào)和結(jié)果不應(yīng)同時(shí)顯示出來,在用戶思考時(shí)應(yīng)顯示問號(hào),思考結(jié)束后應(yīng)隱藏問號(hào)顯示結(jié)果。為了增加一點(diǎn)加法的難度,我們把設(shè)置為略此時(shí),每刷新一次頁面,運(yùn)算數(shù)就會(huì)跟著刷新,因?yàn)槊看雾撁婕虞d都會(huì)運(yùn)行方法生成新的隨機(jī)數(shù)。 showImg(https://segmentfault.com/img/bVblK5u?w=400&h=301); 效果預(yù)覽 按下右側(cè)的點(diǎn)擊預(yù)覽按鈕可以在當(dāng)前頁面預(yù)覽,...
閱讀 596·2023-03-27 18:33
閱讀 790·2023-03-26 17:27
閱讀 684·2023-03-26 17:14
閱讀 645·2023-03-17 21:13
閱讀 573·2023-03-17 08:28
閱讀 1895·2023-02-27 22:32
閱讀 1377·2023-02-27 22:27
閱讀 2280·2023-01-20 08:28