js基本數(shù)據(jù)類型和對象

5種基本數(shù)據(jù)類型:String, Boolean, Number, null, undefined

2種引用數(shù)據(jù)類型: Array, Object

es6新增兩種引用類型: Set, Map


首先只有對象才可以擁有屬性劫映, 以及使用"."操作符。

假如我們要使用的字符串的split方法,可以用String.prototype.split.call()食寡,或者"".split.call()悯周。

有天突然腦子抽筋想了下String到底是什么翰铡,首先String是個函數(shù)挪蹭,可以使用

let str = new String();創(chuàng)建一個字符串式廷,但是想想也可以使用String.prototype承冰,意味著String是個對象华弓,

也就是說函數(shù)是個對象咯,再想想函數(shù)是有name屬性的困乒,也可以自定義屬性寂屏,貌似說的通,

再進(jìn)一步想,也就是說new String()的時候其實(shí)是在new { ... }迁霎。//new { ... } 做了什么吱抚?

我使用控制臺把String輸出,發(fā)現(xiàn)確實(shí)是個對象考廉,也說明函數(shù)其實(shí)是個對象秘豹,所以Array,Object昌粤,Number既绕,Boolean(Set,Map)都是對象涮坐, 雖然用typeof String會得到function岸更,但它的本質(zhì)是個對象。

查看String對象后發(fā)現(xiàn)

String.__proto__ === Function.prototype // true

猜想:難道String是Function的一個實(shí)例化對象

接著運(yùn)行

String instanceof Function // true

表示一臉蒙蔽膊升,然后試了Number怎炊,Boolean,Array, Object等發(fā)現(xiàn)都是這樣廓译。

打印Function發(fā)現(xiàn)它還有個Function.__proto__ === Function.prototype评肆,而且 Function.prototype === Object.__proto__ //true

就神奇的出現(xiàn)了

Function instanceof Object //true

Object instanceof Function //true

之后查了下instanceof是根據(jù)什么來判斷對象A是否是對象B的實(shí)例,結(jié)果是:如果A的__proto__鏈上存在B的prototype非区,就返回true否則false

然后重新審視了整個__proto__鏈瓜挽, 畫出了下圖。


類型對象關(guān)系圖

得出結(jié)論:

1. 所有函數(shù)本質(zhì)都是對象

2. 以上所有的對象的__proto__屬性都指向Function.prototype(所有的函數(shù)也是這樣的)征绸。

3. 除Object外的所有對象的prototype內(nèi)的__proto__屬性都指向Object.prototype久橙。

4. Object.prototype相當(dāng)于基類的存在,定義了toString和valueOf等方法管怠。

結(jié)合上圖和instanceof的原理淆衷,就能夠合理的解釋

Function instanceof Object //true

Object instanceof Function //true

并且:

String instanceof Function //true;

String instanceof Object //true

但是我不理解的是:

1. js為什么要這樣去設(shè)計(jì)。

2. String是如何獲取到定義在String.prototype上的split方法的渤弛。(難不成prototype上的方法是String對象自定義后再賦值的)


按照以上結(jié)論祝拯,可以想象出一下代碼的運(yùn)行步驟

let str = new String("hello world");

str.split(" ");

在這里str是一個Sting對象;

而同樣的也可以這樣寫:

let words = "hello world";

words.split(" ");

難道這個words也是個對象嗎她肯,我試著給這個words自定義屬性:words.name = "sss";

打印出來的結(jié)果為undefined佳头,所以這里的words不是個對象,只是個基本數(shù)據(jù)類型晴氨,那為什么它能夠調(diào)用split方法呢康嘉。

查閱相關(guān)文檔后得知,words是基本數(shù)據(jù)類型籽前,被存放在棧中亭珍,是不存在屬性的腊瑟,當(dāng)我們嘗試去調(diào)用words.split時,會先創(chuàng)建一個字符串

let temp = new String(words);然后調(diào)用temp.split(" ")块蚌,并返回結(jié)果,最后再將temp銷毀(temp = null)膘格。

那么以new String()和字面量的形式聲明一個字符串峭范,有什么區(qū)別呢,它們的使用方式都一樣瘪贱,只是創(chuàng)建的方式不一樣纱控。

補(bǔ)充一下,基本數(shù)據(jù)類型是存放在棧里的菜秦,引用數(shù)據(jù)類型是存放在堆里的甜害,這也是他們的區(qū)別之一,我真正想知道的是為什么要這樣設(shè)計(jì)球昨,我們平扯辏基本不使用new String(),而且也不推薦使用主慰,因?yàn)楦膬?nèi)存和性能嚣州,那它存在的意義何在。

思考:

1. []和new Array的區(qū)別在哪共螺?

2. function show() {}和 let show? = new Function() {}的區(qū)別在哪该肴?

3. let n = 2和 let n = new Number(2)的區(qū)別在哪?如果n = new Number(2); n +2 會是多少藐不,為什么匀哄,注意這里的n是個對象,也就是對象+2雏蛮。

4. new String()發(fā)生了什么涎嚼。

最后不推薦在實(shí)際開發(fā)中使用__proto__屬性,該屬性是供瀏覽器使用的一個私有屬性挑秉,如果要獲取一個對象的__proto__铸抑,應(yīng)該使用Object.getPrototypeOf()方法。

我不理解的問題在我得出正確的解釋后會進(jìn)行補(bǔ)充或者更正衷模。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鹊汛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子阱冶,更是在濱河造成了極大的恐慌刁憋,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件木蹬,死亡現(xiàn)場離奇詭異至耻,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門尘颓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來走触,“玉大人,你說我怎么就攤上這事疤苹』ス悖” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵卧土,是天一觀的道長惫皱。 經(jīng)常有香客問我,道長尤莺,這世上最難降的妖魔是什么旅敷? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮颤霎,結(jié)果婚禮上媳谁,老公的妹妹穿的比我還像新娘。我一直安慰自己友酱,他們只是感情好韩脑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著粹污,像睡著了一般段多。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上壮吩,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天进苍,我揣著相機(jī)與錄音,去河邊找鬼鸭叙。 笑死觉啊,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沈贝。 我是一名探鬼主播杠人,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宋下!你這毒婦竟也來了嗡善?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤学歧,失蹤者是張志新(化名)和其女友劉穎罩引,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枝笨,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袁铐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年揭蜒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剔桨。...
    茶點(diǎn)故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡屉更,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出洒缀,到底是詐尸還是另有隱情瑰谜,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布帝洪,位于F島的核電站,受9級特大地震影響脚猾,放射性物質(zhì)發(fā)生泄漏葱峡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一龙助、第九天 我趴在偏房一處隱蔽的房頂上張望砰奕。 院中可真熱鬧,春花似錦提鸟、人聲如沸军援。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胸哥。三九已至,卻和暖如春赡鲜,著一層夾襖步出監(jiān)牢的瞬間空厌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工银酬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嘲更,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓揩瞪,卻偏偏與公主長得像赋朦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子李破,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容