摘要:核心點(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é)。
toString和valueOf的區(qū)別Javascript中的強(qiáng)制類型轉(zhuǎn)換總是返回標(biāo)量基本類型值(string, boolean, number, undefined, null)。
直白點(diǎn)就是Object.toString()或者Object.valueOf()的返回值。
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在對(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)
== 允許在相等比較中進(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
摘要:注意該方法的作用和方法類似,只有一個(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),舉例:超...
摘要:譯文事件循環(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í)一...
摘要:那么為什么要在參數(shù)列表中增加呢這樣做也有兩個(gè)目的因?yàn)橛行┑桶姹镜臑g覽器中是可以被重新賦值的,在自調(diào)用匿名函數(shù)的作用域內(nèi),確保是真的未定義。 1、命名空間 為什么要使用命名空間? 在一些語言中會(huì)看到有命名空間的概念,可在js中并沒有,但是可以通過閉包來實(shí)現(xiàn)。在js閉包中定義的變量會(huì)被保存到一個(gè)作用域且不會(huì)污染全局變量,在程序運(yùn)行完之后也不會(huì)被銷毀。 我們可以看到,jQuery的做法就是使...
摘要:當(dāng)面試中讓我解釋一下閉包時(shí)我懵逼了。這個(gè)解釋開始可能有點(diǎn)晦澀,讓我們抽絲剝繭摘下閉包的真面目。此文不詳述作用域有專門的主題闡述,不過作用域是理解閉包原理的基礎(chǔ)。這才是閉包的真正便利之處。閉包使用不當(dāng)就會(huì)很坑。 原文鏈接 為什么深度學(xué)習(xí)JavaScript? JavaScript如今是最流行的編程語言之一。它運(yùn)行在瀏覽器、服務(wù)器、移動(dòng)設(shè)備、桌面應(yīng)用,也可能包括冰箱。無需我舉其他再多不相干...
摘要:結(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í)際中的情況來看...
閱讀 3464·2019-08-30 10:54
閱讀 3160·2019-08-29 16:38
閱讀 2189·2019-08-26 14:06
閱讀 1521·2019-08-23 15:39
閱讀 3046·2019-08-23 15:37
閱讀 2892·2019-08-23 13:50
閱讀 3199·2019-08-22 17:14
閱讀 2392·2019-08-22 15:44