[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);
```