数组与对象的深浅复制

简介:

1.JavaScript中的数组是一种特殊的对象。作为索引的数字在内部被转换为字符串类型,这是因为JavaScript对象的属性名必须是字符串。

  所以数组只是一种特殊的对象。
 
2.数组的浅复制与深复制
浅复制:
var nums=[1,2,3];
var samenums=nums;
 
nums[0]=0;
console.log(samenums[0]); //0 这里是0,而不是复制过来时候的1.
这就是浅复制,被赋值数组不过是一个指向原有数组的引用而已。
所以原数组改变,新赋值数组也会改变。
这样的情况有时候会影响我们的操作,也会不是我们所期望的。
 
深复制:
这时候我们就要进行深复制了。
方法一:遍历复制
for(var i=0;i<nums.length;i++){
    samenums[i]=nums[i];
}
 
这时候我们再:nums[0]=0;
console.log(samenums[0])    //1,这里依旧是1.
 
方法二:slice,slice(0)巧办法进行修改,返回的是一个副本。
 
var a=[1,2];
    var b= a.slice(0);
    a[0]=10;
    alert(b[0])    //1
 
三:对象的深浅复制
复制代码
var a={
 ao:1,
 at:2
}
var b=a;
a.ao=2;
alert(b.ao) //2 因为进行的是浅复制。
复制代码
 
对象的深复制,
一种是遍历。
还有一个是jQuery的$.extend(a,b)。 
 
复制代码
var a={ name: "John", 
      location:{
        city:"Boston",
        county:"USA"
      } 
    }
var b={};
$.extend(b,a);    //这里是直接将a对象合并到b对象中去
a.name="zqz";
console.log(b.name);    //依旧为 John 
复制代码
 
***************
$.extend()是对jQuery的直接扩展
$.fn.extend()是对jQuery的实例对象的扩展
***************
 
四:问题衍生
这里引出一个问题:
$.extend()的问题!
extend(dest,src1,src2,src3...)       含义是:将src1,src2,src3...合并到dest中
extend(boolean,dest,src1,src2,src3...)     //深度拷贝与浅拷贝
extend(true,dest,src1,src2,src3...)       //深度拷贝,会连src中的嵌套的对象也进行合并
extend(false,dest,src1,src2,src3...)           //浅拷贝,不会将src中的嵌套的对象也进行合并
 
不管是哪种extend的操作,都会涉及合并问题。那个这个合并规则又是什么呢?我们不去人云亦云。直接用例子,自己找。
 
第一种:dest不是空对象,是个已经有属性的对象。extend(dest,src1)
   
复制代码
var a={ name: "leslie", 
      location:{
        city:"beijing",
        county:"china"
      } 
    }
var b={
     name:'zqz',
     location:{
       city:'beijing',
       county:'mars',
       work:'ito'
     }
    };
 
$.extend(b,a);
console.log(b);
//结果:
{
    location:{
        city:"beijing",
        county:"china"
    },
    name:"leslie"
}
复制代码
 
结果:a与b有相同项:a覆盖b,即使b中的内嵌对象也会覆盖a中的内嵌对象
          a与b有不同项:a一样覆盖b,也就是说,不管b中有多少不同项(多出项或少出项),都是以a的为准。
--以覆盖项(a)为尊!
 
第二种:dest不是空对象,是个已经有属性的对象。extend(dest,src1,src2)
复制代码
var a={ name: "leslie",
        location:{
            city:"beijing",
            county:"china"
        }
    }
var b={
        name:'zqz',
        location:{
            city:'beijing',
            county:'mars',
            work:'ito'
        }
    }
 
var c={
        location:{
            city:'wuhan',
            county:'mars',
            work:'itos',
            hobby:'study'
        }
    }
 
$.extend(a,b,c);
console.log(a);
 
//结果
a={
       location:{
            city:'wuhan',
            county:'mars',
            work:'itos',
            hobby:'study'
        },
        name:'zqz'
    }
