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

資訊專欄INFORMATION COLUMN

js中抽象相等==

hzx / 2625人閱讀

摘要:中抽象相等比較算法大致介紹一下的數(shù)據(jù)類型的數(shù)據(jù)類型分為種如果再加上數(shù)據(jù)類型,一共種與的區(qū)別描述一個(gè)空值空的對(duì)象引用即空指針,被當(dāng)做一個(gè)對(duì)象,輸出為算是一個(gè)吧,輸出為。運(yùn)算符把其值參數(shù)轉(zhuǎn)換為非類型對(duì)象。

Javascript中抽象相等比較算法
undefined==null
//true
[]==[]
//false
[]==![]
//true
{}==!{}
//false
![]=={}
//false
[]==!{}
//true
[1,2]==![1]
//false
大致介紹一下JS的數(shù)據(jù)類型

ES5的數(shù)據(jù)類型分為6種:Undefined Null String Number Boolean Object,如果再加上ES6Symbol數(shù)據(jù)類型,一共7種;

nullundefined的區(qū)別:

null描述一個(gè)空值(空的對(duì)象引用即空指針),null被當(dāng)做一個(gè)對(duì)象,typeOf null輸出為"Object"(算是一個(gè)bug吧),Number(null)輸出為0。undefined是預(yù)定義的全局變量,表示“缺少值”,typeOf undefined輸出為"undefined",Number(undefined)輸出為NaN

null是一個(gè)關(guān)鍵字,而undefined并不是一個(gè)關(guān)鍵字;

原始值概念

js的數(shù)據(jù)類型其實(shí)可以分為兩種:原始類型引用類型。原始類型又稱簡(jiǎn)單類型基本類型,包括Undefined、Null、Boolean、NumberString五種。引用類型又稱復(fù)雜類型,即Object;原始類型引用類型分別稱為原始值復(fù)雜值

簡(jiǎn)單的說(shuō):原始值是固定而簡(jiǎn)單的值,是存放在棧(stack)中的簡(jiǎn)單數(shù)據(jù)段,也就是說(shuō),它們的值直接存儲(chǔ)在變量訪問(wèn)的位置,原始類型的值被稱為原始值

原始類型(primitive type)有以下五種類型:Undefined,Null,Boolean,Number,String

typeOf運(yùn)算符:

條件 返回值
如果變量是undefined類型 undefined
如果變量是Boolean類型 boolean
如果變量是Number類型 number
如果變量是String類型 string
如果變量是Null類型 object
如果變量是引用類型 object
抽象相等算法
用Type(z)代表z的數(shù)據(jù)類型,比較運(yùn)算 x==y,其中x和y是值,產(chǎn)生true或false。
    1.Type(x)與Type(y)相同:
        a.如果Type(x)為Undefined或Null,則返回true
           
        b.如果Type(x)為Number,則:
            i.若x為NaN,返回false
            ii.若y為NaN,返回false
            iii.若x與y數(shù)值相等,返回true
            iiii.若x為+0,y為-0,返回true
            iv.若x為-0,y為+0,返回true
            v.返回false
            
        c.如果Type(x)為String,則x和y對(duì)應(yīng)位置的字符完全一樣才返回true,否則返回false,
        
        d.如果Type(x)為Boolean,則相同值返回true,否則false
        
        f.當(dāng)x和y引用同一對(duì)象時(shí),返回true,否則,返回false
            
    2.x為undefined,y為null,返回true,反之亦然
            
    3. Type(x)為String,Type(y)為Number,則返回比較ToNumber(x) == y,反之亦然
            
    4.Type(x)為Boolean,則返回比較ToNumber(x)==y的結(jié)果,反之亦然

    5.Type(x)為String或Number,Type(y)為Object,則返回比較ToPrimitive(y) == x
    
    6.返回false

再來(lái)看看ToBoolean,ToNumber,ToPrimitive三個(gè)運(yùn)算符的定義:

