前言
在第一篇文章中,講解了 關(guān)于“==”時,JS做的類型轉(zhuǎn)換。從第一篇文章中可以發(fā)現(xiàn) == 時,基本類型都朝著數(shù)字類型轉(zhuǎn)換,還是貼出上篇文章的圖:
那么JS類型轉(zhuǎn)換都是按照這個模式進行轉(zhuǎn)換的嗎?例如null能轉(zhuǎn)換成數(shù)字類型嗎?如果能,會轉(zhuǎn)換成多少?
const data = 1 + null; data;// 1
你想到這個結(jié)果了嗎?
正文 基本類型轉(zhuǎn)換下面是JS類型轉(zhuǎn)換的圖表:
圖表顯示null轉(zhuǎn)換成了0。等等。。。不是說null沒有toString和valueOf的方法的嗎?怎么能轉(zhuǎn)換成數(shù)字呢??
這完全不符合第一篇 == 的套路啊!
具體怎么回事呢?
問題在于JS類型轉(zhuǎn)換只存在于“==”的時候嗎?肯定不是!
除了==符號會產(chǎn)生類型轉(zhuǎn)換,"+" "-" "*" "/" ">""<"等符號也會使JS發(fā)生類型轉(zhuǎn)換,所以==的類型轉(zhuǎn)換規(guī)則不是萬能的,只適用于== 。那么應(yīng)該如何記住類型轉(zhuǎn)換這張表格呢?其實大部分轉(zhuǎn)換規(guī)則是可以根據(jù)第一篇文章講的==的轉(zhuǎn)換規(guī)則得出正確答案的,只是有幾個特殊的例子罷了。
第一篇文章講到了 {}會轉(zhuǎn)換成字符串"[object Object]",則:
比較特殊的就是undefined null類型:
(1)在進行 == 的時候,undefined null 會嘗試轉(zhuǎn)換成基本類型,但是不存在toString valueOf方法,所以無論如何是轉(zhuǎn)換不成基本類型的。
(2)在做字符串拼接的時候會按照表里面的轉(zhuǎn)換成字符串的規(guī)則
(3)在做數(shù)值運算的時候會按照表中轉(zhuǎn)換成數(shù)字的規(guī)則
最特殊的就是前言中介紹的null轉(zhuǎn)換為0!
表格中{}轉(zhuǎn)換成字符串類型和數(shù)值類型通常如下:
這樣就能記住這張類型轉(zhuǎn)換表了。注意這張類型轉(zhuǎn)換表適用于所以發(fā)生類型轉(zhuǎn)換的情況哦。
Object類型轉(zhuǎn)換成基本類型ECMAScript內(nèi)部有一個函數(shù) ToPrimitive() (這個函數(shù)不能在javascript中調(diào)用), 下面是轉(zhuǎn)換規(guī)則:
ToPrimitive(input, PreferredType?)
這個可選的 PreferredType 表示最終要轉(zhuǎn)換成的基本類型: 它是數(shù)字類型或者字符串類型,這取決于ToPrimitive()的結(jié)果是否可以轉(zhuǎn)換成一個數(shù)字還是一個字符串。
如果PreferredType 是數(shù)字類型, 轉(zhuǎn)換將遵循以下步驟:
如果輸入的是基本類型,就直接返回它
如果輸入的是Object
(1)會先調(diào)用 input.valueOf()。如果結(jié)果是基本類型就返回它
(2)如果input.valueOf()不是基本類型,就會調(diào)用input.toString(),如果結(jié)果是基本類型就返回它
(3)如果還不能得到基本類型,就會拋出TypeError錯誤
如果PreferredType 是String, 第二條的(1)(2)順序反轉(zhuǎn)一下。
有個地方需要注意,如果指定了要轉(zhuǎn)換的類型,則會優(yōu)先調(diào)用轉(zhuǎn)換的方法,例如:
var s = { toString: function () { return "7"; } }; String(s);// toString() => "7" Number(s);// valueOf() => 7Number() 與 parseInt()/parseFloat()
1.Number(num) 會對boolean string null 類型做一些轉(zhuǎn)換:
parseFloat(true); // same as parseFloat("true") => NaN Number(true); // 1 parseFloat(null); // same as parseFloat("null") => NaN Number(null); // 0 parseFloat(""); // NaN Number(""); // 0
也就是說Number走的是類型轉(zhuǎn)換那張表。
我們經(jīng)常使用 +[number]的形式來實現(xiàn)Number(number)。
2.parseInt(num,radix)/parseFloat(num,radix)可以設(shè)置解析的進制radix,并且會解析出合法的部分:
parseFloat("123.45#"); // 123.45 Number("123.45#"); // NaN parseFloat(" v 12.34 ");
parseInt()/parseFloat()才是真正的解析數(shù)字。
3.使用parseInt()去解析數(shù)字會有問題
Don’t use parseInt() to convert a number to an integer:coercion to string is an unnecessary detour and even then, the result is not always correct.(《SpeakingJavascript》)
情況一:整數(shù)>=21bit之后會用e表示數(shù)字大小
parseInt(1000000000000000000000.5, 10); // 1 首先轉(zhuǎn)換成字符串: String(1000000000000000000000.5); // "1e+21"
情況二:小數(shù)部分>=7bit會用e表示數(shù)字大小
parseInt(0.0000008, 10); // 8 String(0.0000008); // "8e-7"
總結(jié):
1.大多情況下優(yōu)先使用Number()
2.如果確定是解析字符串,并且取里面能提取出的數(shù)字,這種情況下使用parseInt()/parseFloat()
3.非十進制解析的情況下使用parseInt()/parseFloat()
猜測:
在做== 運算時:右側(cè)世界undefined null ,永遠不等于左側(cè)的世界中的值,是因為undefined null 想轉(zhuǎn)換成基本類型(和引用類型處理方式一致),但是它們沒有toString valueOf方法;
這一篇undefined null 類型轉(zhuǎn)換還可以看出:例如 + 運算,JS會根據(jù)實現(xiàn),按照表格中的JS類型轉(zhuǎn)換,{}轉(zhuǎn)換成字符串[object Object],null裝換成數(shù)字0。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/89331.html
摘要:基礎(chǔ)知識數(shù)據(jù)類型轉(zhuǎn)換把其它數(shù)據(jù)類型轉(zhuǎn)換為類型在進行加減乘除數(shù)學(xué)運算的時候引用數(shù)據(jù)類型轉(zhuǎn)換數(shù)字通過方法把數(shù)組轉(zhuǎn)換為字符串,然后在調(diào)用把字符串轉(zhuǎn)換為數(shù)字中的數(shù)學(xué)運算加減乘除除了加法有特殊性,其余的運算符都是數(shù)學(xué)運算,也就 JS基礎(chǔ)知識 JavaScript 數(shù)據(jù)類型轉(zhuǎn)換 把其它數(shù)據(jù)類型轉(zhuǎn)換為number類型 isNaN 、Number、parseInt、parseFloat在進行加減乘除數(shù)...
摘要:第三章原生函數(shù)有很多原生函數(shù),為基本的數(shù)據(jù)類型值提供了封裝對象,,,等。我們可以通過來查看所有返回的對象的內(nèi)置屬性這個屬性無法直接訪問。這個符號能有奇妙的功能,可以視為。通常用來把轉(zhuǎn)換為數(shù)字,用來將轉(zhuǎn)換為字符串,用來將取整。 第三章 原生函數(shù)JS有很多原生函數(shù),為基本的數(shù)據(jù)類型值提供了封裝對象,String,Number,Boolean等。我們可以通過{}.call.toStri...
摘要:一彈窗和輸出執(zhí)行順序是從上到下執(zhí)行控制瀏覽器彈出一個警告框讓計算機在頁面中輸出一個內(nèi)容在中寫一個內(nèi)容寫可以向中輸出一個內(nèi)容看我出不出來向控制臺輸出一個內(nèi)容作用是向控制臺輸出一個內(nèi)容你猜我在哪出來二編寫位置可以將代碼編寫到外部文件中,然后通過 一.彈窗和輸出 **javascript執(zhí)行順序是從上到下執(zhí)行** 1.控制瀏覽器彈出一個警告框 alert(HelloWord); 2.讓計...
摘要:個人前端文章整理從最開始萌生寫文章的想法,到著手開始寫,再到現(xiàn)在已經(jīng)一年的時間了,由于工作比較忙,更新緩慢,后面還是會繼更新,現(xiàn)將已經(jīng)寫好的文章整理一個目錄,方便更多的小伙伴去學(xué)習(xí)。 showImg(https://segmentfault.com/img/remote/1460000017490740?w=1920&h=1080); 個人前端文章整理 從最開始萌生寫文章的想法,到著手...
閱讀 669·2021-10-09 09:41
閱讀 652·2019-08-30 15:53
閱讀 1081·2019-08-30 15:53
閱讀 1215·2019-08-30 11:01
閱讀 1572·2019-08-29 17:31
閱讀 993·2019-08-29 14:05
閱讀 1721·2019-08-29 12:49
閱讀 416·2019-08-28 18:17