复制代码
**反正a的‘优先级’最低,只要前面头相同的项时候,都会直接被覆盖。然后向b推移。
 
 
(下面关于extend的深度与浅拷贝:摘自RascallySnakejQuery.extend 函数详解

五、Jquery的extend方法还有一个重载原型:  

extend(boolean,dest,src1,src2,src3...)

   第一个参数boolean代表是否进行深度拷贝,其余参数和前面介绍的一致,什么叫深层拷贝,我们看一个例子:

var result=$.extend( true,  {},  
{ name: "John", location: {city: "Boston",county:"USA"} },
{ last: "Resig", location: {state: "MA",county:"China"} } );


   我们可以看出src1中嵌套子对象location:{city:"Boston"},src2中也嵌套子对象location:{state:"MA"},第一个深度拷贝参数为true,那么合并后的结果就是: 

result={name:"John",last:"Resig",location:{city:"Boston",state:"MA",county:"China"}}

   也就是说它会将src中的嵌套子对象也进行合并,而如果第一个参数boolean为false,我们看看合并的结果是什么,如下:

var result=$.extend( false, {},  
{ name: "John", location:{city: "Boston",county:"USA"} },
{ last: "Resig", location: {state: "MA",county:"China"} }
);

     那么合并后的结果就是:

  result={name:"John",last:"Resig",location:{state:"MA",county:"China"}}
转载:http://www.cnblogs.com/zqzjs/p/5410138.html
目录
相关文章
|
7天前
|
Shell API 开发工具
Claude Code 快速上手指南(新手友好版)
AI编程工具卷疯啦!Claude Code凭借任务驱动+终端原生的特性,成了开发者的效率搭子。本文从安装、登录、切换国产模型到常用命令,手把手带新手快速上手,全程避坑,30分钟独立用起来。
2293 13
|
19天前
|
人工智能 JSON 供应链
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
LucianaiB分享零成本畅用JVS Claw教程(学生认证享7个月使用权),并开源GeoMind项目——将JVS改造为科研与产业地理情报可视化AI助手,支持飞书文档解析、地理编码与腾讯地图可视化,助力产业关系图谱构建。
23545 13
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
|
4天前
|
人工智能 开发工具 iOS开发
Claude Code 新手完全上手指南:安装、国产模型配置与常用命令全解
Claude Code 是一款运行在终端环境中的 AI 编程助手,能够直接在命令行中完成代码生成、项目分析、文件修改、命令执行、Git 管理等开发全流程工作。它最大的特点是**任务驱动、终端原生、轻量高效、多模型兼容**,无需图形界面、不依赖 IDE 插件,能够深度融入开发者日常工作流。
1703 3
|
6天前
|
人工智能 JSON BI
DeepSeek V4-Pro 接入 Claude Code 完全实战:体验、测试与关键避坑指南
Claude Code 作为当前主流的 AI 编程辅助工具,凭借强大的代码理解、工程执行与自动化能力深受开发者喜爱,但原生模型的使用成本相对较高。为了在保持能力的同时进一步降低开销,不少开发者开始寻找兼容度高、价格更友好的替代模型。DeepSeek V4 系列的发布带来了新的选择,该系列包含 V4-Pro 与 V4-Flash 两款模型,并提供了与 Anthropic 完全兼容的 API 接口,理论上只需简单修改配置,即可让 Claude Code 无缝切换为 DeepSeek 引擎。
1635 0
|
4天前
|
人工智能 JSON BI
Claude Code 搭配 DeepSeek V4-Pro 完整测评:超越 Claude Sonnet 4.5,低成本高效能背后的真实表现
Claude Code 凭借强大的代码理解、工程执行与自动化任务能力,成为开发者广泛使用的 AI 编程工具。但原生模型的调用成本较高,长期高频使用会带来明显开销。DeepSeek V4 系列模型发布后,凭借优秀的代码能力与兼容 Anthropic 协议的 API 接口,成为替代原生模型的高性价比选择。本文完整记录将 Claude Code 对接 DeepSeek V4-Pro 的配置流程、真实任务测试效果、优势亮点与必须注意的使用限制,为开发者提供可直接落地的参考方案。
1115 2
|
13天前
|
人工智能 缓存 Shell
Claude Code 全攻略:命令大全 + 实战工作流(完整版)
Claude Code 是一款运行在终端环境下的 AI 编码助手,能够直接在项目目录中理解代码结构、编辑文件、执行命令、执行开发计划,并支持持久化记忆、上下文压缩、后台任务、多模型切换等专业能力。对于日常开发、项目维护、快速重构、代码审查等场景,它可以大幅减少手动操作、提升编码效率。本文从常用命令、界面模式、核心指令、记忆机制、图片处理、进阶工作流等维度完整说明,帮助开发者快速上手并稳定使用。
3131 4
|
5天前
|
人工智能 安全 开发工具
Claude Code 官方工作原理与使用指南
Claude Code 不是传统代码补全工具,而是 Anthropic 推出的终端 AI 代理,具备代理循环、双驱动架构(模型+工具)、全局项目感知、6 种权限模式等核心能力,本文基于官方文档系统解析其工作原理与高效使用技巧。
831 0
|
7天前
|
人工智能 Linux API
hermes agent 安装教程:安装优化 + 模型配置 + 工具启用指南
Hermes Agent 是 Nous Research 于 2026 年发布的开源自主进化 AI 智能体框架(MIT 协议,Python 编写)。它通过任务沉淀技能、持久化记忆、原生多工具集成与并行子智能体,实现“越用越强”。支持 Linux/macOS/WSL2,安装便捷,面向个人与企业的新一代私有化 AI 助手。

热门文章

最新文章