国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

解析JavaScript判斷兩個(gè)值相等的方法

3403771864 / 536人閱讀

  本篇文章主要是講述在JavaScript中判斷兩個(gè)值相等,不要認(rèn)為很簡(jiǎn)單,要注意的是在JavaScript中存在4種不同的相等邏輯。

  ECMAScript 是 JavaScript 的語(yǔ)言規(guī)范,在ECMAScript 規(guī)范中存在四種相等算法,如下圖所示:

1.png

  上圖中每個(gè)依次寫下來(lái),很多前端應(yīng)該熟悉嚴(yán)格相等和非嚴(yán)格相等,但對(duì)于同值零和同值卻不熟悉,現(xiàn)在就依次下面四種方法。

  同值

  同值零

  非嚴(yán)格相等

  嚴(yán)格相等

  非嚴(yán)格相等

  非嚴(yán)格相等使用兩個(gè)等號(hào),這個(gè)雙等就很熟悉,非嚴(yán)格相等表示語(yǔ)義相等,不要求類型一樣,非嚴(yán)格相等在比較前會(huì)先將比較參數(shù)類型轉(zhuǎn)換為一致,要再次進(jìn)行比較,代碼示例如下:

  1 == 1; // true
  1 == '1'; // true 類型不同,不影響比較結(jié)果

  非嚴(yán)格相等有非常復(fù)雜的轉(zhuǎn)換規(guī)則,非常難以記憶,社區(qū)中有人將上面的規(guī)則總結(jié)成了圖片,一圖勝千言,如下圖所示:

2.jpg

  這么多,我們要先進(jìn)行總結(jié),就是如下三條規(guī)則:

  Undefined 只和 Null 相等

  和 Number 比較時(shí),另一個(gè)值會(huì)自動(dòng)轉(zhuǎn)換為 Number

  和 Boolean 比較時(shí),另一個(gè)值會(huì)轉(zhuǎn)換為 Number

  如果值為對(duì)象,會(huì)使用內(nèi)部的 ToPrimitive 轉(zhuǎn)換,可以通過(guò)自定義 Symbol.toPrimitive 改變返回值,需要注意的是在相等的判斷中 Symbol.toPrimitive 接受的 hint 參數(shù)都是 default。 

 const obj = {
  [Symbol.toPrimitive](hint) {
  console.log(hint);
  if (hint == 'number') {
  return 1;
  }
  if (hint == 'string') {
  return 'yan';
  }
  return true;
  },
  };
  console.log(obj == 1); // obj 返回 true
  console.log(obj == '1'); // obj 返回 true
  console.log(obj == true); // obj 返回 true

  其實(shí)非嚴(yán)格相等并不可以帶來(lái)很多便利,換個(gè)角度,可以通過(guò)隱式的自動(dòng)轉(zhuǎn)換,簡(jiǎn)化了部分場(chǎng)景的工作,比如 Number 和 String 的自動(dòng)轉(zhuǎn)換,簡(jiǎn)化了前端從表單,url 參數(shù)中獲取值的比較問(wèn)題,但自動(dòng)轉(zhuǎn)換帶來(lái)的問(wèn)題比便利還多。

  隱式轉(zhuǎn)換的規(guī)則,這個(gè)在很多情況下就不適用,對(duì)于現(xiàn)在的觀點(diǎn)并不建議是引用,作者建議只在判斷 undefined 和 null 的場(chǎng)景下可以使用非嚴(yán)格相等。

  嚴(yán)格相等

  嚴(yán)格相等是另一種比較算法,其和非嚴(yán)格想等的區(qū)別是不會(huì)進(jìn)行類型轉(zhuǎn)換,類型不一致時(shí)直接返回 false,嚴(yán)格相等對(duì)應(yīng)===操作符,因?yàn)槭褂萌齻€(gè)等號(hào),也被稱作三等或者全等,嚴(yán)格相等舉例:

  1 === 1; // true
  1 === '1'; // false 類型不同,影響比較結(jié)果

  重點(diǎn):在不同類型值判斷規(guī)則下圖所示,與前面的非嚴(yán)格相等對(duì)比,總的來(lái)說(shuō)嚴(yán)格相等更符合直覺(jué)。

