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

資訊專欄INFORMATION COLUMN

javascript中讓人懵逼的類型轉(zhuǎn)換

didikee / 1013人閱讀

摘要:核心點(diǎn)中的強(qiáng)制類型轉(zhuǎn)換總是返回標(biāo)量基本類型值。數(shù)字化對(duì)象在強(qiáng)制轉(zhuǎn)換為數(shù)字的時(shí)候,會(huì)優(yōu)先調(diào)用方法,如果返回基本類型的值,則直接使用該返回值如果返回值不是基本類型,則會(huì)繼續(xù)調(diào)用方法,如果返回基本類型的值,則直接使用該返回值,否則報(bào)錯(cuò)。

最近在讀《你不知道的javascript》系列圖書,收獲蠻大,感慨也挺多的。
是的,關(guān)于javascript,你不是不知道,而是真的不知道。?
就比如類型轉(zhuǎn)換,從開始到看完到第二第三第N遍,我經(jīng)歷了如下的心路歷程:
這有什么不知道的 → 一臉懵逼 → 有點(diǎn)意思 → 臥槽,怎么這樣? → 原來是這樣 → 靠,還是坑...
真可謂是不學(xué)不知道,一學(xué)嚇一跳。
為了避免再次入坑,這里做個(gè)總結(jié),不,了結(jié)。

核心點(diǎn)

Javascript中的強(qiáng)制類型轉(zhuǎn)換總是返回標(biāo)量基本類型值(string, boolean, number, undefined, null)。
直白點(diǎn)就是Object.toString()或者Object.valueOf()的返回值。

toString和valueOf的區(qū)別

toString : 以字符串形式返回該對(duì)象的原始值

valueOf : 返回最適合該對(duì)象類型的原始值

在數(shù)值運(yùn)算中,會(huì)優(yōu)先調(diào)用valueOf

在字符串運(yùn)算中,會(huì)優(yōu)先調(diào)用toString

var a = 1;
a.toString() // "1"
a.valueOf() // 1

a + 2 // 3 優(yōu)先調(diào)用valueOf
a + "string" // 1string 優(yōu)先調(diào)用toString

a + "" //隱式強(qiáng)制類型轉(zhuǎn)換
String(a) //顯示強(qiáng)制類型轉(zhuǎn)換
規(guī)則 ToString 字符串化

對(duì)象在強(qiáng)制轉(zhuǎn)換為字符串的時(shí)候,會(huì)優(yōu)先調(diào)用toString()方法,如果返回基本類型的值,則直接使用該返回值;
如果返回值不是基本類型,則會(huì)繼續(xù)調(diào)用valueOf()方法,如果valueOf()返回基本類型的值,則直接使用該返回值,否則報(bào)錯(cuò)。
數(shù)組默認(rèn)的toString方法經(jīng)過了重新定義,類似于數(shù)組的join(",")方法,會(huì)將數(shù)組的各個(gè)元素以","分隔返回。這就是 String([]) === "" 的原因。

JSON.stringify易錯(cuò)點(diǎn)

JSON.stringify對(duì)象中遇到undefined、function、symbol時(shí)會(huì)自動(dòng)忽略

JSON.stringify數(shù)組中遇到undefined、function、symbol時(shí)會(huì)返回null

字符串、數(shù)字、布爾、null的JSON.stringify的規(guī)則與ToString相同

如果傳遞給JSON.stringify的對(duì)象中定義了toJSON()方法,那么該方法會(huì)在字符串化前調(diào)用。

JSON.stringify({a : undefined, b : function () {}, c: 1}) // "{"c":1}"
JSON.stringify([undefined, function () {},1])  // "[null, null, 1]"
ToNumber 數(shù)字化

對(duì)象在強(qiáng)制轉(zhuǎn)換為數(shù)字的時(shí)候,會(huì)優(yōu)先調(diào)用valueOf()方法,如果返回基本類型的值,則直接使用該返回值;
如果返回值不是基本類型,則會(huì)繼續(xù)調(diào)用toString()方法,如果toString()返回基本類型的值,則直接使用該返回值,否則報(bào)錯(cuò)。

Number([]),因?yàn)閇].valueOf()返回值不是基本類型,因此會(huì)調(diào)用toString(), 等價(jià)于Number("")

ToBoolean 布爾化
假值

javascript有以下假值:

undefined

null

false

+0、-0 和 NaN

""

假值的布爾強(qiáng)制類型轉(zhuǎn)化為false
可以理解為假值列表以外的都是真值(true)

== 和 === 的區(qū)別

== 允許在相等比較中進(jìn)行強(qiáng)制類型轉(zhuǎn)換,=== 不允許

== 和 === 都會(huì)檢查操作數(shù)的類型,區(qū)別在于操作數(shù)類型不同時(shí)他們的處理方式不同,即== 會(huì)進(jìn)行強(qiáng)制類型轉(zhuǎn)換