ToBoolean
輸入類型 結(jié)果
Undefined false
Null false
Boolean 不轉(zhuǎn)換
Number 如果參數(shù)是-0+0NaN,結(jié)果為false,否則為true
String 如果參數(shù)是空字符串(長(zhǎng)度為零),結(jié)果為false,否則為true
Object true
ToNumber
輸入類型 結(jié)果
Undefined NaN
Null +0
Boolean 參數(shù)為true,結(jié)果為1,參數(shù)為false,結(jié)果為+0
Number 不轉(zhuǎn)換
String 參見下文的文法和注釋
Object 應(yīng)用下步驟:1、設(shè)原始值為ToPrimitive(輸入?yún)?shù),暗示,數(shù)值類型)。2、返回ToNumber(原始值)
ToPrimitive

ToPrimitive運(yùn)算符接收一個(gè)值,和一個(gè)可選的期望類型作參數(shù)。ToPrimitive運(yùn)算符把其值參數(shù)轉(zhuǎn)換為非類型對(duì)象。如果對(duì)象有能力被轉(zhuǎn)換為不止一種原語(yǔ)類型,可以使用可選的 期望類型 來(lái)暗示那個(gè)類型。

輸入類型 結(jié)果
Undefined 不轉(zhuǎn)換
Null 不轉(zhuǎn)換
Boolean 不轉(zhuǎn)換
Number 不轉(zhuǎn)換
String 不轉(zhuǎn)換
Object 返回該對(duì)象的默認(rèn)值。對(duì)象的默認(rèn)值由期望類型傳入作為hint參數(shù)調(diào)用對(duì)象內(nèi)部方法[DefaultValue]得到

** ToPrimitive這個(gè)方法,參照火狐MDN上的文檔介紹,大致意思如下:

ToPrimitive(obj,preferredType)

JS引擎內(nèi)部轉(zhuǎn)換為原始值ToPrimitive(obj,preferredType)函數(shù)接受兩個(gè)參數(shù),第一個(gè)obj為被轉(zhuǎn)換的對(duì)象,第二個(gè)
preferredType為希望轉(zhuǎn)換成的類型(默認(rèn)為空,接受的值為Number或String)

在執(zhí)行ToPrimitive(obj,preferredType)時(shí)如果第二個(gè)參數(shù)為空并且obj為Date的實(shí)例時(shí),此時(shí)preferredType會(huì)
被設(shè)置為String,其他情況下preferredType都會(huì)被設(shè)置為Number如果preferredType為Number,ToPrimitive執(zhí)
行過(guò)程如
下:

如果obj為原始值,直接返回;

否則調(diào)用 obj.valueOf(),如果執(zhí)行結(jié)果是原始值,返回之;

否則調(diào)用 obj.toString(),如果執(zhí)行結(jié)果是原始值,返回之;

否則拋異常。

如果preferredType為String,將上面的第2步和第3步調(diào)換,即:

如果obj為原始值,直接返回;

否則調(diào)用 obj.toString(),如果執(zhí)行結(jié)果是原始值,返回之;

否則調(diào)用 obj.valueOf(),如果執(zhí)行結(jié)果是原始值,返回之;

否則拋異常

Ok,到現(xiàn)在,我們需要了解,toString方法和valueOf方法;

toString用來(lái)返回對(duì)象的字符串表示。

    let obj = {name:"Tom"}; //"[object Object]"
    let obj = {}; //"[object Object]"
    let arr = [1,2];    //"1,2"
    let arr = [];    //""
    let str = "1";      //"1"
    let num = 1;        //"1"
    let boo = true;     //"true"
    let date = new Date();      //"date Sat Mar 24 2018 00:23:12 GMT+0800 (CST)"
    let nul = null;     //報(bào)錯(cuò)
    let und;            //報(bào)錯(cuò)

valueOf方法返回對(duì)象的原始值,可能是字符串數(shù)值bool值等,看具體的對(duì)象。

    let obj = {name:"Tom"}; //{name:"Tom"}
    let arr = [1,2];    //[1,2]
    let str = "1";      //"1"
    let num = 1;        //1
    let boo = true;     //true
    let date = new Date();      //1521822331609
    let nul = null;     //報(bào)錯(cuò)
    let und;            //報(bào)錯(cuò)

簡(jiǎn)單理解:原始值指的是[Null,Undefined,String,Boolean,Number]五種基本數(shù)據(jù)類型之一

