成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript中讓x==1&&x==2&&x==3等式成立演示

3403771864 / 560人閱讀

  要是別人問您:“如何讓 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 相同,從而使等式成立。

1.png

  相關(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

相關(guān)文章

  • JavaScript的相等比較(==)和(===)及Object.is()的區(qū)別

    摘要:原始類型值比較原始類型值有五種布爾值字符串?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ì)更快。因此...

    王軍 評(píng)論0 收藏0
  • 前端每日實(shí)戰(zhàn):165# 視頻演示如何用 Vue 創(chuàng)作一個(gè)算術(shù)訓(xùn)練程序(內(nèi)含 3 個(gè)視頻)

    摘要:等式右邊的問號(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ù)覽,...

    isaced 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<