容易懵逼的地方
null == undefined
NaN  != NaN
null != 0
undefined != 0
NaN != 0
[] == false
[] == 0
[] == ""
[] == ![]
正確的使用 ==

如果兩邊的值中有true或者false,千萬不要使用 ==

如果兩邊的值中有[]、"" 或者 0, 盡量不要使用 ==

其他

+運(yùn)算符 (即只有一個(gè)操作數(shù)) 用來強(qiáng)制轉(zhuǎn)化為數(shù)字 + new Date()

&& 和 || 運(yùn)算符的返回值并不一定是布爾類型,而是兩個(gè)操作數(shù)其中一個(gè)的值

參考

《你不知道的JavaScript(中)》

本文首發(fā)于 我的博客

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

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

相關(guān)文章

  • javascript對(duì)象不完全探索記錄02:瘋狂打call!給誰打call?打什么call?

    摘要:注意該方法的作用和方法類似,只有一個(gè)區(qū)別,就是方法接受的是若干個(gè)參數(shù)的列表,而方法接受的是一個(gè)包含多個(gè)參數(shù)的數(shù)組。指定的參數(shù)列表。返回值返回值是你調(diào)用的方法的返回值,若該方法沒有返回值,則返回。 溫馨提示:作者的爬坑記錄,對(duì)你等大神完全沒有價(jià)值,別在我這浪費(fèi)生命溫馨提示-續(xù):打call原本是屬于我們偶像宅文化中的專業(yè)名詞,指的是飯們?cè)诳磍ive時(shí)在臺(tái)下配合愛豆演出的節(jié)奏喊口號(hào),舉例:超...

    Shimmer 評(píng)論0 收藏0
  • 譯文:JS事件循環(huán)機(jī)制(event loop)之宏任務(wù)、微任務(wù)

    摘要:譯文事件循環(huán)機(jī)制之宏任務(wù)微任務(wù)原文標(biāo)題這是一篇谷歌大神文章,寫得非常精彩。為什么會(huì)出現(xiàn)這樣打印順序呢要理解這些你首先需要對(duì)事件循環(huán)機(jī)制處理宏任務(wù)和微任務(wù)的方式有了解。 譯文:JS事件循環(huán)機(jī)制(event loop)之宏任務(wù)、微任務(wù) 原文標(biāo)題:《Tasks, microtasks, queues and schedules》 這是一篇谷歌大神文章,寫得非常精彩。譯者想借這次翻譯深入學(xué)習(xí)一...

    nemo 評(píng)論0 收藏0
  • jQuery源碼分析1-jQuery對(duì)象的初始化

    摘要:那么為什么要在參數(shù)列表中增加呢這樣做也有兩個(gè)目的因?yàn)橛行┑桶姹镜臑g覽器中是可以被重新賦值的,在自調(diào)用匿名函數(shù)的作用域內(nèi),確保是真的未定義。 1、命名空間 為什么要使用命名空間? 在一些語言中會(huì)看到有命名空間的概念,可在js中并沒有,但是可以通過閉包來實(shí)現(xiàn)。在js閉包中定義的變量會(huì)被保存到一個(gè)作用域且不會(huì)污染全局變量,在程序運(yùn)行完之后也不會(huì)被銷毀。 我們可以看到,jQuery的做法就是使...

    qiangdada 評(píng)論0 收藏0
  • 【譯】理解JavaScript:閉包

    摘要:當(dāng)面試中讓我解釋一下閉包時(shí)我懵逼了。這個(gè)解釋開始可能有點(diǎn)晦澀,讓我們抽絲剝繭摘下閉包的真面目。此文不詳述作用域有專門的主題闡述,不過作用域是理解閉包原理的基礎(chǔ)。這才是閉包的真正便利之處。閉包使用不當(dāng)就會(huì)很坑。 原文鏈接 為什么深度學(xué)習(xí)JavaScript? JavaScript如今是最流行的編程語言之一。它運(yùn)行在瀏覽器、服務(wù)器、移動(dòng)設(shè)備、桌面應(yīng)用,也可能包括冰箱。無需我舉其他再多不相干...

    岳光 評(píng)論0 收藏0
  • 深入js隱式類型轉(zhuǎn)換

    摘要:結(jié)合實(shí)際中的情況來看,有意或無意中涉及到隱式類型轉(zhuǎn)換的情況還是很多的。此外當(dāng)進(jìn)行某些操作時(shí),變量可以進(jìn)行類型轉(zhuǎn)換,我們主動(dòng)進(jìn)行的就是顯式類型轉(zhuǎn)換,另一種就是隱式類型轉(zhuǎn)換了。 前言 相信剛開始了解js的時(shí)候,都會(huì)遇到 2 ==2,但 1+2 == 1+2為false的情況。這時(shí)候應(yīng)該會(huì)是一臉懵逼的狀態(tài),不得不感慨js弱類型的靈活讓人發(fā)指,隱式類型轉(zhuǎn)換就是這么猝不及防。結(jié)合實(shí)際中的情況來看...

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

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

0條評(píng)論

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