最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript中如何讓?x?==?1?&&?x?==?2?&&?x?==?3?等式成立

 更新時間:2022年07月13日 08:47:20   作者:??政采云前端團隊?  
這篇文章主要介紹了JavaScript中如何讓x==1&&x==2&&x==3等式成立,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下

前言

某次面試,面試官突然問道:“如何讓 x 等于 1 且讓 x 等于 2 且讓 x 等于 3 的等式成立?

話音剛落,筆者立馬失去意識,雙眼一黑,兩腿一蹬,心里暗罵:什么玩意兒!

雖然當時沒回答上來,但覺得這題非常有意思,便在這為大家分享下后續(xù)的解題思路:

寬松相等 == 和嚴格相等 === 都能用來判斷兩個值是否“相等”,首先,我們要明確上文提到的等于指的是哪一種,我們先看下二者的區(qū)別:

(1) 對于基礎類型之間的比較,== 和 === 是有區(qū)別的:

  • (1.1) 不同類型間比較,== 比較“轉(zhuǎn)化成同一類型后的值”看“值”是否相等,=== 如果類型不同,其結(jié)果就是不等
  • (1.2) 同類型比較,直接進行“值”比較,兩者結(jié)果一樣

(2) 對于引用類型之間的比較,== 和 === 是沒有區(qū)別的,都進行“指針地址”比較 

(3) 基礎類型與引用類型之間的比較,== 和 === 是有區(qū)別的:

  • (3.1) 對于 ==,將引用類型轉(zhuǎn)化為基礎類型,進行“值”比較
  • (3.2) 因為類型不同,=== 結(jié)果為 false

“== 允許在相等比較中進行強制類型轉(zhuǎn)換,而 === 不允許。”

由此可見,上文提到的等于指的寬松相等 ==,題目變?yōu)?“x == 1 && x == 2 && x == 3”。

那多種數(shù)據(jù)類型之間的相等比較又有哪些呢?筆者查閱了相關(guā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 指向同一對象,則返回 true。否則,返回 false

null 和 undefined 之間的相等比較

null 和 undefined 之間的 == 也涉及隱式強制類型轉(zhuǎn)換。ES5 規(guī)范 11.9.3.2-3 這樣定義:

  • 如果 x 為 nully 為 undefined,則結(jié)果為 true。
  • 如果 x 為 undefined,y 為 null,則結(jié)果為 true

在 == 中,null 和 undefined 相等(它們也與其自身相等),除此之外其他值都不和它們兩個相等。

這也就是說, 在 == 中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é)果。
var a = 42;

var b = "42";

a === b; // false

a == b; // true
復制代碼

因為沒有強制類型轉(zhuǎn)換,所以 a === b 為 false,42 和 "42" 不相等。

根據(jù)規(guī)范,"42" 應該被強制類型轉(zhuǎn)換為數(shù)字以便進行相等比較。

其他類型和布爾類型之間的相等比較

ES5 規(guī)范 11.9.3.6-7 這樣定義:

  • 如果 Type(x) 是布爾類型,則返回 ToNumber(x) == y 的結(jié)果;
  • 如果 Type(y) 是布爾類型,則返回 x == ToNumber(y) 的結(jié)果。

仔細分析例子,首先:

var x = true;
var y = "42";
x == y; // false

Type(x) 是布爾值,所以 ToNumber(x) 將 true 強制類型轉(zhuǎn)換為 1,變成 1 == "42",二者的類型仍然不同,"42" 根據(jù)規(guī)則被強制類型轉(zhuǎn)換為 42,最后變成 1 == 42,結(jié)果為 false

對象和非對象之間的相等比較

關(guān)于對象(對象 / 函數(shù) / 數(shù)組)和標量基本類型(字符串 / 數(shù)字 / 布爾值)之間的相等比較,ES5 規(guī)范 11.9.3.8-9 做如下規(guī)定:

  • 如果 Type(x) 是字符串或數(shù)字,Type(y) 是對象,則返回 x == ToPrimitive(y) 的結(jié)果;
  • 如果 Type(x) 是對象,Type(y) 是字符串或數(shù)字,則返回 ToPromitive(x) == y 的結(jié)果。

什么是 toPrimitive() 函數(shù)?

**應用場景:**在 JavaScript 中,如果想要將對象轉(zhuǎn)換成基本類型時,再從基本類型轉(zhuǎn)換為對應的 String 或者 Number,實質(zhì)就是調(diào)用 valueOf 和 toString 方法,也就是所謂的拆箱轉(zhuǎn)換。

**函數(shù)結(jié)構(gòu):**toPrimitive(input, preferedType?)

參數(shù)解釋:

input 是輸入的值,即要轉(zhuǎn)換的對象,必選;

preferedType 是期望轉(zhuǎn)換的基本類型,他可以是字符串,也可以是數(shù)字。選填,默認為 number;

執(zhí)行過程:

如果轉(zhuǎn)換的類型是 number,會執(zhí)行以下步驟:

  • 如果 input 是原始值,直接返回這個值;
  • 否則,如果 input 是對象,調(diào)用 input.valueOf(),如果結(jié)果是原始值,返回結(jié)果;
  • 否則,調(diào)用input.toString()。如果結(jié)果是原始值,返回結(jié)果;
  • 否則,拋出錯誤。 如果轉(zhuǎn)換的類型是 string,2和3會交換執(zhí)行,即先執(zhí)行 toString() 方法。

valueOf 和 toString 的優(yōu)先級:

  • 進行對象轉(zhuǎn)換時 (alert(對象)),優(yōu)先調(diào)用 toString 方法,如沒有重寫 toString 將調(diào)用 valueOf 方法,如果兩方法都不沒有重寫,但按 Object 的 toString 輸出。
  • 進行強轉(zhuǎn)字符串類型時將優(yōu)先調(diào)用 toString 方法,強轉(zhuǎn)為數(shù)字時優(yōu)先調(diào)用 valueOf。
  • 在有運算操作符的情況下,valueOf 的優(yōu)先級高于 toString

由此可知,若 x 為對象時,我們改寫 x 的 valueOf 或 toString 方法可以讓標題的等式成立:

const x = {
  val: 0,
  valueOf: () => {
    x.val++
    return x.val
  },
}

或者:

const x = {
  val: 0,
  toString: () => {
    x.val++
    return x.val
  },
}

給對象 x 設置一個屬性 val 并賦值為 0,并修改其 valueOf、toString 方法,在 “x == 1 && x == 2 && x == 3”判斷執(zhí)行時,每次等式比較都會觸發(fā) valueOf、toString 方法,都會執(zhí)行 val++ ,同時把最新的 val 值用于等式比較,三次等式判斷時 val 值分別為 1、2、3 與等式右側(cè)的 1、2、3 相同,從而使等式成立。

到此這篇關(guān)于JavaScript中如何讓 x == 1 && x == 2 && x == 3 等式成立的文章就介紹到這了,更多相關(guān)JS 讓 x == 1 && x == 2 && x == 3 成立內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

阳东县| 鄯善县| 门头沟区| 特克斯县| 丰都县| 延边| 尉氏县| 邯郸市| 探索| 平阴县| 文山县| 裕民县| 满洲里市| 田东县| 黄龙县| 探索| 石嘴山市| 怀仁县| 科尔| 台江县| 凤凰县| 观塘区| 丹巴县| 湘潭市| 甘南县| 肃南| 普宁市| 临高县| 武功县| 沈丘县| 苗栗县| 大邑县| 偃师市| 普洱| 揭阳市| 新巴尔虎右旗| 来凤县| 渑池县| 化德县| 和平县| 衡阳县|