摘要:轉換為字符串規則如下圖代碼大致就是普通其他基本類型轉為字符串的話,就直接轉為其值的字符串表達形式,如果是基本類型的封裝對象,會先拆封,然后再轉為字符串,如果是普通對象,則會調用其內部的值,如果是極大數和級小數,將會進行一些轉化,具體規
轉換為字符串規則如下圖代碼:
console.log(String(undefined)); // "undefined" console.log(String(null)); // "null" console.log(String(true)); // "true" console.log(String(+0)); // "0" console.log(String(-0)); // "0" console.log(String(-20)); // "-20" console.log(String(Infinity)); // "Infinity" console.log(String(new Number(123))) // 123 console.log(String(new Object())) // [object Object] console.log(100000000000000000000000000000); // 1e+29
大致就是普通其他基本類型轉為字符串的話,就直接轉為其值的字符串表達形式,
如果是基本類型的封裝對象,會先拆封,然后再轉為字符串,
如果是普通對象,則會調用其內部[class]的值,
如果是極大數和級小數,將會進行一些轉化,具體規則請參考ecma 官方文檔https://www.ecma-internationa...
請思考下面的代碼
var obj = { toString() { return "toString"; } } console.log(String(obj)) // toString var obj1 = Object.create(null); obj1.valueOf = function() { return "valueOf"; } console.log(String(obj1)); // valueOf
上面這個代碼似乎可以看出,實際上普通對象轉為字符串的過程,似乎就是toString()的一個過程,也就是調用其內部toString()的一個過程
如果toString()沒有咋辦,調用valueOf,如果這個也沒有呢,就直接報錯了。
轉換為數字的規則
普通轉換為數字的規則如下:
console.log(Number(true)); // 1 console.log(Number(0b1101)) // 13 console.log(Number(false)); // 0 console.log(Number("123")); //123 console.log(Number("123a")); //NaN console.log(Number(undefined)); // NaN console.log(Number(null)); // 0
不過呢,如果是對象類型的咋辦呢,實際上同上的一點是,如果是基本類型封裝后的對象,會先拆封,也就是轉為基本類型值,然后再轉為數字,比如說
console.log(Number(new String("123123"))); // 123123 console.log(Number([1])); // 1 console.log(Number([1, 3])); // NaN
可能你會疑惑,說,為啥數組只有一個數據的時候可以轉換,有兩個數據的時候就是NaN了呢,原因在這里,看代碼
console.log([1].valueOf()); // [1] console.log([1, 3].valueOf()); // [1, 3] console.log([1].toString()); // 1 console.log([1, 3].toString()); //1, 3
可以看到,valueOf沒有返回基本類型值,所以轉而使用toString轉為基本類型值,這倆字符串再轉為數字的結果就一目了然了,和上面的是一樣的
那么轉為數字的過程中,valueOf和toString是哪個先執行的呢?
看代碼
var a = { valueOf() { return 2; }, toString() { return 3; } } var b = { valueOf() { return [1, 3]; }, toString() { return 3; } } var c = { toString() { return 3; } } var d = Object.create(null); console.log(Number(a)); // 2 console.log(Number(b)); // 3 console.log(Number(c)); // 3 console.log(Number(d)); // Uncaught TypeError: Cannot convert object to primitive value
這個其實就說明了一個問題,就是說對象轉數字的時候,會先找valueOf(),如果valueOf()沒有,或者是說轉的是非基本數據類型的,將會使用toString(),最后基本類型專成數字類型的,如果valueOf和toString()都沒有,就直接報錯了
轉化為數字呢,除了以上使用Number(),還可以使用+符號,這個也可以實現從其他類型轉換到字符串
console.log(+"abc"); // NaN console.log(+"1111"); //1111 console.log(+[1]); // 1 var obj = { valueOf() { return "1111"; } } console.log(+obj); // 1111
如果原數據類型是Date,那么可以用Number或者+轉為以微秒為單位的unix時間戳
var d = new Date( "Mon, 18 Aug 2014 08:53:06 CDT" ); console.log(+d); // 1408369986000 console.log(Number(d)); //1408369986000 parseInt和Number()的區別:看例子 var a = "123abc"; console.log(+a); // NaN console.log(parseInt(a)); // 123 console.log(parseInt("abc123")); // NaN
實際上,parseInt會從左往右進行解析,找到非字符串的時候停止,如果一開始就不可轉為數字,那么就返回NaN
parseInt其他一些坑點,這里就不細說了,想看的,可以找《你不知道的Javascript》了解細節
// 0 ("0" 來自于 "0.000008") console.log(parseInt( 0.000008 )); // 8 ("8" 來自于 "8e-7") console.log(parseInt( 0.0000008 )); // 250 ("fa" 來自于 "false") console.log(parseInt( false, 16 )); // 15 ("f" 來自于 "function..") console.log(parseInt( parseInt, 16 )); console.log(parseInt( "0x10" )); // 16 console.log(parseInt( "103", 2 )); // 2
轉化為布爾值
下面是假值列表,理論上說,除了以下內容以外的值都是true
console.log(Boolean(undefined)); console.log(Boolean(null)); console.log(Boolean(false)); console.log(Boolean(+0)); console.log(Boolean(-0)); console.log(Boolean(NaN)); console.log(Boolean(""));
這里有一點需要說明,規范里有提到,所有的對象都是true,所以這方面尤其需要注意的就是下面的例子了
console.log(Boolean(new Boolean(false))); // true console.log(Boolean(new String(""))); // true console.log(Boolean(new Number(0))); // true
返回的都是true,雖然他是對假值得封裝,但是他們是對象,是對象就返回true,所以用假值對象或者其他看起來像價值的字符串來進行if判斷是不靠譜的
var bObj = new Boolean(false); var a = []; var d = {}; var e = function() {} var f = "false"; var g = "0"; var h = """"; if (a && d && e && f && g && h) { console.log("all right"); // all right }
一般顯式的吧數據轉為布爾型,除了使用Boolean()以外,還可以使用!!符號,也就是連著反轉兩次
console.log(!!undefined); // false console.log(!!new Boolean(false)); // true
好了就到這里了,這一次因為東西比較零散,準備了一陣子,希望大家有所收獲
參考書籍《你不知道的Javascript中卷》
本文轉載自http://www.lht.ren/article/5/
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/100561.html
摘要:抽象相等和嚴格相等。首先,也是如果有對象的話,會把對象轉為基本類型值,在進行比較。 這一節,應該算是強制類型轉換的最后一個小節了,這一部分呢,主要會講比較操作中遇到的強制類型轉換。 抽象相等(==)和嚴格相等(===)。 簡單且粗略的來說,抽象相等和嚴格相等的區別就是抽象相等在比較的時候,如果比較的兩個數類型不同,會先進行類型轉換再比較,而嚴格類型呢,比較簡單粗暴一些,直接返回fals...
摘要:所以無論還是都會進行類型轉換,唯一的區別,就是會置否而不會。這時候,肯定會有人問,假如說我有其他的數據類型呢,又不是數字又不是字符串,比如說數組啊,對象啊,布爾值啥的,那么如果是引用數據類型,則先轉為基本數據類型,再進行比較。 上一章主要講了轉換到數字,字符串和布爾類型的一些知識點,那么這一講接著上面的繼續講。 思考下面這個問題: console.log(+123); // 123 ...
摘要:前綴規范每個局部變量都需要有一個類型前綴,按照類型可以分為表示字符串。例如,表示以上未涉及到的其他對象,例如,表示全局變量,例如,是一種區分大小寫的語言。布爾值與字符串相加將布爾值強制轉換為字符串。 基本概念 javascript是一門解釋型的語言,瀏覽器充當解釋器。js執行時,在同一個作用域內是先解釋再執行。解釋的時候會編譯function和var這兩個關鍵詞定義的變量,編譯完成后從...
摘要:一返回值調用外部方法獲取的值需要對類型做判斷,因為我們對方法返回的值是有期望值類型,但是卻不能保證這個接口返回的值一直是同一個類型。 19年目標:消滅英語!我新開了一個公眾號記錄一個程序員學英語的歷程 有提升英語訴求的小伙伴可以關注公眾號:csenglish 程序員學英語,每天花10分鐘交作業,跟我一起學英語吧 javascript作為一門動態類型語言,具有很高的動態靈活性,當定義函數...
摘要:如果類型轉換你還不是很了解,可以先讀下這篇來理解一下從看隱式強制轉換機制。函數可對通過編碼的字符串進行解碼。而作者封裝的也是基于這兩者來實現輸出黑魔法字符串的。同時通過,返回了一個匿名函數形成了閉包。為了達到裝逼的效果。 寫在最前 事情的起因是這段看起來不像代碼的代碼: showImg(https://segmentfault.com/img/remote/14600000126810...
閱讀 1954·2021-09-07 09:59
閱讀 2522·2019-08-29 16:33
閱讀 3693·2019-08-29 16:18
閱讀 2852·2019-08-29 15:30
閱讀 1681·2019-08-29 13:52
閱讀 2040·2019-08-26 18:36
閱讀 535·2019-08-26 12:19
閱讀 698·2019-08-23 15:23