色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

JavaScrip簡單數(shù)據(jù)類型隱式轉(zhuǎn)換的實(shí)現(xiàn)

瀏覽:278日期:2022-06-09 14:53:15
目錄
  • JavaScrip隱式轉(zhuǎn)換規(guī)則
  • JavaScrip類型轉(zhuǎn)換詳解
    • 轉(zhuǎn)換成Number類型
    • 轉(zhuǎn)換為String類型
    • 轉(zhuǎn)換為Boolean類型
  • JavaScrip特殊操作符對(duì)類型轉(zhuǎn)換的影響
    • !邏輯非運(yùn)算符
    • == 相等運(yùn)算符
    • 比較運(yùn)算符
    • + 算數(shù)運(yùn)算符
  • 總結(jié)

    JavaScript是一種弱數(shù)據(jù)類型語言 ,在JavaScript中定義變量不需要提前指定變量類型,變量的數(shù)據(jù)類型是在程序運(yùn)行過程中由JavaScript引擎動(dòng)態(tài)決定,因而可以使用同一個(gè)變量來存儲(chǔ)不同類型的數(shù)據(jù)(var、let、const),這也意味著它會(huì)自動(dòng)轉(zhuǎn)換值的數(shù)據(jù)類型,以便數(shù)據(jù)之間更加容易相互比較和操作。除去我們比較熟知的顯式轉(zhuǎn)換,JavaScript中的隱式轉(zhuǎn)換更加需要理解和一定的經(jīng)驗(yàn)。下面將為大家詳細(xì)的列舉一下JS隱式轉(zhuǎn)換的各種情況。

    在JavaScript中,數(shù)據(jù)類型的隱式轉(zhuǎn)換主要有三種情況:

    • 轉(zhuǎn)換為number類型
    • 轉(zhuǎn)換為boolean類型
    • 轉(zhuǎn)換為string類型

    JavaScript隱式類型轉(zhuǎn)換通常發(fā)生在以下情況:

    • 當(dāng)使用不同類型的值進(jìn)行操作時(shí)(數(shù)字和字符串)
    • 當(dāng)使用相等或不等運(yùn)算符(== 或 !=)進(jìn)行比較時(shí)
    • 當(dāng)對(duì)一個(gè)非布爾類型的值進(jìn)行布爾運(yùn)算時(shí)(if語句或邏輯運(yùn)算符)

    JavaScrip隱式轉(zhuǎn)換規(guī)則

    JavaScript中隱式類型轉(zhuǎn)換的機(jī)制是比較復(fù)雜的,涉及到了數(shù)據(jù)類型、操作符、運(yùn)算順序等多方面的因素。

    當(dāng)兩個(gè)操作數(shù)具有不同的類型時(shí),系統(tǒng)內(nèi)部根據(jù)一系列規(guī)則來決定將其轉(zhuǎn)換為相同的類型,這些規(guī)則包括:

    • 如果一個(gè)操作數(shù)是數(shù)字,則將另一個(gè)操作數(shù)轉(zhuǎn)換為數(shù)字
    • 如果一個(gè)操作數(shù)是字符串,則將另一個(gè)操作數(shù)轉(zhuǎn)換為字符串
    • 如果一個(gè)操作數(shù)是布爾值,則將另一個(gè)操作數(shù)轉(zhuǎn)換為布爾值
    • 如果一個(gè)操作數(shù)是對(duì)象,則嘗試將另一個(gè)操作數(shù)轉(zhuǎn)換為對(duì)象,否則將其轉(zhuǎn)換為原始類型

    另外:

    • + 號(hào)兩邊只要有一個(gè)是字符串,都會(huì)把另外一個(gè)轉(zhuǎn)成字符串
    • 除了+以外的算術(shù)運(yùn)算符 比如 - * / 等都會(huì)把數(shù)據(jù)轉(zhuǎn)成數(shù)字類型
    • 邏輯非 ! 轉(zhuǎn)換為布爾
    • +號(hào)作為正號(hào)解析可以轉(zhuǎn)換成數(shù)字型
    • 任何數(shù)據(jù)和字符串相加結(jié)果都是字符串

    JavaScrip類型轉(zhuǎn)換詳解

    轉(zhuǎn)換成Number類型

    轉(zhuǎn)為Number類型:++ / --(自增自減運(yùn)算符) + - * / %(算術(shù)運(yùn)算符) > < >= <= == != === !== (關(guān)系運(yùn)算符)。null轉(zhuǎn)換為數(shù)字為0undefinedNaN

    簡單數(shù)據(jù)轉(zhuǎn)換數(shù)字對(duì)照:

    原始數(shù)據(jù)類型轉(zhuǎn)換之后的值空字符 ''或""0非空字符串將字符內(nèi)的數(shù)據(jù)內(nèi)容變?yōu)閿?shù)據(jù),如果還有其他符號(hào)中文等轉(zhuǎn)為NaNtrue1false0null0undefinedNaNNaN(不用轉(zhuǎn),typeof NaN 得到"number")

    示例:

    // 隱式轉(zhuǎn)換為數(shù)字型的運(yùn)算符// 算術(shù)運(yùn)算符 - *  /   比較運(yùn)算符  >   ==console.log(8 - "3") // 5console.log("1999" * "2") // 3998,此處兩個(gè)string型全都得轉(zhuǎn)換為number型console.log("35" - 34)  //1 console.log("35" - "34") //1console.log("40" / "2") //20console.log("35" % 2)  //1console.log("35" % "2") //1console.log(5 - undefined) //NaN 因?yàn)閁ndefined轉(zhuǎn)為數(shù)字為NaNconsole.log(5 - null) //5console.log(44%("2a")) //NaN,其中,2a進(jìn)行強(qiáng)轉(zhuǎn)后為NaN,NaN參與運(yùn)算返回NaNconsole.log("5">"3") //true 此處直接比較的ASCII碼。console.log(3 > "1")   // trueconsole.log(3 == "3")  // trueconsole.log(3 == "+3")  // true,此處的+號(hào)相當(dāng)于是類型轉(zhuǎn)換console.log(3 == "-3")  // falseconsole.log(3 == "*3")  // falseconsole.log(3 == "/3")  // falseconsole.log(3 == "a3")  // falseconsole.log("a" == 97)  // falseconsole.log("a" > "A")  // true 此處比較的是ASCII碼,其中a為97 A為65,因此為trueconsole.log("a" > "")  // trueconsole.log("" == 0) //true// + 正號(hào)使用的時(shí)候,也會(huì)把字符串轉(zhuǎn)換為 數(shù)字型console.log("123")  // "123"console.log(+"123")  // 123console.log(typeof +"123") // numberconsole.log(+"0x12" == 18) // trueconsole.log("55" + true) //"55true"http:// undefined、null、boolean類型轉(zhuǎn)換為數(shù)字console.log(NaN == NaN) //false,NaN比較特殊,它自己不等于自己console.log(undefined == 0) //falseconsole.log(undefined == NaN) //falseconsole.log(undefined == null) //true,此處undefined和null值都為空,因此能夠相等console.log(null == 0) //false  此處沒有進(jìn)行類型轉(zhuǎn)換,因?yàn)閚ull是一個(gè)值類型,它的數(shù)值就是null,我們?cè)谑褂?=時(shí),會(huì)直接把null這個(gè)數(shù)值與0進(jìn)行比較,結(jié)果為falseconsole.log(null === 0) // falseconsole.log(null >= 0) //false  null要進(jìn)行數(shù)值比較,此處便會(huì)嘗試轉(zhuǎn)為number,則為0,結(jié)果為 trueconsole.log(false == null) //false 特殊情況,理論上都應(yīng)該轉(zhuǎn)換為0比較然后相等true,但實(shí)際是直接拿值比較,不會(huì)先轉(zhuǎn)為為數(shù)字console.log(true == 1) //trueconsole.log(false == 1) //falseconsole.log(true > false) //true 先轉(zhuǎn)化為1和0數(shù)字進(jìn)行比較console.log(true + 1) // 2console.log(true + null) //1,其中true轉(zhuǎn)換為1,null轉(zhuǎn)換為0console.log(undefined + 1) // NaNconsole.log("5" - true) //4console.log("5" - false) //0//數(shù)組轉(zhuǎn)換為數(shù)字console.log([9] == 9) //trueconsole.log([9,"a"] == 9) //false//特殊情況console.log({} == {}) // false,對(duì)象類型比的是地址,不同對(duì)象地址不同console.log([]==[])   // false,理由同上

    轉(zhuǎn)換為String類型

    簡單數(shù)據(jù)轉(zhuǎn)換字符串對(duì)照:

    原始數(shù)據(jù)類型轉(zhuǎn)換之后的值數(shù)字類型數(shù)字類型的字符表示null‘null’undefined‘undefined’布爾類型true變’true’,false變’false’

    此處注意點(diǎn)為-0轉(zhuǎn)換為string類型為'0'

    ["a","b"]轉(zhuǎn)換string類型為"a,b"

    []轉(zhuǎn)換為string類型為""

    轉(zhuǎn)換為Boolean類型

    數(shù)據(jù)邏輯判斷邏輯運(yùn)算之中會(huì)隱式轉(zhuǎn)換為boolean類型

    轉(zhuǎn)換為布爾型:空字符、0、-0、undefined、null、false、NaN轉(zhuǎn)換為布爾值后為false,其余為true

    + 號(hào)兩邊只要有一個(gè)是字符串,都會(huì)把另外一個(gè)轉(zhuǎn)成字符串

    連續(xù)使用兩個(gè)非操作符(!!)可以將一個(gè)數(shù)強(qiáng)制轉(zhuǎn)換為boolean類型,這在開發(fā)之中比較實(shí)用。

    簡單數(shù)據(jù)轉(zhuǎn)換布爾型對(duì)照:

    數(shù)據(jù)類型轉(zhuǎn)換為true的值轉(zhuǎn)換為false的值String任何非空字符串空字符串(""或’')Number任何非零數(shù)字0和NaNObject任何對(duì)象nullUndefined不適用undefined

    示例:

    //隱式轉(zhuǎn)換為布爾型的運(yùn)算符  !邏輯非console.log(!true)  // false console.log(!0)  // trueconsole.log(!"")  // trueconsole.log(!null) // trueconsole.log(!undefined)  // trueconsole.log(!NaN)  // trueconsole.log(!false)  // trueconsole.log(!"hello") // false

    JavaScrip特殊操作符對(duì)類型轉(zhuǎn)換的影響

    !邏輯非運(yùn)算符

    !會(huì)將后面的數(shù)據(jù)先轉(zhuǎn)成布爾值,然后取反

    var a; //a = undefinedvar r = !!a; console.log(r) //false!!{} // true!!undefined // false!!null // false!!NaN //fales

    == 相等運(yùn)算符

    比較操作符會(huì)為兩個(gè)不同類型的操作數(shù)轉(zhuǎn)換類型,然后進(jìn)行嚴(yán)格比較。當(dāng)兩個(gè)操作數(shù)都是對(duì)象時(shí),JavaScript會(huì)比較其內(nèi)部引用,當(dāng)且僅當(dāng)他們的引用指向內(nèi)存中的相同對(duì)象時(shí)才相等,即他們?cè)跅?nèi)存中的引用地址相同。

    1.類型相同

    如果比較的是兩個(gè)對(duì)象,則比較兩個(gè)對(duì)象的指針是否指向同一個(gè)對(duì)象

    let a = {}let b = {}a==b //falselet a = {}let b = a;a==b //true

    2.類型不同

    如果兩邊類型不同,則兩邊都嘗試轉(zhuǎn)成number類型。對(duì)于引用類型,先調(diào)用valueOf(),如果能轉(zhuǎn)成數(shù)字,則進(jìn)行比較。不能轉(zhuǎn)成數(shù)字就調(diào)用toString()方法轉(zhuǎn)成字符串。

    tips:因?yàn)?code>null是一個(gè)值類型,它的數(shù)值就是null,我們?cè)谑褂?=時(shí),會(huì)直接把null這個(gè)數(shù)值與數(shù)值進(jìn)行比較,而不是轉(zhuǎn)換為0

    console.log(3 == "3")  // trueconsole.log(3 == "+3")  // true,此處的+號(hào)相當(dāng)于是類型轉(zhuǎn)換console.log(3 == "-3")  // falseconsole.log(3 == "a3")  // falseconsole.log(+"0x12" == 18) // trueconsole.log("" == 0) //trueconsole.log(null == 0) //false  此處沒有進(jìn)行類型轉(zhuǎn)換,因?yàn)閚ull是一個(gè)值類型,它的數(shù)值就是null,我們?cè)谑褂?=時(shí),會(huì)直接把null這個(gè)數(shù)值與0進(jìn)行比較,結(jié)果為falseconsole.log(NaN == NaN) //false,NaN比較特殊,它自己不等于自己console.log(undefined == 0) //falseconsole.log(undefined == NaN) //falseconsole.log(undefined == null) //true,此處undefined和null值都為空,因此能夠相等

    面試題

    //問題1:console.log(new String("abc") == true)//flase//step1:右側(cè)轉(zhuǎn)成數(shù)字1,變成:new String("abc")==1//step2 new String("abc").valueOf()不是數(shù)字也不是字符串,再調(diào)用toString()"abc" == 1//step3:字符串轉(zhuǎn)數(shù)字NaN == 1 //false,NaN和任何類型比較都為false//問題2:console.log({}==true)//false//step1:右側(cè)轉(zhuǎn)成數(shù)字{} == 1//step2 {}.valueOf()不是數(shù)字也不是字符串,再調(diào)用toString()"[object Object]" ==1  //step3:字符串轉(zhuǎn)數(shù)字NaN == 1 //false,NaN和任何類型比較都為false//問題3:console.log([]==![])//true//step1:!優(yōu)先級(jí)比==高,先轉(zhuǎn)右邊,[]是對(duì)象類型,轉(zhuǎn)成布爾值為true,!true就是false[]==false//step2:右側(cè)轉(zhuǎn)成數(shù)字為0[]==0//step3:左側(cè)是一個(gè)對(duì)象,valueOf()轉(zhuǎn)出來不是字符也不是字符串,調(diào)用toString(),得到空字符串"" == 0//step4:字符串轉(zhuǎn)成數(shù)字0 == 0 //true

    比較運(yùn)算符

    字符串類型比較大小時(shí),不進(jìn)行類型轉(zhuǎn)換,而是逐位比較ASCII碼,第一位不同則返回結(jié)果,否則繼續(xù)比較第二位,直到某一位不同為止。

    字符串與數(shù)字或者boolean與數(shù)字比較時(shí),會(huì)進(jìn)行隱式數(shù)據(jù)類型轉(zhuǎn)換

    示例

    console.log("5555555" < "6") //true,首先比較第一個(gè)字符串的第一個(gè)字符,如果不同直接返回結(jié)果console.log("5">"3") //true,此處直接比較的ASCII碼。console.log(3 > "1") // trueconsole.log("a" > "A")  // true,此處比較的是ASCII碼,其中a為97 A為65,因此為trueconsole.log("a" > "")  // trueconsole.log(null >= 0) //false,null要進(jìn)行數(shù)值比較,此處便會(huì)嘗試轉(zhuǎn)為number,則為0,結(jié)果為 true

    + 算數(shù)運(yùn)算符

    當(dāng)+號(hào)作為一元操作符時(shí),它就會(huì)將這個(gè)數(shù)轉(zhuǎn)換為數(shù)字類型

    當(dāng)+號(hào)作為二元操作符時(shí)

    console.log(3 == "+3")  // true,此處的+號(hào)相當(dāng)于是類型轉(zhuǎn)換console.log("55" + true) //"55true"console.log(true + 1) // 2console.log(true + null) //1,其中true轉(zhuǎn)換為1,null轉(zhuǎn)換為0console.log(undefined + 1) // NaN

    + 號(hào)兩邊只要有一個(gè)是字符串,都會(huì)把另外一個(gè)轉(zhuǎn)成字符串,此時(shí)+號(hào)為連接符

    總結(jié)

    到此這篇關(guān)于JavaScrip簡單數(shù)據(jù)類型隱式轉(zhuǎn)換的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)JavaScrip 數(shù)據(jù)類型隱式轉(zhuǎn)換內(nèi)容請(qǐng)搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

    標(biāo)簽: JavaScript
    主站蜘蛛池模板: 在线观看精品国内福利视频 | 在线成年人网站 | 亚洲欧美国产中文 | 欧美人交性视频在线香蕉 | 亚洲精品久久一区影院 | 亚洲人成高清毛片 | 国产精品亚洲精品一区二区三区 | 国产成人18黄网站在线观看网站 | 91在线一区二区三区 | 国产一级在线 | 国内精品久久国产大陆 | 高清欧美不卡一区二区三区 | 最新国产美女肝交视频播放 | 欧美视频一 | 亚洲91精品| 九九精品免视频国产成人 | 亚洲专区在线视频 | 波多野结衣在线视频观看 | 亚洲情a成黄在线观看 | 亚洲美女视频免费 | 国产成人影院一区二区 | 免费看特级淫片日本 | 亚洲一在线 | 久久精品无遮挡一级毛片 | 97精品国产综合久久久久久欧美 | 精品久久久久久中文字幕 | 色综合久久综合 | 国产欧美一区二区另类精品 | 99热成人| 天堂一区二区三区在线观看 | 最新亚洲情黄在线网站无广告 | 99精品国产在现线免费 | 国产精品欧美一区二区三区不卡 | 午夜宅男在线永远免费观看网 | 国产人成午夜免费噼啪视频 | 色网站在线| 国产亚洲精品日韩已满十八 | 免费观看黄色毛片 | 日韩精品在线观看免费 | 色爽爽爽爽爽爽爽爽 | 成人网视频免费播放 |