javascript中的变量类型思考
2015-07-02 15:44
411 查看
有一个小任务,要求如下:
// 使用递归来实现一个深度克隆,可以复制一个目标对象,返回一个完整拷贝
// 被复制的对象类型会被限制为数字、字符串、布尔、日期、数组、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
最需要关注的是数组对象和Object对象:
数组对象可以通过new Array或者字面量方式创建,此处推荐使用字面量创建:[];
但是在给克隆数组的时候,需要注意一个问题,数组的属性是否克隆?
即当
我的理解:既然是克隆么,就是一毛一样,一毛一样么,自然要都克隆了。
所以在这里用for(var i in src)的方式进行克隆,也是可以的。
参考文档:http://qianduanblog.com/post/js-learning-30-object-clone-copy.html
// 使用递归来实现一个深度克隆,可以复制一个目标对象,返回一个完整拷贝
// 被复制的对象类型会被限制为数字、字符串、布尔、日期、数组、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
相关文章推荐
- JS中的history对象
- windows下安装KeystoneJS
- JSON 基础知识总结
- Javascript之对象的继承
- [KnockoutJS] - Summary of Presentation of John Papa
- JS控制消除文本框中的空格符号
- 原生javascript怎样控制form表单的提交和阻止提交
- JSP 页面中用绝对路径显示图片
- angular js 使用$location问题整理
- Json_jackson_me
- js组件收集
- Jsoup学习笔记1:解析字符串
- js中的|| 与 &&
- js获取服务器生成并返回客户端呈现给客户的控件id的方法
- js生成pdf报表
- 【Javascript】IE8兼容 背景图片与a标签的onclick事件
- 百度js 获取定位城市名称
- 从源码中无法看出函数所在的js脚本的解决方法
- Extjs中给同一个GridPanel中的事件添加参数的方法
- jsfiddle.net上的记录