關(guān)于js的類型轉(zhuǎn)換

前言:js的類型轉(zhuǎn)換真是容易讓人一頭霧水,接下來(lái)我將會(huì)好好整理一下坏为。
原始值到原始值(數(shù)字陨囊,字符串,布爾值)的轉(zhuǎn)換
  1. 原始值轉(zhuǎn)化為布爾值剧辐,所有的假值("undefined","null",0,-0,NaN,"")都會(huì)被轉(zhuǎn)化false,其他都會(huì)被轉(zhuǎn)化為true.

  2. 原始值轉(zhuǎn)換為字符串相當(dāng)于加""

  3. 原始值轉(zhuǎn)化為數(shù)字寒亥,布爾轉(zhuǎn)文字:true --> 1,false --> 2
    字符串轉(zhuǎn)數(shù)字,只有字符串中都是以數(shù)字表示的荧关,就可以直接轉(zhuǎn)換為字符串溉奕,如果兩個(gè)數(shù)字間有空格的話,那么轉(zhuǎn)換結(jié)果就是NaN.

     +"123"  //123
     +"1 3" // NaN
    
原始值到對(duì)象的轉(zhuǎn)換
  1. null和undefined會(huì)直接報(bào)錯(cuò)忍啤。
  2. 原始值會(huì)通過(guò)調(diào)用String(),Number(),Boolean()構(gòu)造函數(shù)加勤,轉(zhuǎn)換為他們各自的包裝對(duì)象。
對(duì)象到原始值的轉(zhuǎn)換
  1. 對(duì)象轉(zhuǎn)換為布爾值都是true
  2. 對(duì)象到字符串
  • 如果對(duì)象有toString()方法同波,就調(diào)用toString()方法鳄梅,如果這個(gè)方法返回原始值,就將這個(gè)對(duì)象轉(zhuǎn)化為字符串参萄。
  • 如果對(duì)象沒(méi)有toString()方法或者該方法返回的不是原始值卫枝,那么就會(huì)調(diào)用該對(duì)象的valueOf()方法,如果存在就調(diào)用這個(gè)方法讹挎,如果返回值是字符串就轉(zhuǎn)換為字符串校赤。
  1. 否則就報(bào)錯(cuò)。
    復(fù)習(xí)一下Object的屬性和方法
  • Constructor:保存著用于創(chuàng)建當(dāng)前對(duì)象的函數(shù)筒溃。

  • hasOwnProperty(property):用于檢查給定的屬性在當(dāng)前實(shí)例中(不包括原型)是否存在马篮。

  • isPrototypeOf(object):用于檢查傳入的對(duì)象是否是另外一個(gè)對(duì)象的原型。

  • propertyIsEnumberable(property):用來(lái)檢查給定的屬性能用for-in語(yǔ)句來(lái)枚舉怜奖。

  • toLocaleString():返回對(duì)象的字符串表示浑测,該字符串與執(zhí)行環(huán)境地區(qū)相對(duì)應(yīng)

  • toString():返回對(duì)象的字符串表示。

  • valueOf():返回對(duì)象的字符串表示,數(shù)值或者布爾值表示迁央,很多時(shí)候與toString()方法的返回值相同掷匠。


    toString

    valueOf
      1.toString()//Uncaught SyntaxError: Invalid or unexpected token
      1..toString()//"1"
      1...toString()//Uncaught SyntaxError: Unexpected token .
      2.0.toString()//"2"
    
==運(yùn)算符怎么進(jìn)行類型轉(zhuǎn)換
  1. 如果一個(gè)值是null,另一個(gè)值undefined,則相等。
  2. 如果一個(gè)是字符串岖圈,另一個(gè)是數(shù)字讹语,則要把字符串轉(zhuǎn)換為數(shù)字,進(jìn)行比較蜂科。
  3. 如果任意值是true,則要把true轉(zhuǎn)換為1再進(jìn)行比較顽决,如果是false,則要把false轉(zhuǎn)換為0再進(jìn)行比較
  4. 如果一個(gè)是對(duì)象导匣,另一個(gè)數(shù)值或字符串才菠,把對(duì)象轉(zhuǎn)換為基礎(chǔ)類型的值在進(jìn)行比較(toString,valueOf())。
