JavaScript对象复制(二)
<script>
function copy(a) {
ret = {};
for (sth in a) {
temp = a[sth];
if (temp instanceof Array) {
var ddddd = [];
for (i in temp) {
var b = copy(temp[i]);
ddddd = ddddd.concat(b);
}
ret[sth] = ddddd;
}
else {
ret[sth] = a[sth];
}
}
return ret;
}
console.log
(
copy({name:"马良",age:"31",Books:[{name:"C#入门经典",title:"好书"},
{name:"js入门经典",title:"好书"}]}
)
);
</script>
运行上面的代码,发现copy方法不正确,让我的同事李鑫看了一下,后来经过大家的一番讨论,才发现里面的问题。
js语言不严谨,临时变量得使用,在递归调用时容易混淆,解决问题的方式就是不用临时变量,都用直接变量。
改变后得代码如下
<script>
function copy(a) {
ret = {};
for (sth in a) {
if (a[sth] instanceof Array) {
ret[sth]=[];
for (i in a[sth]) {
ret[sth].push(copy(a[sth][i]));
}
}
else {
ret[sth] = a[sth];
}
}
return ret;
}
console.log
(
copy({name:"马良",age:"31",Books:[{name:"C#入门经典",title:"好书"},
{name:"js入门经典",title:"好书"}]}
)
);
</script>
可是改了以后,还是不对,谁能帮助我下。给你发个红包没问题的,100以下的都行。
通过一段时间的技术积累,终于把问题解决了,给大家献上代码
<script>
function copy(a) {
var ret = {};
for (var sth in a) {
var temp = a[sth];
if (temp instanceof Array) {
var ddddd = [];
for (i in temp) {
var b = copy(temp[i]);
ddddd = ddddd.concat(b);
}
ret[sth] = ddddd;
}
else {
ret[sth] = a[sth];
}
}
return ret;
}
console.log
(
copy({name:"马良",age:"31",Books:[{name:"C#入门经典",title:"好书"},
{name:"js入门经典",title:"好书"}]}
)
);
</script>
结果如下

里面的变量经常会变,经过调查发现之前的变量没有var 关键字,以至于变量都是全局变量,所以上面的代码中的变量前面都加var,保持变量的独立性。
变量 var和不加var的区别在于var 声明的变量是局部变量。不用var生命的变量是全局变量。
JavaScript对象复制(二)的更多相关文章
- JavaScript对象复制(一)(转载)
在JavaScript很多人复制一个对象的时候都是直接用"=",因为大家都觉得脚本语言是没有指针.引用.地址之类的,所以直接用"="就可以把一个对象复制给另外一 ...
- Ext JS学习第十天 Ext基础之 扩展原生的javascript对象(二)
此文来记录学习笔记: 今天继续说Ext.Array,Ext.Function,Ext.Date,Ext.Error ------------------------------------------ ...
- JavaScript对象复制
近期项目因为怕数据污染所以用到了js的对象复制 js里的对象都是继承自object,是引用类型,所以无法通过=号复制 所以整理了一些常用的复制方法,如下 一.通过JSON序列化和反序列化创建新的对象 ...
- JavaScript对象属性(二)
对象object 例子一: var car = { "wheels":4, "engines":1, "seats":5}; 例子二: v ...
- Javascript 对象复制
如果对象只是一个数据集,可采用json化再反json化的方式克隆一个对象,这个过程会丢失对象的方法.效率比较低. 可以采用如下递归的方式复制一个对象. function clone(target) { ...
- Javascript 对象复制(深浅拷贝)
一.数据类型分类: 基本变量 引用类型 二.什么叫做指针指向 栈内存.堆内存.指针指向(如下红圈圈的斜线). 三.赋值.拷贝.引用区别? 赋值指一个变量赋予某个值,包含两种方式,一种是直接量,另一种, ...
- JavaScript对象 创建对象(二)
组合使用构造函数和原型模式创建对象 function Person(name, age, job){ this.name = name; this.age = age; this.job = job; ...
- JavaScript学习总结(二)——闭包、IIFE、apply、函数与对象
一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...
- web前端学习(二) javascript对象和原型继承
目录 1. JavaScrpt对象 2. 原型对象和继承 3. 对象的克隆 (1)javascript对象 在JS中,对象是属性的容器.对于单个对象来说,都由属性名和属性值构成:其中属性名需要是标识符 ...
随机推荐
- 【转】CPU上下文切换的次数和时间(context switch)
http://iamzhongyong.iteye.com/blog/1895728 什么是CPU上下文切换? 现在linux是大多基于抢占式,CPU给每个任务一定的服务时间,当时间片轮转的时候,需要 ...
- Dijstra算法求最短路径
参考博客:http://blog.51cto.com/ahalei/1387799 与Floyd-Warshall算法一样这里仍然使用二维数组e来存储顶点之间边的关系,初始值如下. ...
- pip常用命令、配置pip源
1.查找软件 # pip search Package 2.安装软件 # pip install Package # pip install -r requirements.txt 3.更新软件 # ...
- Linux:进程实例信息(/proc)
https://blog.csdn.net/test1280/article/details/73632333 Linux:进程实例信息(/proc) 问几个问题: 1.怎么知道一个进程对应哪个可执行 ...
- C# winform C/S WebBrowser qq第三方授权登录
qq的授权登录,跟微信相似,不同的地方是: 1 申请appid与appkey的时候,注意填写回调地址. 2 这里可以在WebBrowser的是Navigated事件中直接得到Access Token, ...
- win7(旗舰版)下,OleLoadPicture 加载内存中的图片(MagickGetImageBlob),返回值 < 0
昨天去三哥家,想把拍好的照片缩小一下,我用很久前写的一个软件进行缩小,然后进行一次效果预览,这个时候弹出: Call OleLoadPicture Fail - loadPictureFromMW 奇 ...
- 初次认识:Transfer-Encoding: chunked
Transfer-Encoding: chunked 表示输出的内容长度不能确定,普通的静态页面.图片之类的基本上都用不到这个. 但动态页面就有可能会用到,但我也注意到大部分asp,php,asp.n ...
- table默认的box-sizing在不同浏览器不同
转载自:https://blog.csdn.net/csm0912/article/details/88290672
- 类的初始化过程(难点)--------java基础总结
前言:看到这么好的东西,忍不住又写到了博客上面 Student s = new Student();在内存中究竟做了哪些事情呢? ①加载student.class文件进内存. ②为栈内存s开辟空间. ...
- docker存储与网络
目录 Docker存储 挂载主机目录 创建一个数据卷 挂载一个宿主机目录作为数据卷 数据卷容器 创建一个数据卷容器 利用数据卷容器迁移数据 删除数据盘 Docker网络 简介 bridge网络 bri ...