摘要:核心內(nèi)置類,會(huì)嘗試先于可以理解為對(duì)象優(yōu)先轉(zhuǎn)換成數(shù)字例外的是,利用的是轉(zhuǎn)換。非核心的對(duì)象,通過自己的實(shí)現(xiàn)中定義的方法轉(zhuǎn)換成原始值。
本文首發(fā)于個(gè)人博客
看到這個(gè)是不是有一種想打人的感覺,垃圾 JavaScript,這特么都什么鬼,相信很多人不管是筆試還是面試,都被 JS 的類型轉(zhuǎn)換難道過,相信認(rèn)真看完我這篇文章,媽媽再也不用擔(dān)心類型轉(zhuǎn)換的問題了。
原始值到原始值的轉(zhuǎn)換原始值轉(zhuǎn)化為布爾值
所有的假值(undefined、null、0、-0、NaN、””)會(huì)被轉(zhuǎn)化為 false,其他都會(huì)被轉(zhuǎn)為 true
原始值轉(zhuǎn)化為字符串
都相當(dāng)于 原始值 + ""
原始值轉(zhuǎn)為數(shù)字
布爾轉(zhuǎn)數(shù)字:true -> 1, false -> 0
字符串轉(zhuǎn)數(shù)字:以數(shù)字表示的字符串可以直接會(huì)轉(zhuǎn)為字符串,如果字符串頭尾有空格會(huì)忽略,但是空格在中間,轉(zhuǎn)換結(jié)果就是 NaN。
+" 66" // 66 +" 6 7 " // NaN原始值到對(duì)象的轉(zhuǎn)換
null 和 undefined 轉(zhuǎn)對(duì)象直接拋異常
原始值通過調(diào)用 String()、Number()、Boolean()構(gòu)造函數(shù),轉(zhuǎn)換為他們各自的包裝對(duì)象
對(duì)象到原始值的轉(zhuǎn)換對(duì)象轉(zhuǎn)為布爾都為 true
對(duì)象到字符串
如果對(duì)象有 toString() 方法,就調(diào)用 toString() 方法。如果該方法返回原始值,就講這個(gè)值轉(zhuǎn)化為字符串。
如果對(duì)象沒有 toString() 方法或者 該方法返回的不是原始值,就會(huì)調(diào)用該對(duì)象的 valueOf() 方法。如果存在就調(diào)用這個(gè)方法,如果返回值是原始值,就轉(zhuǎn)化為字符串。
否則就報(bào)錯(cuò)
對(duì)象到數(shù)字
對(duì)象轉(zhuǎn)化為數(shù)字做了跟對(duì)象轉(zhuǎn)化為字符串做了想同的事兒,不同的是后者是先調(diào)用 valueOf 方法,如果調(diào)用失敗或者返回不是原始值,就調(diào)用 toString 方法。
補(bǔ)充。一些常用內(nèi)置對(duì)象 toString 方法和 valueOf 的轉(zhuǎn)換規(guī)則
toString 相關(guān)
- valueOf 相關(guān)== 運(yùn)算符如何進(jìn)行類型轉(zhuǎn)換
如果一個(gè)值是null,另一個(gè)值是undefined,則相等
如果一個(gè)是字符串,另一個(gè)值是數(shù)字,則把字符串轉(zhuǎn)換成數(shù)字,進(jìn)行比較
如果任意值是true,則把true轉(zhuǎn)換成1再進(jìn)行比較;如果任意值是false,則把false轉(zhuǎn)換成0再進(jìn)行比較
如果一個(gè)是對(duì)象,另一個(gè)是數(shù)值或字符串,把對(duì)象轉(zhuǎn)換成基礎(chǔ)類型的值再比較。對(duì)象轉(zhuǎn)換成基礎(chǔ)類型,利用它的 toString 或者 valueOf 方法。 js 核心內(nèi)置類,會(huì)嘗試 valueOf 先于 toString(可以理解為對(duì)象優(yōu)先轉(zhuǎn)換成數(shù)字);例外的是 Date,Date 利用的是 toString 轉(zhuǎn)換。非 js 核心的對(duì)象,通過自己的實(shí)現(xiàn)中定義的方法轉(zhuǎn)換成原始值。
+ 運(yùn)算符如何進(jìn)行類型轉(zhuǎn)化
如果作為一元運(yùn)算符就是轉(zhuǎn)化為數(shù)字,常常用來將字符串轉(zhuǎn)化為數(shù)字
+"2" // 2 2+false // 0
如果作為二元運(yùn)算符就有兩種轉(zhuǎn)換方式
兩邊如果有字符串,另一邊一會(huì)轉(zhuǎn)化為字符串進(jìn)行相加
如果沒有字符串,兩邊都會(huì)轉(zhuǎn)化為數(shù)字進(jìn)行相加,對(duì)象也根據(jù)前面的方法轉(zhuǎn)化為原始值數(shù)字。
如果其中的一個(gè)操作數(shù)是對(duì)象,則將對(duì)象轉(zhuǎn)換成原始值,日期對(duì)象會(huì)通過 toString() 方法進(jìn)行轉(zhuǎn)換,其他對(duì)象通過 valueOf()方法進(jìn)行轉(zhuǎn)換,但是大多數(shù)方法都是不具備可用的 valueOf() 方法,所以還是會(huì)通過 toString() 方法執(zhí)行轉(zhuǎn)換。
流程圖如下:
_1. 首先運(yùn)算符是 + 運(yùn)算符而且很明顯是二元運(yùn)算符,并且有對(duì)象,所以選擇最后一點(diǎn),操作數(shù)是對(duì)象,將對(duì)象轉(zhuǎn)換為原始值。
_2. 兩邊對(duì)象都是數(shù)組,左邊的數(shù)組先調(diào)用 valueOf() 方法無果,然后去調(diào)用 toString(), 方法,在 toString() 的轉(zhuǎn)化規(guī)則里面有『將數(shù)組轉(zhuǎn)化為字符串,用逗號(hào)分隔』,由于沒有其他元素,所以直接是空字符串 “”。
![](https://user-gold-cdn.xitu.io/2018/8/7/165124228cd61ccc?w=236&h=64&f=png&s=2453)
_3. 因?yàn)榧犹?hào)有一邊是字符串了,所以另外一邊也轉(zhuǎn)為 字符串,所以兩邊都是空字符串 “”。
_4. 所以加起來也是空字符串 “”。
2. (! + [] + [] + ![]).length // 9_1. 首先我們會(huì)看到挺多一元運(yùn)算符,「+」、「!」,對(duì)于一元運(yùn)算符是右結(jié)合性,所以可以畫出以下運(yùn)算順序。
_2. 對(duì)于+[],數(shù)組是會(huì)被轉(zhuǎn)化為數(shù)字的而不是字符串,可見「+ 運(yùn)算符如何進(jìn)行類型轉(zhuǎn)化」的第一條,所以經(jīng)過第一步就會(huì)轉(zhuǎn)化為
(!0 + [] + "false").length
_3. 第二步比較簡(jiǎn)單,0 轉(zhuǎn)化為布爾值就是 false,所以經(jīng)過第二步就轉(zhuǎn)化為
(true + [] + "false").length
_4. 第三步中間的 []會(huì)轉(zhuǎn)為空字符串,在「+ 運(yùn)算符如何進(jìn)行類型轉(zhuǎn)化」第二條的第三點(diǎn),對(duì)象會(huì)被轉(zhuǎn)轉(zhuǎn)化為原始值,就是空字符,所以經(jīng)過第三步之后就會(huì)變成
("true" + "false").length
_5. 第五步就比較簡(jiǎn)單啦,最終就是
"truefalse".length // 9
附錄:
《JavaScript權(quán)威指南》中類型轉(zhuǎn)換表格
個(gè)人公眾號(hào),歡迎繼續(xù)交流
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/96800.html
摘要:相對(duì)于顯式使用,隱式轉(zhuǎn)換則更加簡(jiǎn)潔。隱式轉(zhuǎn)換為布爾值將其他類型值隱式轉(zhuǎn)換為布爾值是我們最常用的一種轉(zhuǎn)換。在以下場(chǎng)景中,都是進(jìn)行判斷,而只要傳入的值不是布爾值,都會(huì)通過隱式類型轉(zhuǎn)換轉(zhuǎn)為布爾值。原文地址阿木木的博客與隱式鴨子類型轉(zhuǎn)換 showImg(https://segmentfault.com/img/remote/1460000017309581); 前言 說實(shí)話,JavaScrip...
摘要:例如允許的對(duì)象默認(rèn)情況下,通過使用內(nèi)置宏將核心對(duì)象和方法映射到。例如這被轉(zhuǎn)換為以下代碼類可以定義構(gòu)造函數(shù),具有超類,并且可以像在中一樣實(shí)例化。因此,它不違反原則。用于聲明該對(duì)象可以用作構(gòu)造函數(shù)。 這個(gè)工具可以將java代碼轉(zhuǎn)為js代碼,從而可以使用java編寫前端代碼 如果排版看著費(fèi)勁可以下載下方html,打開html后使用google翻譯 JSweet語言規(guī)范版本:2.x(快照) 作...
摘要:例如允許的對(duì)象默認(rèn)情況下,通過使用內(nèi)置宏將核心對(duì)象和方法映射到。例如這被轉(zhuǎn)換為以下代碼類可以定義構(gòu)造函數(shù),具有超類,并且可以像在中一樣實(shí)例化。因此,它不違反原則。用于聲明該對(duì)象可以用作構(gòu)造函數(shù)。 這個(gè)工具可以將java代碼轉(zhuǎn)為js代碼,從而可以使用java編寫前端代碼 如果排版看著費(fèi)勁可以下載下方html,打開html后使用google翻譯 JSweet語言規(guī)范版本:2.x(快照) 作...
摘要:運(yùn)算符運(yùn)算符一共分為六種算數(shù)運(yùn)算符比較運(yùn)算符邏輯運(yùn)算符賦值運(yùn)算符字符串聯(lián)接運(yùn)算符條件運(yùn)算符運(yùn)算符的概念提供的一組用于操作數(shù)據(jù)值的運(yùn)算符操作符。這些運(yùn)算符可以按照作用的不同或者操作變量數(shù)量的不同進(jìn)行分類。 運(yùn)算符 ——運(yùn)算符一共分為六種;1.算數(shù)運(yùn)算符2.比較運(yùn)算符3.邏輯運(yùn)算符4.賦值運(yùn)算符5.字符串聯(lián)接運(yùn)算符6.條件運(yùn)算符——運(yùn)算符的概念;JavaScript提供的一組用于操作數(shù)據(jù)值...
摘要:只是瀏覽器只是實(shí)現(xiàn)可能的宿主環(huán)境之一,其他宿主環(huán)境包括和。級(jí)別級(jí)由兩個(gè)模塊組成核心和。有效不推薦有一點(diǎn)必須注意,即用操作符定義的變量將成為定義該變量的作用域的局部變量。會(huì)返回判斷相等符認(rèn)為兩者相等。顯示因此盡量避免這樣運(yùn)算。 一:JavaScript組成部分 JavaScript是由三個(gè)不同部分組成的,核心(ECMAScript) 、文檔對(duì)象模型(DOM)和瀏覽器對(duì)象模型(BOM)。 ...
閱讀 3941·2021-11-17 09:33
閱讀 3288·2021-10-08 10:05
閱讀 3117·2021-09-22 15:36
閱讀 1143·2021-09-06 15:02
閱讀 2774·2019-08-29 12:45
閱讀 1594·2019-08-26 13:40
閱讀 3404·2019-08-26 13:37
閱讀 425·2019-08-26 13:37