分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

小tips:JS之浅拷贝与深拷贝

发布时间:2023-09-06 01:10责任编辑:彭小芳关键词:暂无标签

浅拷贝:

function extendCopy(p) { var c = {}; for (var i in p) {   c[i] = p[i]; } return c;}

深拷贝:

function deepCopy(p, c) {  var c = c || {};  for (var i in p) {    if (typeof p[i] === ‘object‘) {      c[i] = (p[i].constructor === Array) ? [] : {};      deepCopy(p[i], c[i]);    } else {   ???????????c[i] = p[i];    }  }  return c;}

浅拷贝的问题:如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能。

下面来个实例:

var obj1 = { ???name:‘helloJack‘, ???inner:{ ???????sum:5 ???}};var obj2 = extendCopy(obj1,{});obj2.name ="sss";obj2.inner.sum = 7;console.log(obj1.name); //helloJackconsole.log(obj1.inner.sum); //5

存在的问题,如果经常改写这个函数的方法extendCopy,内部再调用这个方法名就会出错,还得修改一下这个方法名,那么下面这样解决:

var extendCopy = (function f(p,c){ ???var c = c || {}; ???for (var i in p) { ???????if(typeof p[i] === ‘object‘){ ???????????c[i] = (p[i] instanceof Array) ? [] : {}; ???????????f(p[i],c[i]); ???????}else{ ??????????? c[i] = p[i]; ???????}  ???} ???return c;});

可参考地址:
『小tip』JS严格模式(use strict)下不能使用arguments.callee的替代方案
Javascript 面向对象编程(一):封装
Javascript面向对象编程(二):构造函数的继承
Javascript面向对象编程(三):非构造函数的继承

小tips:JS之浅拷贝与深拷贝

原文地址:http://www.cnblogs.com/moqiutao/p/7510865.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved