所謂引用類型,在ECMAScript
中表示一種數據結構,其中有一些數據和方法,在其餘語言中大多被稱爲類,可是在這裏咱們通常不這樣稱呼。即便ECMAScript
是一門面向對象語言,可是它不具有傳統面嚮對象語言中所支持的類和接口。他們描述的是一類對象所具備的屬性和方法。引用類型的值就是一個對象,它是引用類型的一個實例。 新對象是用一個new
操做符後面跟上一個構造函數建立的。所謂構造函數本質上是一個函數,這個函數的目的是爲了建立某一類對象,函數中包含了建立該對象所須要的東西。 ECMAScript
中提供其餘各類類型的引用類型。javascript
JavaScript 中的變量與其餘語言的變量有很大差異,獨特的鬆散類型的特性,決定了它只是特定時間用來保存特定值的一個名字而已。它的數據類型在生命週期中是能夠隨時改變的。Crazy and Powerful !java
在一個變量中可能存在兩種不一樣數據類型的值:基本類型值和引用類型值。基本類型值是按值引用的,咱們能夠操做保存在變量中實際的值。可是引用類型就不一樣了,引用類型的值是保存在內存中的對象,而JavaScript
是不容許直接操做內存空間的。因此說咱們在操做對象的時候操做的是對象的引用而不是實際的對象。因此對象是按引用訪問的。數據結構
兩種類型在定義的時候是類似的,建立一個變量而且爲它賦值。可是引用類型容許咱們更改其屬性和方法,而基本類型值沒有這個功能。當咱們爲基本類型值增添屬性後雖然不會報錯,可是倒是無效的。函數
對於基本類型值來講,從一個變量複製給另外一個變量的時候,會在新的變量上建立一個新值,而後把值複製過去。今後這兩個值就沒了聯繫,不會相互影響了。但若是是從一個變量向另外一個變量複製引用類型的值的時候,複製過去的實際上是一個指針,指向存在堆中的一個對象,而後兩個變量引用同一個對象,改變一個,會影響另外一個:ui
let obj1 = new Object();
let obj2 = obj1;
obj1.name = 'Baoyuan';
console.log(obj2.name); //'Baoyuan'
複製代碼
ECMAScript
中全部函數的參數都是按值傳遞的。spa
向函數傳遞基本類型的值的時候,被傳遞的值被複制給命名參數。而對於引用類型來講,會把這個值在內存中的地址複製給命名參數,這會致使函數內值的改變反應在函數外部:指針
function setName (obj) {
obj.name = 'Baoyuan';
};
let people = new Object();
setName(people); // 將people對象地址複製給了函數內部的obj,也就是說引用同一個對象。
console.log(people.name); //'Baoyuan'
複製代碼
即便這個對象是按值傳遞的,由於 people 指向的對象在堆內存中只有一個, obj 會按引用來訪問同一個對象。code
咱們先來看最多見用的最多的一種-Object
。對象
Object
是典型的引用類型值,雖然它的實例中並不具有不少功能,可是大多數咱們所見的引用類型值都是他的實例。並且對於咱們在程序中存儲和傳輸數據來講是不可或缺的。 一般咱們可使用new
方法來建立一個對象:接口
let peopele = new Object();
people.age = 23;
people.name = 'Baoyuan';
複製代碼
咱們建立了一個people
對象併爲其設置了姓名和年齡屬性,一樣的使用對象字面量也能夠有相同的效果:
let people = {
name: 'Baoyuan',
age: 23
};
複製代碼
在使用這種方式的時候屬性名也能夠用字符串表示,通常咱們推薦使用字面量建立,它的代碼簡潔並且它也是向函數傳遞大量參數的首選方式。 咱們能夠經過點訪問法訪問其屬性:
console.log(people.name); //Baoyuan
複製代碼
除此以外還有一種更爲靈活的方式,當咱們的屬性名中含有包含會致使語法錯誤的字符串或者是保留字的話,咱們可使用[]
來訪問:
people['name'] = 'Bao yuan'; //屬性名以字符串形式放入,屬性值中含有空格。
複製代碼
這種方式還能夠經過變量來訪問屬性:
let item = 'name';
people[item]; //Baoyuan
複製代碼
同常來講除非必須使用[]
的狀況下,通常建議用點表示法。
除此以外引用類型還有Array
、 Date
、 RegExp
、 Function
等。
在檢測基本數據類型的時候咱們使用typeof
可是若是咱們在引用類型上使用的話都會返回object
,這並非咱們想要的。爲此ECMAScript
提供了instanceof
:
result = variable instanceof constructor
它會根據原型鏈來識別,好比:
console.log(people instanceof Array); //變量people是Array類型嗎?
複製代碼
不足之處請批評指正~