摘要:這也解答了我曾經的一個疑問同樣的道理,在調用屬性的瞬間,也是使用先來實例化一個對象,所以那一瞬間他們的構造函數(shù)以及原型對象是相同的,但也僅僅是那一瞬間。
經常在國內的各大網站博客上看到一句話,叫做JS中萬物皆對象,那是否真是如此?
那么,我們先來捋一捋JS中的數(shù)據類型,JS中的數(shù)據類型有下面幾種
Undefined
Null
Boolean
Number
String
Symbol (ES6中新增)
Object
所以本質上真的都是Object? -- NO 1.數(shù)據類型在JS中我們把前面六種類型稱為為基本數(shù)據類型,最后一種則是復雜數(shù)據類型,也就是對象類型。其實從這里看貌似已經區(qū)分了對象以及其他。
2.對象類型與其他類型的區(qū)別對象可以動態(tài)的添加屬性和方法,而基本類型不行。
如下:
// 基本類型 Number var num1 = 1000; num1.length = 10; console.log(num1.length); //undefinded // 對象類型 Array var arr1 = []; arr1.length = 10; console.log(arr1.length); //103.值類型與引用類型
再進一步看,JS中的數(shù)據類型有值類型(基本類型)和引用類型(對象類型)之分(其實其他很多語言中也有這么個區(qū)別),所謂值類型和引用類型,無非只是實例對象中保存了值或者保存了對象的引用。
值類型:初始化一個值類型實例的時候,實際上是給這個值分配了一個內存空間來保存,當進行賦值操作的時候,新的實例會開辟一塊新的內存空間,然后將原來的值copy 到了這個新的內存空間中;
引用類型:初始化一個引用類型實例的時候,僅僅是把這個實例的值所在內存空間的引用賦給這個實例,當copy 給了新的實例對象使,實際上是copy 了對這塊內存空間的引用,兩個實例對象本質上共用一塊內存空間。
舉個?:
// 值類型 Number var num1 = 1; var num2 = num1; num2 = num2 + 1 console.log(num1); // 1 // 引用類型 Array var arr1 = []; var arr2 = arr1; arr2.push("oujm") console.log(arr1); // ["oujm"]目前的結論
其實從上面看,很明顯的能得出JS中并非萬物皆對象,可為什么還是有這么多的人認為并相信這個觀點是正確的呢?(包括當初懵懂無知的我?)
為什么呢? 1. typeof nullconsole.log(typeof null); // object
很多人(可能不多,我瞎猜)都說,連null 都是對象類型,其他的能不是對象嗎?講道理我之前也很疑惑。直到在看書的時候看到null 只不過是一個空對象引用,這么說來,它的類型是object 也就沒有那么奇怪了。
2. 基本數(shù)據類型的實例對象有 __proto__還有些人說這個是JS中的一個bug ,不同的對象在底層都表示為二進制,在 JavaScript 中二進制前三位都為 0 的話會被判 斷為 object 類型,null 的二進制表示是全 0,自然前三位也是 0,所以執(zhí)行 typeof 時會返回"object" 。是真也好,假也罷。但說這是個bug 其實沒必要,我不知道底層是怎么實現(xiàn),可僅僅是因為null 在底層全是0就返回object ,這種bug 未免顯的太低級了點把... 我更愿意相信,JS的設計者就是想把null 表示為空對象引用
如下所示:
var str = "oujm"; console.log(str.__proto__); /* String { anchor:? anchor() at: ? at() big: ? big() blink: ? blink() bold: ? bold() charAt: ? charAt() charCodeAt: ? charCodeAt() codePointAt: ? codePointAt() concat: ? concat() constructor: ? String() ... } */ // Boolean Number 等基本類型打印出來的結論類似
從我們之前的學習中能知道str 是個基本類型,基本類型怎么會有屬性呢。可是這里不但看到了這個基本類型的實例對象有屬性__proto__,而且很明顯它的構造函數(shù)就是String() ,這個時候有些人就會覺得既然有屬性,有構造函數(shù),那說明str 本質上就是個對象。這在表面上看起來好像是沒什么問題。
那讓我們再來看一個更直白的?:
var str1 = "oujm"; var str2 = str1.substring(2);
從上面能看出來str1 是有方法的。
OK,宗上所得:基本類型也是對象類型,即萬物皆對象
我覺得大部分人能得出這個結論都基于此。但是他們忽略了,在JS的世界中有一種對象類型叫包裝對象。
咦?,String ,Number ,Boolean ,這三個不是基本類型嗎。其實不然,ECMAScript提供了這三個特殊的引用類型,這三個引用類型和其他的引用類型相似,但同時也具有于各自的基本類型相應的特殊行為,實際上,每當讀取一個基本類型的時候,后臺就會創(chuàng)建一個對應的基本包裝類型的對象。
再來看上面那個?,str1 很明顯是一個基本類型實例,問題就出在 str1.substring(2) 字符串怎么會有方法。其實,為了讓我們更好的操作基本類型的實例對象,后臺進行了一系列的操作:
創(chuàng)建String的實例
在實例上調用指定的方法
銷毀這個實例
// var str2 = str1.substring(2) 動作拆解: var tempStr = new String("oujm"); var str2 = tempStr.substring(2); tempStr = null;
從這里能夠看到,一般的引用類型和包裝類型唯一的區(qū)別就在于對象的生命周期。包裝類型的對象生命周期很短,只有代碼執(zhí)行的一瞬間,然后就被銷毀了,所以這也就是為什么我們不能在運行的時候為基本類型的值添加屬性和方法。
var str1 = "oujm"; var str1.bf = "ethan"; console.log(str1.bf); // undefined
這也解答了我曾經的一個疑問
var str1 = "oujm"; var str2 = new String("ethan"); console.log(str1.__proto__ === str2.__proto__); // true console.log(str1 instanceof String); // false console.log(str2 instanceof String); // true
同樣的道理,在調用__proto__ 屬性的瞬間,也是使用new String() 先來實例化一個對象,所以那一瞬間他們的構造函數(shù)以及原型對象是相同的,但也僅僅是那一瞬間。
綜上別再?到有些文章說的,JS的世界很大,并不只有對象
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/89826.html
摘要:原型鏈理解第一件事你不用管其他語言,一句話,你只要記住里面的對象包含一個原型,原型是啥,就是另外一個對象。原型就相當于你家的車棚子,而你的那個自行車就是對象。萬事萬物皆對象有啥用一句話,擴展原型方法,給大家一到面試題,數(shù)組去重自己體會下。 概述 通過上節(jié)課的學習,大家已經會用一種json的方式定義對象了,其實這個就是傳說中的單體模式,當然這個大家不用記,關于設計模式暫時不用了解。但是總...
摘要:真正的前方高能第一個鋪墊告訴我們,對象可以映射成布爾值真假,第二個鋪墊告訴我們,布爾值可以映射成數(shù)字和。得知布爾值和有這一層隱秘的身份,我已興奮不已,再難對這看似不合現(xiàn)代語境卻又流傳千古的思想做出任何揣測。 這么久以來,我終于確認了一件事,那就是不管是人也好,還是貓也好,常常會忘了想自己當下的身份位置,以及曾經的身份位置。 這個現(xiàn)象在我身上,表現(xiàn)出了雙倍分量的嚴重。這種時刻,我就會想起...
摘要:真正的前方高能第一個鋪墊告訴我們,對象可以映射成布爾值真假,第二個鋪墊告訴我們,布爾值可以映射成數(shù)字和。得知布爾值和有這一層隱秘的身份,我已興奮不已,再難對這看似不合現(xiàn)代語境卻又流傳千古的思想做出任何揣測。 這么久以來,我終于確認了一件事,那就是不管是人也好,還是貓也好,常常會忘了想自己當下的身份位置,以及曾經的身份位置。 這個現(xiàn)象在我身上,表現(xiàn)出了雙倍分量的嚴重。這種時刻,我就會想起...
摘要:深入之繼承的多種方式和優(yōu)缺點深入系列第十五篇,講解各種繼承方式和優(yōu)缺點。對于解釋型語言例如來說,通過詞法分析語法分析語法樹,就可以開始解釋執(zhí)行了。 JavaScript深入之繼承的多種方式和優(yōu)缺點 JavaScript深入系列第十五篇,講解JavaScript各種繼承方式和優(yōu)缺點。 寫在前面 本文講解JavaScript各種繼承方式和優(yōu)缺點。 但是注意: 這篇文章更像是筆記,哎,再讓我...
閱讀 2847·2021-09-27 13:35
閱讀 624·2021-09-23 11:22
閱讀 2892·2019-08-30 15:54
閱讀 1612·2019-08-29 16:27
閱讀 2468·2019-08-29 15:05
閱讀 2350·2019-08-23 18:11
閱讀 3523·2019-08-23 16:32
閱讀 2941·2019-08-23 14:56