總結(jié)一下==運(yùn)算的規(guī)則:
1. undefined == null,結(jié)果是true。且它倆與所有其他值比較的結(jié)果都是false。

2. String == Boolean,需要兩個(gè)操作數(shù)同時(shí)轉(zhuǎn)為Number。

3. String/Boolean == Number,需要String/Boolean轉(zhuǎn)為Number。

4. Object == Primitive(原始值),需要Object轉(zhuǎn)為Primitive(具體通過(guò)valueOf和toString方法)。
栗子
undefined==null
//true
[]==[]
//false
[]==![]
//true
{}==!{}
//false
![]=={}
//false
[]==!{}
//true
[1,2]==![1]
//false
undefined==null

結(jié)果為true,不用解釋了,記住就行了

[]==[]

先看這兩個(gè)的類型,typeOf([])得到的是"object"

抽象相等算法1-f,引用同一類型的才算相等

返回false

[]==![]

!取反運(yùn)算符的優(yōu)先級(jí)高于==,因此先算出![]這個(gè)得值,再去使用抽象相等算法進(jìn)行比較

取反運(yùn)算符會(huì)先調(diào)用方法ToBoolean,再去取反

ToBoolean([])返回的是true,因此![]應(yīng)該為false

[]==![]轉(zhuǎn)換為了[]==false

根據(jù)抽象相等算法4條,則我們可以比較[]==ToNumber[false]的值,則可以得到[]==0

再根據(jù)抽象相等算法5條,比較ToPrimitive([])==0

由于[]不是Date類型,所以先得到[].valueOf()的值,為[]

再得到[].toString()的值,為""的字符串

以上7,8部可合并為一步即比較[].valueOf().toString(),得到""字符串,此時(shí)[]轉(zhuǎn)換為了原始值類型(即五種基本類型中的一種)了。

根據(jù)抽象相等算法3,則可以比較ToNumber("")==0,到這里[]==![]轉(zhuǎn)化為了0==0

返回true

{}==![]

表達(dá)式右側(cè),重復(fù)上一次的1-5步,可以得到{}==0

根據(jù)抽象相等算法5條,ToPrimitive({})==0,得到{}.valueOf().toString()得到一個(gè)字符串"[object Object]",是原始類型

根據(jù)抽象相等算法3,最后比較ToNumber("[object Object]")==0,轉(zhuǎn)變?yōu)?b>1==0

返回false

...

其余的栗子自己算一算吧

結(jié)語(yǔ)

自己重新寫了寫一遍整理了一下思路,如果什么地方?jīng)]有講清楚,請(qǐng)指出;

參考:

剖析js中各種蛋疼的類型轉(zhuǎn)換

Javascript中抽象相等比較算法

等...文章

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/93661.html

相關(guān)文章

  • js抽象相等

    摘要:字符串和數(shù)字之間的相等比較如果是數(shù)字,是字符串,則返回的結(jié)果如果是字符串,是數(shù)字,則返回的結(jié)果其他類型和布爾類型之間的相等比較如果是布爾類型,則返回的結(jié)果如果是布爾類型。 字符串和數(shù)字之間的相等比較 如果Type(x)是數(shù)字,Type(y)是字符串,則返回x == ToNumber(y)的結(jié)果 如果Type(x)是字符串,Type(y)是數(shù)字,則返回ToNumber(x) == y的...

    genedna 評(píng)論0 收藏0
  • JS的關(guān)系比較與相等比較運(yùn)算

    摘要:在中的關(guān)系比較運(yùn)算,指的是像這種大小值的關(guān)系比較。而相等比較,可區(qū)分為標(biāo)準(zhǔn)相等比較與嚴(yán)格相等比較兩大種類。 在JS中的關(guān)系比較(Relational Comparison)運(yùn)算,指的是像x < y這種大小值的關(guān)系比較。 而相等比較,可區(qū)分為標(biāo)準(zhǔn)相等(standard equality)比較x == y與嚴(yán)格相等(strict equality)比較x === y兩大種類。嚴(yán)格相等比較會(huì)...

    paraller 評(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
  • 深入理解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ò)閱讀你...

    niuxiaowei111 評(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ò)閱讀你...

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

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

0條評(píng)論

hzx

|高級(jí)講師

TA的文章

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