[TOC]
# 變量與對象
變量又分為基本類型變量和引用類型變量。
## 變量與引用
對象的賦值其實是將對象的引用進行賦值。
```javascript
var obj = {
x: 1,
y: 2
};
// a、b 同時引用了 obj
var b = obj;
var a = obj;
// 修改 b 中的 x
b.x = 2;
// 同時也會影響到 a
a // { x:2, y:2}
```
## 變量與屬性
在 JavaScript 中變量就是屬性。
全局變量(以及全局函數名)是全局對象屬性。
在函數內聲明的變量是局部變量。
## 對變量是否存在的檢驗
通過 `in` 運算符來檢驗
```javascript
if( 'a' in this){
var b = a;
}else{
var b = 1;
}
```
## JavaScript 的對象
在 JavaScript 中,一切都是對象。對象之間的協作通過屬性訪問來實現。而對象之間的共性,則是通過繼承同一個對象的性質的方式來實現。JavaScript 通過基于原型的形式來實現繼承。
## 構造函數與 new 表達式
構造函數是用于生成對象的函數。
構造函數的調用方式:
- 構造函數本身和普通的函數聲明式相同。
- 構造函數通過 new 表達式來調用。
- 調用構造函數的 new 表達式的值是對象的引用。
- 通過 new 表達式調用的構造函數內的 this 引用引用了對象。
## 屬性的屬性
屬性的屬性名 | 含義
---|---
writable | 可以改寫屬性值
enumerable | 可以通過 for in 語句枚舉
configurable | 可以改變屬性的屬性。可以刪除屬性
get | 可以指定屬性值的 getter 函數
set | 可以指定屬性值的 setter 函數
## 垃圾回收
不再使用的對象的內存將會自動回收,這種功能稱作垃圾回收。所謂不再使用的對象,指的是沒有被任何一個屬性(變量)引用的對象。
## 實現不可變對象的方式
方法名 | 屬性新增 | 屬性刪除 | 屬性值變更 | 確認方法
---|---|---|---|---
preveentExtensions | false | true | true | Object.isExtensible
seal | false | false | true Object.isSealed
freeze | false | false | false | Object.isFrozen
```javascript
var obj = {
x: 1,
y: 2
};
Object.seal(obj);
```
## this 引用
函數的調用方式 | this 引用的引用對象
---|---
構造函數調用 | 所生成的對象
方法調用 | 接收方對象
apply 或 call | 由 apply 或 call 的參數指定的對象
其他方式的調用 | 全局對象
## apply 與 call
可以改變函數 this 的引用,可以指向任意特定的對象。
apply 剩余的參數將通過數組來傳遞,call 是直接按原樣來傳遞。
```javascript
function f(a,b){...};
var obj = {x:1};
f.apply(obj, [1,2]);
f.call(obj, 1, 2);
```