摘要:核心點中的強制類型轉換總是返回標量基本類型值。數字化對象在強制轉換為數字的時候,會優先調用方法,如果返回基本類型的值,則直接使用該返回值如果返回值不是基本類型,則會繼續調用方法,如果返回基本類型的值,則直接使用該返回值,否則報錯。
最近在讀《你不知道的javascript》系列圖書,收獲蠻大,感慨也挺多的。
是的,關于javascript,你不是不知道,而是真的不知道。?
就比如類型轉換,從開始到看完到第二第三第N遍,我經歷了如下的心路歷程:
這有什么不知道的 → 一臉懵逼 → 有點意思 → 臥槽,怎么這樣? → 原來是這樣 → 靠,還是坑...
真可謂是不學不知道,一學嚇一跳。
為了避免再次入坑,這里做個總結,不,了結。
toString和valueOf的區別Javascript中的強制類型轉換總是返回標量基本類型值(string, boolean, number, undefined, null)。
直白點就是Object.toString()或者Object.valueOf()的返回值。
toString : 以字符串形式返回該對象的原始值
valueOf : 返回最適合該對象類型的原始值
在數值運算中,會優先調用valueOf
在字符串運算中,會優先調用toString
var a = 1; a.toString() // "1" a.valueOf() // 1 a + 2 // 3 優先調用valueOf a + "string" // 1string 優先調用toString a + "" //隱式強制類型轉換 String(a) //顯示強制類型轉換規則 ToString 字符串化
對象在強制轉換為字符串的時候,會優先調用toString()方法,如果返回基本類型的值,則直接使用該返回值;
如果返回值不是基本類型,則會繼續調用valueOf()方法,如果valueOf()返回基本類型的值,則直接使用該返回值,否則報錯。
數組默認的toString方法經過了重新定義,類似于數組的join(",")方法,會將數組的各個元素以","分隔返回。這就是 String([]) === "" 的原因。
JSON.stringify在對象中遇到undefined、function、symbol時會自動忽略
JSON.stringify在數組中遇到undefined、function、symbol時會返回null
字符串、數字、布爾、null的JSON.stringify的規則與ToString相同
如果傳遞給JSON.stringify的對象中定義了toJSON()方法,那么該方法會在字符串化前調用。
JSON.stringify({a : undefined, b : function () {}, c: 1}) // "{"c":1}" JSON.stringify([undefined, function () {},1]) // "[null, null, 1]"ToNumber 數字化
對象在強制轉換為數字的時候,會優先調用valueOf()方法,如果返回基本類型的值,則直接使用該返回值;
如果返回值不是基本類型,則會繼續調用toString()方法,如果toString()返回基本類型的值,則直接使用該返回值,否則報錯。
Number([]),因為[].valueOf()返回值不是基本類型,因此會調用toString(), 等價于Number("")
ToBoolean 布爾化javascript有以下假值:
undefined
null
false
+0、-0 和 NaN
""
假值的布爾強制類型轉化為false
可以理解為假值列表以外的都是真值(true)
== 允許在相等比較中進行強制類型轉換,=== 不允許
== 和 === 都會檢查操作數的類型,區別在于操作數類型不同時他們的處理方式不同,即== 會進行強制類型轉換
容易懵逼的地方null == undefined NaN != NaN null != 0 undefined != 0 NaN != 0 [] == false [] == 0 [] == "" [] == ![]正確的使用 ==
如果兩邊的值中有true或者false,千萬不要使用 ==
如果兩邊的值中有[]、"" 或者 0, 盡量不要使用 ==
其他+運算符 (即只有一個操作數) 用來強制轉化為數字 + new Date()
&& 和 || 運算符的返回值并不一定是布爾類型,而是兩個操作數其中一個的值
參考《你不知道的JavaScript(中)》
本文首發于 我的博客
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/82878.html
摘要:注意該方法的作用和方法類似,只有一個區別,就是方法接受的是若干個參數的列表,而方法接受的是一個包含多個參數的數組。指定的參數列表。返回值返回值是你調用的方法的返回值,若該方法沒有返回值,則返回。 溫馨提示:作者的爬坑記錄,對你等大神完全沒有價值,別在我這浪費生命溫馨提示-續:打call原本是屬于我們偶像宅文化中的專業名詞,指的是飯們在看live時在臺下配合愛豆演出的節奏喊口號,舉例:超...
摘要:譯文事件循環機制之宏任務微任務原文標題這是一篇谷歌大神文章,寫得非常精彩。為什么會出現這樣打印順序呢要理解這些你首先需要對事件循環機制處理宏任務和微任務的方式有了解。 譯文:JS事件循環機制(event loop)之宏任務、微任務 原文標題:《Tasks, microtasks, queues and schedules》 這是一篇谷歌大神文章,寫得非常精彩。譯者想借這次翻譯深入學習一...
摘要:那么為什么要在參數列表中增加呢這樣做也有兩個目的因為有些低版本的瀏覽器中是可以被重新賦值的,在自調用匿名函數的作用域內,確保是真的未定義。 1、命名空間 為什么要使用命名空間? 在一些語言中會看到有命名空間的概念,可在js中并沒有,但是可以通過閉包來實現。在js閉包中定義的變量會被保存到一個作用域且不會污染全局變量,在程序運行完之后也不會被銷毀。 我們可以看到,jQuery的做法就是使...
摘要:當面試中讓我解釋一下閉包時我懵逼了。這個解釋開始可能有點晦澀,讓我們抽絲剝繭摘下閉包的真面目。此文不詳述作用域有專門的主題闡述,不過作用域是理解閉包原理的基礎。這才是閉包的真正便利之處。閉包使用不當就會很坑。 原文鏈接 為什么深度學習JavaScript? JavaScript如今是最流行的編程語言之一。它運行在瀏覽器、服務器、移動設備、桌面應用,也可能包括冰箱。無需我舉其他再多不相干...
摘要:結合實際中的情況來看,有意或無意中涉及到隱式類型轉換的情況還是很多的。此外當進行某些操作時,變量可以進行類型轉換,我們主動進行的就是顯式類型轉換,另一種就是隱式類型轉換了。 前言 相信剛開始了解js的時候,都會遇到 2 ==2,但 1+2 == 1+2為false的情況。這時候應該會是一臉懵逼的狀態,不得不感慨js弱類型的靈活讓人發指,隱式類型轉換就是這么猝不及防。結合實際中的情況來看...
閱讀 3451·2019-08-30 10:54
閱讀 3147·2019-08-29 16:38
閱讀 2166·2019-08-26 14:06
閱讀 1512·2019-08-23 15:39
閱讀 3034·2019-08-23 15:37
閱讀 2883·2019-08-23 13:50
閱讀 3190·2019-08-22 17:14
閱讀 2375·2019-08-22 15:44