js对象及常见面试题

对于一个程序员来说,前三年还是要把基础打牢,最近在看《js权威指南这本书》看了对象这一部分,做了一下总结:
首先上一张思维导图:

这里写图片描述
常见的面试题:
1.对象的复制(深拷贝和浅拷贝)

  //基本类型 Number String Boleen 按值传递 改a不会改b
    var a = 25;
    var b = a;
    b = 18;
    console.log(a,b);
    //对象是按引用传值
    var obj1= {a:1,b:2,c:3};
    var obj2= obj1;
    obj2.b = 10;
    console.log(obj2,obj1);
    //浅拷贝复制只想某一个对像的指针,深拷贝会创造一个一模一样的对象
    //深拷贝实现的方法
    var obj1 = {a:10,b:20,c:30};
    //手动复制
    var obj2 = {a:obj1.a,b:obj1.b,c:obj1.c}
    //转成JSON再转回来
    var obj1 = {body:{a:10}};
    var obj2 = JSON.parse(JSON.stringify(obj1));
    //使用jquery的$.extend
    var $ = require('jquery');
    var obj1 = {
        a:1,
        b:{f:{g:1}},
        c:[1,2,3]
    }
    var obj2= $.extend(true,{},obj1);
    //利用lodash库
     //_.cloneDeep
    function deepCoby (obj) {
        if (null == obj || "object" != typeof obj)     //网上抄个深拷贝
            return obj;
        if (obj instanceof Date) {
            var copy = new Date();
            copy.setTime(obj.getTime());
            return copy;
        }
        if (obj instanceof Array) {
            var copy = [];
            for (var i = 0, len = obj.length; i < len; ++i) {
                copy[i] = this.deepCoby(obj[i]);
            }
            return copy;
        }
        if (obj instanceof Object) {
            var copy = {};
            for (var attr in obj) {
                if (obj.hasOwnProperty(attr)) copy[attr] = this.deepCoby(obj[attr]);
            }
            return copy;
        }
    }

2.对象的创建的几种方式:

   //1.Object构造函数模式
    var person = new Object();
    person.name = 'liming'
    person.sayHi = function(){
        return this.name
    }
    //2.对象字面量的形式
    var person = {
        name:'liming',
        sayHi:function(){
            return this.name
        }
    }
    //3.工厂模式
    function createPerson(name,age){
        var obj = new Object();
        obj.name = name;
        obj.age = age;
        return obj;
    }
    //4.构造函数模式
    function person(name,age){
        this.name = name;
        this.age = age;
    }
    var person1 = new Person('liming',29);
    //5.原型模式
    function person(){ }
    person.prototype.name = 'liming';
    var person1 = new person();
    person1.name;//liming
    //这个原型中的属性是被很多实例所共享的
    //6.组合使用构造函数和原型模式
    function person(name,age){
        this.name = name;
        this.age = age;
    }
    person.prototype = {
        constructor:person,
        sayHi:function(){
            alert(this.name)
        }
    }

3.原型和原型链之间的一些关系:
这个推荐一篇博客吧:
https://www.cnblogs.com/shuiyi/p/5305435.html

猜你喜欢

转载自blog.csdn.net/oncemore520/article/details/80734098
今日推荐