3.jpg

  嚴(yán)格相等解決了非嚴(yán)格相等中隱式轉(zhuǎn)換帶來(lái)的問(wèn)題,但也丟失了隱式轉(zhuǎn)換帶來(lái)的便利,主要是可能對(duì)于類型不一致的情況,比如從表單中獲取的值都是字符串,其實(shí)保守的做法就是在比較前手動(dòng)類型轉(zhuǎn)換,代碼示例如下:

  1 === Number('1'); // true 手動(dòng)類型轉(zhuǎn)換,類型防御

  嚴(yán)格相等幾乎總是正確的,可有例外,比如 NaN 和正負(fù) 0 的問(wèn)題。

  Number 類型有個(gè)特殊的值 NaN,用來(lái)表示計(jì)算錯(cuò)誤的情概況,比較常見(jiàn)是非 Number 類型和 Number 類型計(jì)算時(shí),會(huì)得到 NaN 值,代碼示例如下所示,這是從表單和接口請(qǐng)求獲取數(shù)據(jù)時(shí)很容易出現(xiàn)的問(wèn)題。

  const a = 0 / 0; // NaN
  const b = 'a' / 1;
  const c = undefined + 1; // NaN

  在嚴(yán)格相等中,NaN 是不等于自己的,NaN 是(x !== x) 成立的唯一情況,這種狀況下是可以判斷 NaN 的,可以使用 isNaN 進(jìn)行判斷,ECMAScript 2015 引入了新的 Number.isNaN,和 isNaN 的區(qū)別是不會(huì)對(duì)傳入的參數(shù)做類型轉(zhuǎn)換,建議使用語(yǔ)義更清晰的 Number.isNaN,但是要注意兼容性問(wèn)題,判斷 NaN 代碼示例如下:

  NaN === NaN; // false
  isNaN(NaN); // true
  Number.isNaN(NaN); // true
  isNaN('aaa'); // true 自動(dòng)轉(zhuǎn)換類型 'aaa'轉(zhuǎn)換為Number為NaN
  Number.isNaN('aaa'); // false 不進(jìn)行轉(zhuǎn)換,類型不為Number,直接返回false

  嚴(yán)格相等另一個(gè)例外情況是,無(wú)法區(qū)分+0 和-0,代碼示例如下,在一些數(shù)學(xué)計(jì)算場(chǎng)景中是要區(qū)分語(yǔ)義的。

  +0 === -0; // true

  JavaScript 中很多系統(tǒng)函數(shù)都使用嚴(yán)格相等,比如數(shù)組的 indexOf,lastIndexOf 和 switch-case 等,需要注意,這些對(duì)于 NaN 無(wú)法返回正確結(jié)果,代碼示例如下:

  [NaN].indexOf(NaN); // -1 數(shù)組中其實(shí)存在NaN
  [NaN].lastIndexOf(NaN); // -1

  同值零

  同值零是另一種相等算法,名字來(lái)源于規(guī)范的直譯,規(guī)范中叫做 SameValueZero,同值零和嚴(yán)格相等功能一樣,除了處理 NaN 的方式,同值零認(rèn)為 NaN 和 NaN 相等,這在判斷 NaN 是否在集合中的語(yǔ)義下是非常合理的。

  ECMAScript 2016 引入的 includes 使用此算法,此外 Map 的鍵去重和 Set 的值去重,使用此算法,代碼示例如下:

  [NaN].incdudes(NaN); // true 注意和indexOf的區(qū)別,incdudes的語(yǔ)義更合理
  new Set([NaN, NaN]); // [NaN] set中只會(huì)有個(gè)一個(gè)NaN,如果 NaN !== NaN的話,應(yīng)該是[NaN, NaN]
  new Map([
  [NaN, 1],
  [NaN, 2],
  ]); // {NaN => 2} 如果 NaN !== NaN的話,應(yīng)該是 {NaN => 1, NaN => 2}

  同值

  同值是最后一種相等算法,其和同值零類似,但認(rèn)為 +0 不等于 -0,ECMAScript 2015 帶來(lái)的 Object.is 使用同值算法,代碼示例如下:

  Object.is(NaN, NaN); // true
  Object.is(+0, -0); // false ???? 注意這里

  同值算法的使用場(chǎng)景是,確定兩個(gè)值是否在任何情況下功能上是相同的,比較不常用,defineProperty 使用此算法確認(rèn)鍵是否存在,例如,將存在的只讀屬性值-0 修改為+0 時(shí)會(huì)報(bào)錯(cuò),如果設(shè)置為同樣的-0 將執(zhí)行正常,代碼示例如下: 

 function test() {
  'use strict'; // 需要開(kāi)啟嚴(yán)格模式
  var a = {};
  Object.defineProperty(a, 'a1', {
  value: -0,
  writable: false,
  configurable: false,
  enumerable: false,
  });
  Object.defineProperty(a, 'a1', {
  value: -0,
  }); // 正常執(zhí)行
  Object.defineProperty(a, 'a1', {
  value: 0,
  }); // Uncaught TypeError: Cannot redefine property: a1
  }
  test();

  對(duì)于數(shù)組判斷是否存在的場(chǎng)景,如果想?yún)^(qū)分+0 和-0,可以使用 ECMAScript 2015 引入的 find 方法,自行控制判斷邏輯,代碼示例如下:

  [0].includes(-0); // 不能區(qū)分-0
  [0].find((val) => Object.is(val, -0)); // 能區(qū)分+0和-0

  總結(jié)

  最后來(lái)對(duì)比下四種算法的區(qū)別,區(qū)別如下表所示:


隱式轉(zhuǎn)換NaN 和 NaN+0 和 -0
非嚴(yán)格相等(==)falsetrue
嚴(yán)格相等(===)falsetrue
同值零(includes 等)truetrue
同值(Object.is)truefalse

    JavaScript判斷相等值內(nèi)容講述完了,希望大家好好學(xué)習(xí)更多知識(shí)。



文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/128374.html

相關(guān)文章

  • 【前端工程師手冊(cè)】說(shuō)清楚JavaScript相等判斷

    摘要:如果沒(méi)有傳入的話如果是類型,則取否則,取這個(gè)方法大致和一樣,除了以下返回返回參考知乎中和區(qū)別是什么全面解析中的數(shù)據(jù)類型與類型轉(zhuǎn)換規(guī)范 有哪些判斷相等性的方法 JavaScript現(xiàn)在提供了三種方法來(lái)判斷相等性: ===,三個(gè)等號(hào)即嚴(yán)格相等 ==,兩個(gè)等號(hào)即寬松相等 Object.is(),ES6中用來(lái)判斷相等的方法 判斷相等性的細(xì)節(jié) ===(嚴(yán)格相等) 被比較的兩個(gè)數(shù)不會(huì)進(jìn)行類型轉(zhuǎn)...

    crossoverJie 評(píng)論0 收藏0
  • JavaScript專題系列文章

    摘要:專題系列共計(jì)篇,主要研究日常開(kāi)發(fā)中一些功能點(diǎn)的實(shí)現(xiàn),比如防抖節(jié)流去重類型判斷拷貝最值扁平柯里遞歸亂序排序等,特點(diǎn)是研究專題之函數(shù)組合專題系列第十六篇,講解函數(shù)組合,并且使用柯里化和函數(shù)組合實(shí)現(xiàn)模式需求我們需要寫一個(gè)函數(shù),輸入,返回。 JavaScript 專題之從零實(shí)現(xiàn) jQuery 的 extend JavaScritp 專題系列第七篇,講解如何從零實(shí)現(xiàn)一個(gè) jQuery 的 ext...

    Maxiye 評(píng)論0 收藏0
  • Effective JavaScript讀書(shū)筆記(一)

    摘要:如果為假值,不傳或者傳入,函數(shù)都會(huì)返回但是,傳入這個(gè)值是完全有可能的,所以這種判斷形勢(shì)是不正確的或者使用來(lái)判斷也可以原始類型優(yōu)于封裝類型對(duì)象擁有六個(gè)原始值基本類型布爾值,數(shù)字,字符串,,和對(duì)象。 作為一個(gè)前端新人,多讀書(shū)讀好書(shū),夯實(shí)基礎(chǔ)是十分重要的,正如蓋樓房一樣,底層穩(wěn)固了,才能越壘越高。從開(kāi)始學(xué)習(xí)到現(xiàn)在,基礎(chǔ)的讀了紅寶書(shū)《JavaScript高級(jí)程序設(shè)計(jì)》,犀牛書(shū)《JavaScri...

    zhoutao 評(píng)論0 收藏0
  • JavaScript“黑話”

    摘要:數(shù)值表示法科學(xué)計(jì)數(shù)法是一種數(shù)學(xué)術(shù)語(yǔ),將一個(gè)數(shù)表示為乘以的次方,如光速萬(wàn)公里每秒,在計(jì)算中通常將米做單位,則記為,而在中我們可使用科學(xué)計(jì)數(shù)法表示。以下情況會(huì)自動(dòng)將數(shù)值轉(zhuǎn)為科學(xué)計(jì)數(shù)法表示小數(shù)點(diǎn)前的數(shù)字多于位。 showImg(https://segmentfault.com/img/bVbhNqT?w=1024&h=683); 因?yàn)榍蚴菆A的,所以不論發(fā)生什么都有可能,對(duì)這點(diǎn)我是深信不疑的,...

    fjcgreat 評(píng)論0 收藏0
  • 深入理解JavaScript類型轉(zhuǎn)換

    摘要:等同于等同于其他類型和布爾類型之間的比較如果是布爾類型,則返回的結(jié)果。 showImg(https://segmentfault.com/img/bVburFq?w=796&h=398); 前言 JavaScript作為一門弱類型語(yǔ)言,我們?cè)诿刻斓木帉懘a過(guò)程中,無(wú)時(shí)無(wú)刻不在應(yīng)用著值類型轉(zhuǎn)換,但是很多時(shí)候我們只是在單純的寫,并不曾停下腳步去探尋過(guò)值類型轉(zhuǎn)換的內(nèi)部轉(zhuǎn)換規(guī)則,最近通過(guò)閱讀你...

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

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

0條評(píng)論

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