zoukankan      html  css  js  c++  java
  • javascript中的变量类型思考

    有一个小任务,要求如下:

    // 使用递归来实现一个深度克隆,可以复制一个目标对象,返回一个完整拷贝
    // 被复制的对象类型会被限制为数字、字符串、布尔、日期、数组、Object对象。不会包含函数、正则对象等
    题目解析:

    1深度克隆一个对象:
    首先明白这里的对象有哪些类型:
    数字对象,字符串对象,布尔对象,日期对象,数组对象,Object对象

    这些对象可以分为大致两组,分别为原始对象合成对象
    A、其中Number,String,Boolean对象是原始对象
    B、String,Date,Array,Object对象是合成对象
    数字对象的特点:http://www.w3school.com.cn/jsref/jsref_obj_number.asp
    字符串对象特点:http://www.w3school.com.cn/jsref/jsref_obj_string.asp

    1)对于这些原始对象,直接根据类型(可以通过constructor来判断,例如obj.constructor),然后直接创建该类型的对象,并且返回即可:
    new Number(obj.valueOf());
    new Boolean(obj.valueOf());
    new String(obj.valueOf());
    2)对于复杂对象,那么情况就不一样了。
    例如日期对象,日期对象的讲解:http://www.w3school.com.cn/jsref/jsref_obj_date.asp
    new Date(obj)和 new Date(obj.valueOf())均可以。
    最需要关注的是数组对象和Object对象:

    数组对象可以通过new Array或者字面量方式创建,此处推荐使用字面量创建:[];
    但是在给克隆数组的时候,需要注意一个问题,数组的属性是否克隆?
    即当var src=[]; src.name="gaga";的时候,src的name属性,到底是否克隆过去??
    我的理解:既然是克隆么,就是一毛一样,一毛一样么,自然要都克隆了。
    所以在这里用for(var i in src)的方式进行克隆,也是可以的。

    function cloneObject(src) {
    	if(src == null || src == undefined ||typeof(src) != "object"){
    	    return src;
    	}else{
    	    //为引用类型的
    	    if(src.constructor == Array){//数组
    	        var obj=[];
    	    }else if(src.constructor == Date){//日期
    	        obj = new Date(src);
    	    }else{
    	        obj={};
    	        debugger;
    	        obj.constructor = src.constructor;
    	        obj.__proto__ = Object.getPrototypeOf(src);
    	    }
    	
    	    for(var i in src){
    	        if(typeof src[i] == "object"){//对象的属性为对象
    	            obj[i] = cloneObject(src[i]);//复制对象给obj
    	        }else{
    	            obj[i] = src[i];
    	        }
    	    }
    	    return obj;
    	}
    }
    

    参考文档:http://qianduanblog.com/post/js-learning-30-object-clone-copy.html

  • 相关阅读:
    HDU1720 A+B Coming
    HDU1390 ZOJ1383 Binary Numbers
    HDU1390 ZOJ1383 Binary Numbers
    HDU2504 又见GCD
    HDU2504 又见GCD
    HDU1335 POJ1546 UVA389 UVALive5306 ZOJ1334 Basically Speaking
    HDU1335 POJ1546 UVA389 UVALive5306 ZOJ1334 Basically Speaking
    HDU1020 ZOJ2478 Encoding
    HDU1020 ZOJ2478 Encoding
    HDU2097 Sky数
  • 原文地址:https://www.cnblogs.com/luckyflower/p/4616268.html
Copyright © 2011-2022 走看看