摘要:下面分幾步來(lái)簡(jiǎn)單的探探不同類型的轉(zhuǎn)換吧以下的內(nèi)容,都可以從權(quán)威指南中找到。其他值轉(zhuǎn)換成在編寫(xiě)代碼的過(guò)程中,幾乎不用考慮它的取值類型。核心內(nèi)置類,會(huì)嘗試先于可以理解為對(duì)象優(yōu)先轉(zhuǎn)換成數(shù)字例外的是,利用的是轉(zhuǎn)換。
弱類型帶來(lái)的那些讓人迷糊的事最近在寫(xiě)公司的登錄注冊(cè)模塊,遇到類型不同相比較的時(shí)候,就心驚膽戰(zhàn),每次都要用瀏覽器來(lái)驗(yàn)證一下,決定亂七八糟的隨便寫(xiě)一下,方便日后自己回顧知識(shí)~
弱類型帶來(lái)的好處之一:終于不用自己確定數(shù)據(jù)類型了。
寫(xiě)C++這類的強(qiáng)類型語(yǔ)言,每次都要先確定是int、char還是string之類的,但是僅僅通過(guò)var,怎么解決工作過(guò)程中的不同數(shù)據(jù)類型的比較問(wèn)題的呢?
這個(gè)問(wèn)題煩了我很久,當(dāng)初學(xué)js的時(shí)候就只能記住最簡(jiǎn)單的其他類型到boolean的轉(zhuǎn)換,涉及到其他的,只能暈菜。。。
下面分幾步來(lái)簡(jiǎn)單的探探不同類型的轉(zhuǎn)換吧~
以下的內(nèi)容,都可以從《JavaScript權(quán)威指南》中找到。
其他值轉(zhuǎn)換成boolean在編寫(xiě)JavaScript代碼的過(guò)程中,幾乎不用考慮它的取值類型。在工作過(guò)程中,我們有可能會(huì)需要在if的條件判斷中對(duì)參數(shù)進(jìn)行判斷,這就涉及到了boolean值的轉(zhuǎn)換。
當(dāng)JavaScript期望使用一個(gè)布爾值的時(shí)候,你可以提供任意類型值,JavaScript將根據(jù)需要自行轉(zhuǎn)換類型,一些值(真值)轉(zhuǎn)為true,其他值(假值)轉(zhuǎn)為false--《JavaScript權(quán)威指南》(page 48)
對(duì)于布爾值類型的轉(zhuǎn)換,實(shí)際上只需要特別記住幾個(gè)特殊的會(huì)轉(zhuǎn)換成false的值就可以了
這些值包括:undefined、null、false、""、0、-0、NaN
所有的其他值(包括所有對(duì)象)都會(huì)轉(zhuǎn)換成true
一般在工作中,我們可以直接使用:
if (value){ ... }
根據(jù)js的語(yǔ)言特性,可以讓瀏覽器直接替我們判斷,省時(shí)省力,我個(gè)人不太喜歡下面的寫(xiě)法:
if (value == null){ ... }
盡管這樣也可以達(dá)成目標(biāo),但是總感覺(jué)多敲了代碼,還需要特別注意如果不是null或者undefined,但也是假值的情況。
需要特別注意:假值中包含0 or -0的情況
還有一個(gè)小點(diǎn)需要特別注意一下:jQuery中選擇符選擇某個(gè)DOM節(jié)點(diǎn),也許這個(gè)DOM節(jié)點(diǎn)并不存在,但是$(selector)返回的值是一個(gè)對(duì)象,所以,我們判斷是否存在這個(gè)DOM,需要通過(guò)$(selector).length > 0來(lái)判斷是否存在。
原始值轉(zhuǎn)換成字符串原始值:數(shù)字、字符串、布爾值、null、undefined
原始值轉(zhuǎn)換成字符串的情況估計(jì)是最簡(jiǎn)單的了,可以直接理解成在原始值的兩邊加上""就行了
undefined --> "undefined" null --> "null" true --> "true" false --> "false" 0 --> "0" -0 --> "-0" NaN --> "NaN" Infinity --> "Infinity" -Infinity --> "-Infinity" 1 --> "1" ......原始值轉(zhuǎn)換成數(shù)字
除了字符串,大部分原始值都會(huì)有固定的轉(zhuǎn)換結(jié)果,如下:
undefined --> NaN null --> 0 true --> 1 false --> 0
但是,字符串的轉(zhuǎn)換有點(diǎn)微妙,給我的感覺(jué)有點(diǎn)類似Number()方法,但是注意,只是類似,調(diào)用Number()會(huì)生成包裝對(duì)象,而不是一個(gè)數(shù)字。
字符串轉(zhuǎn)換成數(shù)字,會(huì)有以下的特點(diǎn):
以數(shù)字表示的字符串可以直接轉(zhuǎn)換成數(shù)字
允許字符串開(kāi)頭跟結(jié)尾帶有空格
在開(kāi)始和結(jié)尾處的任意非空格符都不會(huì)被當(dāng)成數(shù)字直接量的一部分,轉(zhuǎn)換結(jié)果變成NaN
結(jié)果如下:
"one" --> NaN "u123" --> NaN " 123" --> 123 "123 " --> 123 " 12 " --> 12原始值轉(zhuǎn)換成對(duì)象
原理:原始值通過(guò)調(diào)用String()、Number()、Boolean()構(gòu)造函數(shù),轉(zhuǎn)換成他們各自的包裝對(duì)象
存取字符串、數(shù)字或者布爾值的屬性的時(shí)候創(chuàng)建的臨時(shí)對(duì)象叫做包裝對(duì)象,他只是偶爾用來(lái)區(qū)分字符串值和字符串對(duì)象、數(shù)字和數(shù)值對(duì)象以及布爾值布爾對(duì)象。通常,包裝對(duì)象只是被看做是一種實(shí)現(xiàn)細(xì)節(jié),而不用特別關(guān)注。--《JavaScript權(quán)威指南》(page46)
但是null和undefined信仰比較堅(jiān)定,就是不想轉(zhuǎn)成對(duì)象,從而,當(dāng)將它們用在期望是一個(gè)對(duì)象的地方都會(huì)拋出一個(gè)錯(cuò)誤throws TypeError
注意:只是在轉(zhuǎn)換的過(guò)程中會(huì)拋出Error,在顯性創(chuàng)建對(duì)象的時(shí)候,不會(huì)報(bào)錯(cuò)
對(duì)象轉(zhuǎn)換成原始值,可以分成以下三種:
對(duì)象轉(zhuǎn)換成boolean值
對(duì)象轉(zhuǎn)換成字符串(object-to-string)
對(duì)象轉(zhuǎn)換成數(shù)字(object-to-number)
其中,對(duì)象轉(zhuǎn)換成boolean值,規(guī)則非常簡(jiǎn)單:所有的對(duì)象都轉(zhuǎn)換成true(包括包裝對(duì)象)
注意:new Boolean(false)是一個(gè)對(duì)象,轉(zhuǎn)換成布爾值也是true
而對(duì)象轉(zhuǎn)換成字符串以及對(duì)象轉(zhuǎn)換成數(shù)字根據(jù)場(chǎng)景不同,有些復(fù)雜,在學(xué)習(xí)了解他們的轉(zhuǎn)換過(guò)程之前,先來(lái)看兩個(gè)函數(shù):toString()以及valueOf()
1、在MDN中搜索toString,你會(huì)發(fā)現(xiàn)如下情形:
如果細(xì)細(xì)查看,你會(huì)發(fā)現(xiàn):所有的對(duì)象都有toString()方法,作用就是返回一個(gè)反映這個(gè)對(duì)象的字符串。
但是,這個(gè)方法返回的值有些時(shí)候不是那么的好。
例如:Object.prototypr.toString()
默認(rèn)情況下,每個(gè)對(duì)象都會(huì)從Object上繼承到toString()方法,如果這個(gè)方法沒(méi)有被這個(gè)對(duì)象自身或者更接近的上層原型上的同名方法覆蓋(遮蔽),則調(diào)用該對(duì)象的toString()方法時(shí)會(huì)返回"[object type]",這里的字符串type表示了一個(gè)對(duì)象類型。
例如:
var o = new Object(); o.toString() //返回[object Object]
很多類定義了很多特定版本的toString()方法:
數(shù)組類Array.prototype.toString()
函數(shù)類Function.prototype.toString()
日期類Date.prototype.toString()
正則類RegExp.prototype.toString()
······
使用方法及返回結(jié)果如下:
2、在MDN搜索valueOf,可以得到與toString相似的結(jié)果。
但是,這個(gè)方法的任務(wù)并沒(méi)有詳細(xì)的定義,我甚至無(wú)法從MDN的描述中得出它與toString的區(qū)別。
JavaScript calls the valueOf method to convert an object to a primitive value. You rarely need to invoke the valueOf method yourself; JavaScript automatically invokes it when encountering an object where a primitive value is expected.
也許從下面的代碼中我們可以初窺一二:
[1,2,3].toString() // --> "1,2,3" [1,2,3].valueOf() // --> [1, 2, 3] (function(x){f(x);}).toString() // --> "function (x){f(x);}" (function(x){f(x);}).valueOf() // --> function anonymous(x) /d+/g.toString() // -->"/d+/g" /d+/g.valueOf() // --> /d+/g new Date(2010,0,1).toString() // --> "Fri Jan 01 2010 00:00:00 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)" new Date(2010,0,1).valueOf() // --> 1262275200000
根據(jù)上面的結(jié)果,可以嘗試得出以下的結(jié)論:
對(duì)象是復(fù)合值,而且大多數(shù)對(duì)象無(wú)法真正表示為一個(gè)原始值,因此默認(rèn)的`valueOf()`方法簡(jiǎn)單地返回對(duì)象本身,而不是返回一個(gè)原始值
數(shù)組、函數(shù)以及正則表達(dá)式簡(jiǎn)單地繼承了這個(gè)默認(rèn)的方法,而日期類定義的valueOf()方法返回它的一個(gè)內(nèi)部表示:1970年1月1日以來(lái)的毫秒數(shù)
有了上面的兩個(gè)方法,我們就可以進(jìn)行對(duì)象到字符串以及對(duì)象到數(shù)字的轉(zhuǎn)換了。
對(duì)象到字符串的轉(zhuǎn)換的步驟如下:
如果對(duì)象具有toString()方法,那么就調(diào)用這個(gè)方法,返回一個(gè)原始值,如果這個(gè)值本身不是字符串,JavaScript會(huì)將其轉(zhuǎn)換成字符串,并返回字符串的結(jié)果。
如果沒(méi)有toString()方法,或者這個(gè)方法不返回一個(gè)原始值,那么調(diào)用valueOf()方法,返回一個(gè)原始值,如果這個(gè)值本身不是字符串,JavaScript會(huì)將其轉(zhuǎn)換成字符串,并返回字符串的結(jié)果。
否則JavaScript無(wú)法從toString()或者valueOf()獲得一個(gè)原始值,這時(shí)拋出一個(gè)類型錯(cuò)誤。
對(duì)象到數(shù)字的轉(zhuǎn)換的步驟如下:
如果對(duì)象具有valueOf()方法,那么就調(diào)用這個(gè)方法,返回一個(gè)原始值,如果這個(gè)值本身不是字符串,JavaScript會(huì)將其轉(zhuǎn)換成字符串,并返回字符串的結(jié)果。
如果沒(méi)有valueOf()方法,或者這個(gè)方法不返回一個(gè)原始值,那么調(diào)用toString()方法,返回一個(gè)原始值,如果這個(gè)值本身不是字符串,JavaScript會(huì)將其轉(zhuǎn)換成字符串,并返回字符串的結(jié)果。
否則JavaScript無(wú)法從toString()或者valueOf()獲得一個(gè)原始值,這時(shí)拋出一個(gè)類型錯(cuò)誤。
結(jié)束了?你還沒(méi)考慮應(yīng)用呢!由于JavaScript是弱類型語(yǔ)言,所以我們對(duì)于類型轉(zhuǎn)換的應(yīng)用其實(shí)有許多。
例如:if判斷、+運(yùn)算符以及==運(yùn)算符等等
關(guān)于+:
進(jìn)行數(shù)字加法以及字符串連接操作
如果其中的一個(gè)操作數(shù)是對(duì)象,則將對(duì)象轉(zhuǎn)換成原始值
==也是js判斷中常用的涉及到類型轉(zhuǎn)換的一個(gè)運(yùn)算符
關(guān)于==:
如果兩個(gè)值類型相同,進(jìn)行===比較
如果兩個(gè)值類型不同,他們可能相等,需要按照一定的規(guī)則來(lái)進(jìn)行類型轉(zhuǎn)換并比較
==類型不同時(shí)的轉(zhuǎn)換規(guī)則:
如果一個(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ì)象,通過(guò)自己的實(shí)現(xiàn)中定義的方法轉(zhuǎn)換成原始值
關(guān)于比較運(yùn)算符<、|、>、|、<、=、|、>、=
如果操作數(shù)為對(duì)象,那么這個(gè)對(duì)象將轉(zhuǎn)換成原始值:如果valueof()返回一個(gè)原始值,那么直接使用這個(gè)原始值。否則,使用toString()的轉(zhuǎn)換結(jié)果進(jìn)行比較操作
在對(duì)象轉(zhuǎn)換成原始值之后,如果兩個(gè)操作數(shù)都是字符串,那么將按照字母表的順序?qū)蓚€(gè)字符串進(jìn)行比較,字母表的順序是指組成這個(gè)字符串的16位unicode字符的索引順序。注意:字符串比較是區(qū)分大小寫(xiě)的,所有大寫(xiě)的ASCII字母都小于所有小寫(xiě)的ASCII字母
在對(duì)象轉(zhuǎn)換成原始值之后,如果至少有一個(gè)操作數(shù)不是字符串,那么兩個(gè)操作數(shù)都將轉(zhuǎn)換成數(shù)字進(jìn)行數(shù)值比較。0與-0是相等的。Infinity比其他任何數(shù)字都大(除了Infinity本身),-Infinity比其他任何數(shù)字都要小(除了它本身)。如果其中一個(gè)操作數(shù)是(或轉(zhuǎn)換后是)NaN,那么比較操作符總是返回false
加號(hào)運(yùn)算符與比較運(yùn)算符的區(qū)別
加法運(yùn)算符更偏愛(ài)字符串的操作,比較運(yùn)算符更偏愛(ài)數(shù)字
只有兩個(gè)操作數(shù)都是字符串,才進(jìn)行字符串的比較
1+2 //加法,結(jié)果是3 "1"+"2" //字符串連接,結(jié)果是"12" "1"+2 //字符串連接,結(jié)果是"12" 11 < 2 //數(shù)字的比較,結(jié)果是false "11" < "3" //字符串比較,結(jié)果為true "11" < 3 // 數(shù)字比較,"11"轉(zhuǎn)換成11,結(jié)果為false "one" < 3 //數(shù)字的比較,"one"轉(zhuǎn)換成NaN,結(jié)果為false
注意:<=以及>=在判斷相等的情況的時(shí)候,并不依賴相等或者嚴(yán)格相等運(yùn)算符的比較規(guī)則,它們只是簡(jiǎn)單的不大于、不小于
反思昨天公司的一件事對(duì)我的觸動(dòng)挺大的,公司里面的兩個(gè)后臺(tái)為了表單提交是用GET還是POST爭(zhēng)吵了半個(gè)小時(shí)。有些時(shí)候,不經(jīng)意就會(huì)忽略一些問(wèn)題,比如代碼的質(zhì)量,性能的提高,這些都是值得程序猿們深入探究的問(wèn)題。
記得有過(guò)這樣一句話“你對(duì)待技術(shù)的態(tài)度,就是你對(duì)待生命的態(tài)度”。
作為一名小猿,繼續(xù)奮斗去嘍~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91541.html
摘要:數(shù)據(jù)類型轉(zhuǎn)換原文鏈接是一種弱類型語(yǔ)言,即不需要明確聲明變量的類型,可以隨時(shí)賦予任意類型的值。強(qiáng)制轉(zhuǎn)換顯式轉(zhuǎn)換強(qiáng)制轉(zhuǎn)換主要指使用和三個(gè)構(gòu)造函數(shù),手動(dòng)將各種類型的值,轉(zhuǎn)換成數(shù)字字符串或者布爾值。如果該值不能完全轉(zhuǎn)換為整型或浮點(diǎn)型,則返回。 JavaScript 數(shù)據(jù)類型轉(zhuǎn)換 原文鏈接 JavaScript 是一種弱類型語(yǔ)言,即不需要明確聲明變量的類型,可以隨時(shí)賦予任意類型的值。 強(qiáng)制轉(zhuǎn)換...
摘要:但是,我們可以借用類數(shù)組方法不難看出,此時(shí)的在調(diào)用數(shù)組原型方法時(shí),返回值已經(jīng)轉(zhuǎn)化成數(shù)組了。很多時(shí)候,深入看看源代碼也會(huì)讓你對(duì)這個(gè)理解的更透徹。的前端樂(lè)園原文鏈接深入理解類數(shù)組 起因 寫(xiě)這篇博客的起因,是我在知乎上回答一個(gè)問(wèn)題時(shí),說(shuō)自己在學(xué)前端時(shí)把《JavaScript高級(jí)程序設(shè)計(jì)》看了好幾遍。于是在評(píng)論區(qū)中,出現(xiàn)了如下的對(duì)話:showImg(https://segmentfault.c...
摘要:同理,若為,返回的結(jié)果若為或者,且為,返回的結(jié)果。同理,若為或者,且為,返回的結(jié)果是對(duì)象轉(zhuǎn)換基本類型的方法??磦€(gè)例子根據(jù)上述規(guī)則來(lái)解析為,上式為第條上式為第條上式為,上式為第條上式為 前不久因?yàn)橐粋€(gè)項(xiàng)目設(shè)計(jì)的問(wèn)題,煩心了好幾天,為了不留坑擁抱強(qiáng)類型語(yǔ)言特點(diǎn),還是選擇了===作為數(shù)據(jù)判斷是否相等,對(duì)于==今天來(lái)探究一下貓膩(弱類型的JavaScript的坑真的太多了,typescript...
摘要:抽象語(yǔ)法樹(shù)大致流程生成然后通過(guò)類型斷言進(jìn)行相應(yīng)的轉(zhuǎn)換反編譯工具全集小程序推薦逆向反編譯四大工具利器年支持的反編譯工具匯總原文 像軟件加密與解密一樣,javascript的混淆與解混淆同屬于同一個(gè)范疇。道高一尺,魔高一丈。沒(méi)有永恒的黑,也沒(méi)有永恒的白。一切都是資本市場(chǎng)驅(qū)動(dòng)行為,現(xiàn)在都流行你能為人解決什么問(wèn)題,這個(gè)概念。那么市場(chǎng)究竟能容納多少個(gè)能解決這種問(wèn)題的利益者。JS沒(méi)有秘密。 其實(shí)本...
摘要:的目標(biāo)是對(duì)高級(jí)程序中間表示的適當(dāng)?shù)图?jí)抽象,即代碼旨在由編譯器生成而不是由人來(lái)寫(xiě)。表示把源代碼變成解釋器可以運(yùn)行的代碼所花的時(shí)間表示基線編譯器和優(yōu)化編 WebAssembly 那些事兒 什么是 WebAssembly? WebAssembly 是除 JavaScript 以外,另一種可以在網(wǎng)頁(yè)中運(yùn)行的編程語(yǔ)言,并且相比之下在某些功能和性能問(wèn)題上更具優(yōu)勢(shì),過(guò)去我們想在瀏覽器中運(yùn)行代碼來(lái)對(duì)網(wǎng)...
閱讀 1694·2019-08-30 15:54
閱讀 3346·2019-08-26 17:15
閱讀 3536·2019-08-26 13:49
閱讀 2589·2019-08-26 13:38
閱讀 2301·2019-08-26 12:08
閱讀 3065·2019-08-26 10:41
閱讀 1377·2019-08-26 10:24
閱讀 3387·2019-08-23 18:35