> [You Don't Know JS ](https://book.douban.com/subject/25883834/)笔记
# 一、类型
javascript一共有六种主要数据类型:
* string
* number
* boolean
* null
* undifined
* object
ps: typeof null 时会返回"object",这是语言的一个bug.
# 二、内置对象
Javascript中还有一些对象子类型,通常被称为内置对象:
* **String**
* Number
* Boolean
* Object
* Function
* **Array**
* Data
* **RegExp**
* Error
```javascipt
var strPrimitive = "I am a string";
typedef strPrimitive ; //"string"
strPrimitive instanceof String ; //false
var strObject = new string("I am a string");
typeof strObject; // "object"
strObject instanceof String; // true
```
三、复制对象
```javascript
function anotherFunction(){ /*... */}
var anotherObject = {
c: true;
}
var anotherArray = [];
var myObject = {
a : 2,
b: another,
c: anotherArray,
d: anotherFunction
}
abotherArray.push(anotherObject, myObject);
```
复制分为```浅拷贝```和```深拷贝```。对于浅拷贝,复制出的新对象中a的值会复制就对象中a的值,但是新对象中b,c,d三个属性其实只是三个引用,和旧对象中b,c,d引用的对象是一样的。对应深拷贝来说,除了复制myobject以外还会复制anotherObject和anotherArray. 。anotherArray又引用了anotherObject和myObject,这样会由于循环引用导致死循环。
```深复制方法```:
```javascript
var newObj = JSON.parse( JSON.stringify( someObj) );
```
```浅复制方法```:
```javascript
var newObj = Object.assign( {} , myObject);
```
四、属性描述符
```javascript
var myObject = {
a : 2
};
Object.getOwnPropetyDescriptor(myObject, "a");
//{
// value: 2;
// writable: true,
// enumerable: true,
//configurable: true
}
Object.setOwnPropetyDescriptor(myObject, "a",{
value: 2;
writable: true,
numerable: true,
configurable: true
}
```
1. writable 决定是否可以修改属性的值
2. configurable: 只要属性是可配置的,就可以使用defineProperty(...)方法来修改属性描述符。
3.enumerable 枚举,如 ```for...in...```,与```for ... of ...```
五. Getter 和 Setter
```javascript
var myObject = {
get a(){
return 2;
}
};
myObject.a = 3;
myObject.a; // 2
```
```
var myObject = {
get a(){
return this._a_;
}
set a(val){
this._a_ = val * 2;
}
};
myObject.a = 2;
myObject.a ; //4
```