+運(yùn)算符如何進(jìn)行類型轉(zhuǎn)換贡定。
  1. 如果作為一元運(yùn)算符就是轉(zhuǎn)化為數(shù)字赋访,常常用來(lái)將字符串轉(zhuǎn)化為數(shù)字。

     +“2” //2
    
  2. 如果作為二元運(yùn)算符就有兩種轉(zhuǎn)換方式

  • 兩邊如果有字符串缓待,就會(huì)將另外一家轉(zhuǎn)化為字符串進(jìn)行拼接进每。
  • 如果兩邊沒(méi)有字符串,兩邊都會(huì)轉(zhuǎn)化數(shù)字相加命斧,對(duì)象也會(huì)根據(jù)錢(qián)買(mǎi)你的方法轉(zhuǎn)化為原始值數(shù)字田晚。
  • 如果其中的一個(gè)操作數(shù)是對(duì)象,則將對(duì)象轉(zhuǎn)換為原始值国葬,日期對(duì)象會(huì)通過(guò)toString()贤徒,其他對(duì)象會(huì)通過(guò)valueOf()方法進(jìn)行轉(zhuǎn)換,但是大多數(shù)對(duì)象都是不具備可用的valueOf()方法汇四,所以還是會(huì)通過(guò)toString()方法執(zhí)行轉(zhuǎn)換接奈。


    image.png
