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

資訊專(zhuān)欄INFORMATION COLUMN

原生JS大揭秘—揭開(kāi)數(shù)據(jù)類(lèi)型轉(zhuǎn)換的面紗

Moxmi / 3311人閱讀

摘要:可以將其他類(lèi)型轉(zhuǎn)成字符串函數(shù)可以將任意類(lèi)型的值轉(zhuǎn)為布爾值。提示空數(shù)組空對(duì)象轉(zhuǎn)換為布爾型也是。

在JS中數(shù)據(jù)類(lèi)型轉(zhuǎn)換有兩種
相關(guān)資料參閱

官方ecma-5規(guī)范
阮一峰老師類(lèi)型轉(zhuǎn)換
規(guī)范對(duì)相等==定義

強(qiáng)制類(lèi)型轉(zhuǎn)換
Number() Number函數(shù)將字符串轉(zhuǎn)為數(shù)值,要比parseInt函數(shù)嚴(yán)格很多,只要有一個(gè)字符是非數(shù)字(空格、+、-除外),那么就會(huì)被轉(zhuǎn)為NaN。

String() 可以將其他類(lèi)型轉(zhuǎn)成字符串
Boolean() 函數(shù)可以將任意類(lèi)型的值轉(zhuǎn)為布爾值。

隱式類(lèi)型轉(zhuǎn)換
https://www.jianshu.com/p/b07...
https://www.jianshu.com/p/b16...

哪些情況下會(huì)發(fā)生隱式類(lèi)型轉(zhuǎn)換?

不同類(lèi)型的數(shù)據(jù)互相運(yùn)算

對(duì)非布爾值類(lèi)型的數(shù)據(jù)求布爾值

對(duì)非數(shù)值類(lèi)型的使用一元運(yùn)算符(即"+""-")

重點(diǎn)說(shuō)明: 操作符"+"是一個(gè)比較難搞、比較另類(lèi)、比較奇葩的東西,"+"有兩種使用含義

有字符串時(shí),表示字符串拼接

無(wú)字符串時(shí),表示算術(shù)加法

簡(jiǎn)單的來(lái)說(shuō)就是看"+"的兩端是否有任一個(gè)是字符串,有為"字符串拼接",否則為"算術(shù)加法"。

隱式類(lèi)型轉(zhuǎn)換原則

都是數(shù)字,直接運(yùn)算

都是字符串,使用字符對(duì)應(yīng)的ASCII值運(yùn)算

有一個(gè)是boolean值,將boolean值轉(zhuǎn)成數(shù)字,true->1或false->0

有一個(gè)是數(shù)字,將另一個(gè)轉(zhuǎn)成數(shù)字

只有一個(gè)是對(duì)象,則先將對(duì)象轉(zhuǎn)成原始值,在執(zhí)行操作

轉(zhuǎn)換過(guò)程中如果有NaN出現(xiàn),則結(jié)果是NaN或false

