面试之原型及深浅拷贝

原型

Javascript中大部分的数据都是对象,他们的根对象是Object.prototype对象。在JavaScript中所有的对象都是从Object. Prototype克隆而来,Object. Prototype对象就是她们的原型。

要得到一个对象,不是通过实例化类,而是找到一个对象作为原型并克隆它。

对象会记住它的原型。如果对象无法响应某个请求,它会把这个请求委托给它的构造器的原型

 

原型链

每个对象都一个原型对象,这个原型对象由对象内置属性_proto_指向它的构造函数的prototype指向的对象。

即任何对象都是由一个构造函数创建的,但prototype只要方法才有。

 

Primitive type基本类型:Undefined、Null、Boolean、Number、String;

应用数据类型:Object类:有常规名值对的无序对象,数组以及函数

 

Undefined NULL的区别

Null表示“没有对象”。即该处不应该有值。

Null典型用法是:

  1. 作为函数的参数,表示该函数的参数不是对象
  2. 作为对象原型链的终点
  3. Undefined 表示 “缺少值”,就是此处应该有一个值。但是没有定义。

 

undefined典型用法是

  1. 变量被声明了,但没有初始化
  2. 调用函数时,应该提供的参数未提供
  3. 对象没有赋值的属性
  4. 函数没有返回值时,默认返回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(_);


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值