javascript中五種基本數據類型

前言: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);

因而個人答案變成了:

7

其實每次作這些的時候,本身老是知其然而不知其因此然,因而又從大神同事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 仍是指向原來的內存,因此最後兩個輸出不同。
相關文章
相關標籤/搜索