前言:es6
JavaScript中有五種基本數據類型(也叫作簡單數據類型)分別爲:undefined、null、bolean、number、string;另外還含有一種複雜的數據類型:object.面試
深刻分析:this
基本類型數據spa
1.基本數據類型值是指簡單的數據段,五種基本類型都是按值訪問的(能夠操做保存在變量中的實際值);3d
2.基本類型的值在內存中佔據固定大小的空間,被保存在棧內存中。(從一個變量向另外一個變量複製基本類型的值,會建立這個值的一個副本);指針
3.不能給基本類型的值添加屬性。code
------------------------------------------------------------------------------------------------------------------------------------------------------對象
引用類型數據:object(還有array、function)blog
1.引用類型值是指那些能夠由多個值構成的對象。js不容許直接訪問內存中的位置,也就是不能直接訪問操做對象的內存空間,在操做對象時,其實是在操做對象的引用而不是實際的對象;ip
2.引用類型的值是對象,保存在堆內存中,包含引用類型值的變量實際上包含的並非對象自己,而是指向該對象的指針。從一個變量向另外一個變量複製引用類型的值,複製的實際上是指針,所以兩個變量最終指向同一個對象。
3.對於引用類型的值,能夠爲其添加屬性和方法,也能夠改變和刪除其屬性和方法。
------------------------------------------------------------------------------------------------------------------------------------------------------
在ECMAScript中用var關鍵字來定義變量,由於
js
是弱類型的,因此沒法肯定變量必定會存儲什麼值,也就不知道變量到底會是什麼類型,並且變量的類型能夠隨時改變。這就是ECMAScript
是鬆散類型的來由,所謂鬆散類型就是能夠用來保存任何類型的數據。在es6中新增了let命令來聲明變量,const命令聲明一個只讀的常量
let的用法相似於var,可是所聲明的變量,只有在let代碼塊內纔有效;const一旦聲明,常量的值就不能改變。
------------------------------------------------------------------------------------------------------------------------------------------------------
複習了這些知識,剛好遇到了一些關於js的經典例子:
var a = {name: 1}; var b = a; console.log(a); console.log(b); b.name = 2; console.log(a); console.log(b); var b = {name: 3}; console.log(a); console.log(b);因而個人答案變成了:
其實每次作這些的時候,本身老是知其然而不知其因此然,因而又從大神同事CZ那裏get到了新技能:關於this指向的問題。
var name = "yeye"; var person = { name: "doudou", pro: { name: "wanwan", getName: function() { return this.name; } } }; console.log(person.pro.getName()); var pepole = person.pro.getName; console.log(pepole());上面的這個例子是否是很面熟?沒錯,這道題就是很經典的js的面試題,從本身接觸js到如今,看到同種題型就不下十餘次,惋惜的是每次本身都會被「坑」,尤爲是第二問,老是深陷其中不能自拔,直到如今終於找到了「小竅門」:
console.log(person.pro.getName());//相似於這種的,getName()前有「層級「關係調用的時候,就一層層的往上找,直到找到它的父類。通常,這裏不會有人作錯(嘻嘻*-*) var pepole = person.pro.getName; console.log(pepole()); //而這種的,出錯概率就稍微大一點了。可是在這裏只要記住,「直接調用,無任何層級關係的」它的this都是指window對象,因而很容易的就得出 ... console.log(person.pro.getName()); //wanwan var pepole = person.pro.getName; console.log(pepole()); //yeye而關於最上面的那道題,理解了上面縮寫的,回過頭來在思考的話:
a 是一個對象,b 是對 a 的引用,即 a 和 b 指向同一塊內存,因此前兩個輸出同樣。 當對 b 做修改時,即 a 和 b 指向同一塊內存地址的內容發生了改變,因此 a 也會體現出來,因此第三四個輸出同樣。 當 b 被覆蓋時,b 指向了一塊新的內存,a 仍是指向原來的內存,因此最後兩個輸出不同。