重點(diǎn)說(shuō)明:null、undefined進(jìn)行"=="比較時(shí)不進(jìn)行類(lèi)型轉(zhuǎn)換(但是ECMA規(guī)范中定義null==undefined // true ),其他運(yùn)算操作時(shí)會(huì)轉(zhuǎn)換。
"=="比較時(shí),只有三種情況為true:
1、null==null
2、null==undefined
3、undefined==undefined
除以上三種情況外其他都不相等,返回false

說(shuō)到NaN,隨便講一下全局函數(shù)isNaN(),我們都知道這個(gè)函數(shù)判斷不準(zhǔn)確,為什么呢?什么原因造成的呢?其實(shí)isNaN()方法只執(zhí)行前,會(huì)對(duì)變量進(jìn)行隱式類(lèi)型轉(zhuǎn)換比如isNaN({}),返回true
首先進(jìn)行隱式類(lèi)型轉(zhuǎn)換,將{}=>Number,最終得到NaN,所以isNaN({})得到true

引用類(lèi)型轉(zhuǎn)成原始類(lèi)型分析

在JS內(nèi)部定義了4個(gè)抽象操作(只能供JS內(nèi)部使用,我們用戶(hù)無(wú)法操作)

ToPrimitive(obj, [PreferredType])
obj:待轉(zhuǎn)換的對(duì)象
PreferredType:待轉(zhuǎn)成的目標(biāo)類(lèi)型(只接受Number、String兩種類(lèi)型,默認(rèn)是空),如果obj是Datesymbol,則PreferredType=String,其余的情況下PreferredType=Number

如果PreferredType=Number,引用類(lèi)型轉(zhuǎn)化為數(shù)字
1、調(diào)用valueOf(),如果返回原始值,則結(jié)束,如果返回非原始值,則執(zhí)行第2步
2、調(diào)用toString(),如果返回原始值,則結(jié)束,如果返回非原始值,則報(bào)錯(cuò)

如果PreferredType=String,引用類(lèi)型轉(zhuǎn)換為字符串
1、調(diào)用toString(),如果返回原始值,則結(jié)束,如果返回非原始值,則執(zhí)行第2步
2、調(diào)用valueOf(),如果返回原始值,則結(jié)束,如果返回非原始值,則報(bào)錯(cuò)

引用類(lèi)型轉(zhuǎn)換為布爾類(lèi)型,始終返回true

ToNumber(arguments)

ToString(arguments)

ToBoolean(arguments)

在執(zhí)行隱式類(lèi)型轉(zhuǎn)換時(shí),會(huì)自動(dòng)調(diào)用這四個(gè)內(nèi)部方法
原始值之間相互轉(zhuǎn)換:ToNumber()、ToString()、ToBoolean()
引用值到原始值轉(zhuǎn)換: ToPrimitive()
在執(zhí)行顯示類(lèi)型轉(zhuǎn)換時(shí),如Number()、String()、Boolean()時(shí),內(nèi)部還是調(diào)用ToNumber()、ToString()、ToBoolean(),如果待轉(zhuǎn)換的是引用類(lèi)型,則先執(zhí)行ToPrimitive(),得到原始值,再執(zhí)行ToNumber()、ToString()、ToBoolean()

這里特別說(shuō)明:把引用值轉(zhuǎn)原始值的過(guò)程中JS內(nèi)部在調(diào)用ToPrimitive()方法時(shí),分為兩種情況
1、明確指定目標(biāo)轉(zhuǎn)換類(lèi)型:按照指定類(lèi)型去調(diào)用toString()/valueOf()方法
2、沒(méi)有指定目標(biāo)轉(zhuǎn)換類(lèi)型:按照obj是否是Date類(lèi)型,去調(diào)用toString()/valueOf()方法

不同類(lèi)型的對(duì)象調(diào)用toString()返回值不同:

{} => "[object Object]"

[] => ""

[1,2,3] => "1,2,3"

function(){} => "function(){}"

Date => "Mon Feb 12 2018 15:44:57 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)"

RegExp => "/d/"正則字面量的字符串

不同類(lèi)型的對(duì)象調(diào)用valueOf()返回值不同

Date類(lèi)型 => 1518421497815 返回自1970年1月1日至現(xiàn)在的時(shí)間戳毫秒數(shù)

其他的類(lèi)型 => 一律返回對(duì)象自身

JS數(shù)據(jù)類(lèi)型之原始值與引用值的轉(zhuǎn)換關(guān)系圖解

重點(diǎn)說(shuō)明: 通過(guò)new Number()/new String()/new Boolean()得到的是對(duì)象(無(wú)論傳入什么參數(shù)),該對(duì)象有一個(gè)屬性[[PrimitiveValue]]`,此屬性保存著該對(duì)象對(duì)應(yīng)的原始值。

對(duì)于包裝對(duì)象而來(lái),轉(zhuǎn)換成原始值時(shí),有點(diǎn)特殊(不同于{}[]這種類(lèi)型的對(duì)象),

valueOf(): 獲取[[PrimitiveValue]]屬性的值

toString(): 獲取[[PrimitiveValue]]屬性值的字符串形式

JS中數(shù)據(jù)轉(zhuǎn)換圖表
原始類(lèi)型 目標(biāo)類(lèi)型(Number) 目標(biāo)類(lèi)型(String) 目標(biāo)類(lèi)型(Boolean) 目標(biāo)類(lèi)型(Object)
undefined NaN "undefined" false throw TypeError
null 0 "null" false throw TypeError
true 1 "true" true new Boolean(true)
false 0 "false" false new Boolean(true)
0 0 "0" false new Number(0)
-0 -0 "-0" false new Number(-0)
NaN NaN "NaN " false new Number(NaN)
Infinity Infinity "Infinity " true new Number(Infinity )
Infinity -Infinity "-Infinity " true new Number(-Infinity )
"7" 7 "7" true new String("7")
"" 0 "" 當(dāng)且僅當(dāng)是空字符串(即長(zhǎng)度為0)時(shí),才返回false,其他返回true,也就是" "為true new String("")
"7M" NaN "7M" true new String("7M")
"M" NaN "M" true new String("M")
[] 0 "" true []
["7"] 7 "7" true []
{} 先ToPrimitive,再執(zhí)行以上規(guī)則 先ToPrimitive,再執(zhí)行以上規(guī)則 true {}
function(){} NaN true true function(){}

https://www.jianshu.com/p/0af...
提示1:只有空字符串("")、null、undefined、+0、-0 和 NaN 轉(zhuǎn)為布爾型是 false,其他的都是 true。
提示2:空數(shù)組、空對(duì)象轉(zhuǎn)換為布爾型也是 true。
提示3:null 和 undefined 轉(zhuǎn)換為數(shù)字是表現(xiàn)不一,分別為0和NaN。

非數(shù)值型轉(zhuǎn)成數(shù)值型 非數(shù)值 -> 數(shù)值的方法有三種

Number()

parseInt()

parseFloat()

parseInt解刨
 ------------------------------------------------------------------------
 描述:是一個(gè)內(nèi)置的函數(shù),
 作用:可以把一個(gè)字符串轉(zhuǎn)成整形,parseInt的返回值只有兩種情況,a、十進(jìn)制整數(shù) b、NaN
 有兩個(gè)參數(shù)
   a、第一個(gè)參數(shù)表示待轉(zhuǎn)換的字符串(必須是字符串,如果不是字符串,則會(huì)發(fā)生隱式類(lèi)型轉(zhuǎn)換
      然后對(duì)轉(zhuǎn)換后的字符串進(jìn)行截取
   )

   b、第二個(gè)參數(shù)表示待轉(zhuǎn)換的字符串的進(jìn)制(默認(rèn)是10進(jìn)制)
      該值的范圍介于[2,36],如果進(jìn)制不在此范圍內(nèi)的,一律返回NaN

      注意:基數(shù)如果不是數(shù)值,則發(fā)生隱式類(lèi)型轉(zhuǎn)換,如果基數(shù)是NaN,則默認(rèn)基數(shù)是10

   特別注意,這里的默認(rèn)進(jìn)制10,是有條件的
   條件1,必須沒(méi)有明確指定進(jìn)制數(shù)
   條件2,待轉(zhuǎn)換的字符串,不是以0或0x打頭的

   在字符串以"0"為開(kāi)始時(shí)舊的瀏覽器默認(rèn)使用八進(jìn)制基數(shù)。ECMAScript 5,默認(rèn)的是十進(jìn)制的基數(shù)。
   如果沒(méi)有明確指定進(jìn)度,對(duì)于"0”打頭的字符串在“ES5之前”認(rèn)為是8進(jìn)制
                     對(duì)于"0”打頭的字符串在”ES5之后“認(rèn)為是10進(jìn)制

   如果有明確指定數(shù)的進(jìn)制,則以指定的進(jìn)度為準(zhǔn)

   var n=parseInt("11",2) //表示字符串"11"是2進(jìn)制的數(shù)
   var n=parseInt("11",8) //表示字符串"11"是8進(jìn)制的數(shù)
   var n=parseInt("11") //表示字符串"11"是10進(jìn)制的數(shù)

   //注意了,radix是0、10均表示10進(jìn)制的數(shù),省略的時(shí)候進(jìn)制可能是8、10、16
   var n=parseInt("11",0) //表示字符串"11"是10進(jìn)制的數(shù)
   var n=parseInt("11",NaN) //表示字符串"11"是10進(jìn)制的數(shù)
   var n=parseInt("11",10) //表示字符串"11"是10進(jìn)制的數(shù)


   使用方法總結(jié):
   1、看參數(shù)1是否是字符串,如果不是則先轉(zhuǎn)成字符串(如果是非字符串類(lèi)型,會(huì)發(fā)生隱式類(lèi)型轉(zhuǎn)換)
   2、先確定進(jìn)制
   3、根據(jù)進(jìn)制截取最終的字符串,如果最終是空字符串,則返回NaN
     (截取的規(guī)則是這樣的,從字符串的首位(如果是0的8進(jìn)制數(shù),則從0之后開(kāi)始截取,有點(diǎn)特殊;如果是0x的16進(jìn)制數(shù),則從0x之后開(kāi)始截取,有點(diǎn)特殊)
     (如果是空格、+會(huì)忽略哦,如果是-則會(huì)輸出)開(kāi)始,依次向后截取,直到“非數(shù)字”或者“非指定進(jìn)制范圍內(nèi)”的字符截止)
   4、轉(zhuǎn)成10進(jìn)制

   var num = parseInt(321, 0) //321
   var num = parseInt(321, NaN) //321
   var num = parseInt(321, 2) //NaN
   var num = parseInt("210", 3)//210
   var num = parseInt("329", 6)//20
   var num = parseInt("012", 0)//12
   var num = parseInt("0x12")//18
   var num = parseInt(parseInt,16)//15 這里為什么是15呢?因?yàn)閜arseInt是一個(gè)函數(shù),其實(shí)這里的值是"function(){}"
   var num = parseInt(alert,16)//15
   var num = parseInt(console.log,16)//15
   var num = parseInt(0.000005)//0,直接使用“字面量”表示
   var num = parseInt(0.0000005)//5,這里返回5是因?yàn)椋?shù)位后面長(zhǎng)度長(zhǎng)多6位時(shí),采用科學(xué)基數(shù)法表示,即”5e-7“

  =====================================================================
  對(duì)于數(shù)值型而言,小數(shù)位前長(zhǎng)度大于21或小數(shù)位后長(zhǎng)度大于6時(shí),均使用科學(xué)計(jì)數(shù)法表示
  =====================================================================



  執(zhí)行過(guò)程分析:(第一個(gè)參數(shù)命名為參數(shù)1,第二個(gè)參數(shù)命名為參數(shù)2)
  -----------------------------------------------------
  1、查看參數(shù)1是否是字符串,如果不是,則會(huì)發(fā)生隱式類(lèi)型轉(zhuǎn)換
  2、確定基數(shù)(進(jìn)制)
       a、有明確指定基數(shù),則以指定的基數(shù)為準(zhǔn)
       b、沒(méi)有明確指定基數(shù),則以參數(shù)1進(jìn)行判斷來(lái)確定基數(shù),
          首先,參數(shù)1字符串是以“0”打頭,則es5以前的版本中,基數(shù)為8,es5之后的版本中,基數(shù)為10
          其次,參數(shù)1字符串是以“0x"打頭,則基數(shù)是16,
          最后,其他情況,基數(shù)是10
  3、以確定的基數(shù)來(lái)對(duì)參數(shù)1字符串進(jìn)行有效性截?。ǚ菙?shù)字或基數(shù)范圍外的均視為非法字符)
  4、如果截取的字符串是空字符串,“”則返回NaN
     如果是非空有效的字符串,則按照進(jìn)制規(guī)則轉(zhuǎn)換成10進(jìn)制的數(shù)


     0 1 2 3 4 5 6 7 8 9  A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z
     0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35





[0/0] == NaN
Infinity/Infinity == NaN
0/NaN==NaN
NaN/0==NaN
0/Infinity == 0
Infinity/0 == Infinity

關(guān)于在JS中“{}”的使用特別說(shuō)明

表示代碼塊

表示一個(gè)JS對(duì)象

經(jīng)典特殊數(shù)據(jù)類(lèi)型轉(zhuǎn)換小結(jié)

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

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

相關(guān)文章

  • 原生JS揭秘—撩開(kāi)this面紗

    摘要:隨著函數(shù)使用場(chǎng)景的不同,而發(fā)生變化。是當(dāng)前執(zhí)行上下文中的一部分。在中新增了該方法也是強(qiáng)制更改指向。但是和的區(qū)別是更改后不會(huì)立即執(zhí)行,它會(huì)返回一個(gè)新函數(shù)。 this何意?在英文中this是一個(gè)人稱(chēng)代詞,表示這個(gè)的,具體指哪個(gè)?不確定,只有在具體的語(yǔ)境中才可確定,在編程語(yǔ)言中this也有同樣的類(lèi)似特性。在js中this是一個(gè)關(guān)鍵字,它不能被當(dāng)做變量、屬性,也不可以進(jìn)行賦值操作。this 隨...

    Brenner 評(píng)論0 收藏0
  • 自上而下,逐步揭開(kāi)PHP解析整數(shù)面紗

    摘要:而這個(gè)類(lèi)型的最終之所以輸出為,是因?yàn)檫M(jìn)行科學(xué)計(jì)數(shù)法之后的精度丟失了,重新轉(zhuǎn)成時(shí)就恢復(fù)不了原來(lái)的值。此類(lèi)問(wèn)題解決方案對(duì)于存儲(chǔ),超過(guò)最大表示范圍的純整數(shù),在中可以使用保存,在查詢(xún)出來(lái)的時(shí)候會(huì)將其使用類(lèi)型保存的。 遇到的問(wèn)題 最近遇到一個(gè)PHP大整數(shù)的問(wèn)題,問(wèn)題代碼是這樣的 $shopId = 17978812896666957068; var_dump($shopId); 上面的代碼輸出...

    qingshanli1988 評(píng)論0 收藏0
  • 劍指Kubernetes 揭秘騰訊云PaaS技術(shù)選型策略

    摘要:騰訊云在年底決定開(kāi)發(fā)容器產(chǎn)品隨后組建容器技術(shù)團(tuán)隊(duì)并進(jìn)行技術(shù)選型通過(guò)對(duì)不同編排工具的分析對(duì)比最終選擇作為容器編排引擎并且迅速在年初推出容器解決方案為用戶(hù)提供托管的一站式服務(wù)。但是騰訊云最終選擇了現(xiàn)在看來(lái)這個(gè)選擇無(wú)比正確。Kubernetes 很火,一大批互聯(lián)網(wǎng)公司早已領(lǐng)先一步,搭建起專(zhuān)有的 PaaS平臺(tái),傳統(tǒng)企業(yè)們看到的 Kubernetes的趨勢(shì),亦不甘落后,在試水的道上一路狂奔。雖然,Ku...

    icattlecoder 評(píng)論0 收藏0
  • 揭開(kāi)面紗 踏足云世界 再猶豫該OUT了

    摘要:一般流程你可以通過(guò)良好的選擇一種構(gòu)造來(lái)設(shè)計(jì)你自己的文件領(lǐng)域。 隨著云世界的日新月異,想進(jìn)入云世界的您在面對(duì)大量的選擇時(shí)該何去何從?下面是一些關(guān)于知名云服務(wù)的使用和測(cè)試總結(jié)。當(dāng)然在這之前,我們必須知道云是建立在托管您的應(yīng)用程序上的服務(wù)。 Auto-Scalling — 當(dāng)需求增加時(shí),你可以自動(dòng)的獲得更多資源(一般情況下是更多的虛擬機(jī))來(lái)響應(yīng)請(qǐng)求。這在一般的應(yīng)用程序中很少用到,但能保證你的服...

    Shimmer 評(píng)論0 收藏0
  • 揭開(kāi)React中server-side rending神秘面紗

    摘要:與的興起緊密相連?,F(xiàn)在情況下,所有發(fā)送到端的請(qǐng)求都會(huì)被直接返回成。這樣對(duì)于做的部門(mén)來(lái)說(shuō)也是十分有利的。這個(gè)函數(shù)將會(huì)接受服務(wù)端渲染的代碼并掛載事件處理函數(shù)。用于在渲染的過(guò)程中追蹤可能的重定向請(qǐng)求比如需要根據(jù)響應(yīng)重定向。 原文地址:https://medium.freecodecamp.o... showImg(https://segmentfault.com/img/remote/14...

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

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

0條評(píng)論

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