實(shí)戰(zhàn)
  1.    [] + [] //" "
    
    • 首先左邊的[]調(diào)用valueOf()方法,發(fā)現(xiàn)還是[],所以去調(diào)用toString()方法通孽。

      [].toString() //" "
      
    • 有一邊是字符串序宦,所以左邊的也要轉(zhuǎn)化為字符串,也變成"",

    • "" + "" ="" //空字符串+空字符串 = 空字符串
      
  2.  (! + [] + [] + ![]).length
    
  • 因?yàn)?是一元運(yùn)算符背苦,所以我們得出了這樣的運(yùn)算規(guī)則


    image.png
  • !后面的+[]會(huì)變成數(shù)字0,![]會(huì)變成”false"那么我們就會(huì)得到

      !0 + [] + “false"
    
  • 因?yàn)橛凶址拇嬖诨グ疲裕?轉(zhuǎn)換為字符串就是"true",[]轉(zhuǎn)換為字符串就是“”
    那么我們就會(huì)得到

      “true"+""+"false" //”truefalse“
    
  • 所以

     ( ”truefalse").length //9
    
image.png

參考文章:
https://mp.weixin.qq.com/s/wd8JLGtnsoQYfm3K7KXO0g


最近又在工作中遇到了一個(gè)類型轉(zhuǎn)換的坑!P屑痢秕噪!
更新


image.png

由上圖我們可以看到,左邊框是一個(gè)存在的世界厚宰,右邊框是一個(gè)空的世界腌巾。
只要拿左邊框的和右邊的比較,都會(huì)得到false.

N表示ToNumber操作,即將操作數(shù)轉(zhuǎn)為數(shù)字澈蝙。它是規(guī)范中的抽象操作吓坚,但我們可以用JS中的Number()函數(shù)來(lái)等價(jià)替代。

P表示ToPrimitive操作灯荧,即將操作數(shù)轉(zhuǎn)為原始類型的值凌唬。它也是規(guī)范中的抽象操作,同樣也可以翻譯成等價(jià)的JS代碼漏麦。不過(guò)稍微復(fù)雜一些,簡(jiǎn)單說(shuō)來(lái)况褪,對(duì)于一個(gè)對(duì)象obj:

  1. undefined == null撕贞,結(jié)果是true。且它倆與所有其他值比較的結(jié)果都是false测垛。
  1. String == Boolean捏膨,需要兩個(gè)操作數(shù)同時(shí)轉(zhuǎn)為Number。
  1. String/Boolean == Number食侮,需要String/Boolean轉(zhuǎn)為Number号涯。
  1. Object == Primitive,需要Object轉(zhuǎn)為Primitive(具體通過(guò)valueOf和toString方法)锯七。

ToPrimitive(obj)等價(jià)于:先計(jì)算obj.valueOf()链快,如果結(jié)果為原始值,則返回此結(jié)果眉尸;否則域蜗,計(jì)算obj.toString(),如果結(jié)果是原始值噪猾,則返回此結(jié)果霉祸;否則,拋出異常袱蜡。

//大坑
console.log ( [] == 0 );//true
console.log ( ! [] == 0 );//true

//神坑
console.log ( [] == ! [] );//true
console.log ( [] == [] );//false


//史詩(shī)級(jí)坑
console.log({} == !{});//false
console.log({} == {});//false

[]==[]丝蹭,兩個(gè)的地址都不一樣,肯定是false啦
讓我們用愉快的心情來(lái)從頭到尾看一下 [] == ![]的比較過(guò)程

下面是運(yùn)算符的優(yōu)先級(jí)


image.png
image.png

總結(jié)一下比較常用的符號(hào)的優(yōu)先級(jí)
( ) > !(邏輯非) > +坪蚁,-(一元加法奔穿,一元減法) > * ,/, % > ==,===

很明顯敏晤,取反的優(yōu)先級(jí)高于==(取反運(yùn)算符得到的結(jié)果是boolean值)

https://segmentfault.com/a/1190000008432611

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末巫橄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子茵典,更是在濱河造成了極大的恐慌湘换,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異彩倚,居然都是意外死亡筹我,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)帆离,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蔬蕊,“玉大人,你說(shuō)我怎么就攤上這事哥谷“逗唬” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵们妥,是天一觀的道長(zhǎng)猜扮。 經(jīng)常有香客問(wèn)我,道長(zhǎng)监婶,這世上最難降的妖魔是什么旅赢? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮惑惶,結(jié)果婚禮上煮盼,老公的妹妹穿的比我還像新娘。我一直安慰自己带污,他們只是感情好僵控,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著鱼冀,像睡著了一般喉祭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雷绢,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天泛烙,我揣著相機(jī)與錄音,去河邊找鬼翘紊。 笑死蔽氨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的帆疟。 我是一名探鬼主播鹉究,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼踪宠!你這毒婦竟也來(lái)了自赔?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤柳琢,失蹤者是張志新(化名)和其女友劉穎绍妨,沒(méi)想到半個(gè)月后润脸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡他去,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年毙驯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灾测。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡爆价,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出媳搪,到底是詐尸還是另有隱情铭段,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布秦爆,位于F島的核電站序愚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鲜结。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一活逆、第九天 我趴在偏房一處隱蔽的房頂上張望精刷。 院中可真熱鬧,春花似錦蔗候、人聲如沸怒允。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)纫事。三九已至,卻和暖如春所灸,著一層夾襖步出監(jiān)牢的瞬間丽惶,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工爬立, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钾唬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓侠驯,卻偏偏與公主長(zhǎng)得像抡秆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吟策,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 第2章 基本語(yǔ)法 2.1 概述 基本句法和變量 語(yǔ)句 JavaScript程序的執(zhí)行單位為行(line)儒士,也就是一...
    悟名先生閱讀 4,118評(píng)論 0 13
  • 1、js數(shù)據(jù)類型 js中有7種數(shù)據(jù)類型檩坚,可以分為兩類:原始類型着撩、對(duì)象類型: 基礎(chǔ)類型(原始值): Undefine...
    好奇男孩閱讀 9,792評(píng)論 1 16
  • 前言 最先接觸編程的知識(shí)是在大學(xué)里面睹酌,大學(xué)里面學(xué)了一些基礎(chǔ)的知識(shí)权谁,c語(yǔ)言,java語(yǔ)言憋沿,單片機(jī)的匯編語(yǔ)言等旺芽;大學(xué)畢...
    oceanfive閱讀 3,044評(píng)論 0 7
  • 看完敦刻爾克,兩個(gè)聲音一直在我耳畔辐啄。 一個(gè)聲音說(shuō):“同志們采章,敵人沖過(guò)來(lái)了,你們先走壶辜,我掩護(hù)悯舟!”一個(gè)聲音卻顫抖著說(shuō):...
    東營(yíng)王建軍閱讀 331評(píng)論 0 5
  • 文/巢旸 小伙伴的文章都發(fā)過(guò)來(lái)了,談到感覺(jué)砸民,也談到理想抵怎,年青人的三觀是可圈可點(diǎn)的。 這段時(shí)間三天兩頭的要往南·泥·...
    鄉(xiāng)傳南泥灣閱讀 244評(píng)論 0 0