原型
Javascript中大部分的数据都是对象,他们的根对象是Object.prototype对象。在JavaScript中所有的对象都是从Object. Prototype克隆而来,Object. Prototype对象就是她们的原型。
要得到一个对象,不是通过实例化类,而是找到一个对象作为原型并克隆它。
对象会记住它的原型。如果对象无法响应某个请求,它会把这个请求委托给它的构造器的原型
原型链
每个对象都一个原型对象,这个原型对象由对象内置属性_proto_指向它的构造函数的prototype指向的对象。
即任何对象都是由一个构造函数创建的,但prototype只要方法才有。
Primitive type基本类型:Undefined、Null、Boolean、Number、String;
应用数据类型:Object类:有常规名值对的无序对象,数组以及函数
Undefined NULL的区别
Null表示“没有对象”。即该处不应该有值。
Null典型用法是:
- 作为函数的参数,表示该函数的参数不是对象
- 作为对象原型链的终点
- Undefined 表示 “缺少值”,就是此处应该有一个值。但是没有定义。
undefined典型用法是
- 变量被声明了,但没有初始化
- 调用函数时,应该提供的参数未提供
- 对象没有赋值的属性
- 函数没有返回值时,默认返回undefined。
类型检测
Typeof:检测一个变量是不是最基本的数据类型
Instanceof:用了判断某个构造函数的prototype属性所指向的对象是否存在于另一个要检测对象的原型。
深浅拷贝
Object.assign()方法将所有可枚举的自身属性从一个或多个源对象复制到目标对象,并返回目标对象。
如果源值是对对象的引用,则仅复制该引用值。
例如
Let obj1 = { a: 0 , b: { c: 0}};
Let obj2 = Object.assign({}, obj1);
Console.log(JSON.stringify(obj2)); // { “a”: 0, “b”: { “c”: 0}}
Obj2.b.c = 3;
Console.log(JSON.stringify(obj1)); // { “a”: 1, “b”: { “c”: 3}}
Console.log(JSON.stringify(obj2)); // { “a”: 2, “b”: { “c”: 3}}
深浅拷贝方式
浅拷贝
Object. Assign()
解析赋值var obj1={…obj}
深拷贝
1. Json. Parse与Json. Stringfy
如果obj里面有时间对象,则JSON.stringify后再JSON.parse的结果,时间将只是字符串的形式。而不是时间对象;
如果obj里有RegExp、Error对象,则序列化的结果将只得到空对象;
如果obj里有函数,undefined,则序列化的结果会把函数或 undefined丢失;
如果obj里有NaN、Infinity和-Infinity,则序列化的结果会变成null
JSON.stringify()只能序列化对象的可枚举的自有属性,例如 如果obj中的对象是有构造函数生成的, 则使用JSON.parse(JSON.stringify(obj))深拷贝后,会丢弃对象的constructor;
如果对象中存在循环引用的情况也无法正确实现深拷贝;
2. Object. create
3. 递归实现
Function deepClone(obj) {
If (obj == null) return null;
If (obj instanceof Date) return new Date(obj);
If (obj instanceof RegExp) return new RegExp(obj);
If (typeof obj !== ‘object’) return obj;
Let t = new obj.constructor
For (let key in obj) {
T[key] = deepClone(obj[key])
}
Return t;
}
Underscore源码
_.mixin = function(obj) {
_.each(_.functions(obj), function(name) {
Var func = _[name] = obj[name];
_.prototype[name] = function() {
Var args = [this._wrapped];
Push.apply(args, arguments);
Return result(this, func.apply(_, args));
};
});
};
….
_.mixin(_);