js对象、数字深拷贝方式(转)
知识点一:js中的对象
谈到对象的拷贝,必定要说一下对象的概念。js中的数据类型分为两大类:原始类型和对象类型。(1)原始类型包括:数值、字符串、布尔值、null、undefined(后两个是特殊的原始值,这里不做详细的说明,我的上一篇博客有谈到过一些)(2)对象类型包括:对象即是属性的集合,当然这里又两个特殊的对象----函数(js中的一等对象)、数组(键值的有序集合)。好了既然对象分为这两类,这两种类型在复制克隆的时候是有很大区别的。
原始类型存储的是对象的实际数据,而对象类型存储的是对象的引用地址(对象的实际内容单独存放,为了减少数据开销通常存放在内存中)。ps:说到这里,大家要知道,对象的原型也是引用对象,它把原型的方法和属性放在内存当中,通过原型链的方式来指向这个内存地址。
知识点二:拷贝的概念
浅度拷贝:原始类型为值传递,对象类型仍为引用传递。深度拷贝:所有元素或属性均完全复制,与原对象完全脱离,也就是说所有对于新对象的修改都不会反映到原对象中。
知识点三:数组的拷贝
- 数组深拷贝方式一:for循环
var arr = [1,2,3,4,5]
var arr2 = copyArr(arr)
function copyArr(arr) {let res = []for (let i = 0; i < arr.length; i++) {res.push(arr[i])}return res
}
- 数组深拷贝方式二:通过数组的slice()方法
var arr = [1,2,3,4,5]
var arr2 = arr.slice(0)
arr[2] = 5
console.log(arr)
console.log(arr2)原理:这个代码实现非常简单。原理也比较好理解,他是将原数组中抽离部分出来形成一个新数组。我们只要设置为抽离全部,即可完成数组的深拷贝
- 数组深拷贝方式三:使用数组的concat()方法
var arr = [1,2,3,4,5]
var arr2 = arr.concat()
arr[2] = 5
console.log(arr)
console.log(arr2)原理:这个代码也非常简单,原理更加粗暴。它是用于连接多个数组组成一个新的数组的方法。那么,我们只要连接它自己,即可完成数组的深拷贝
- 数组深拷贝方式四:使用jQuery的$.extend()方法
var newJson = jQuery.extend(true,{}, json);
知识点四:对象的拷贝
- 对象深拷贝方式一:for循环
var obj = {name: 'FungLeo',sex: 'man',old: '18'
}
var obj2 = copyObj(obj)
function copyObj(obj) {let res = {}for (var key in obj) {res[key] = obj[key]}return res
}原理:就是把元对象的内容循环放进新的数组里面
- 对象深拷贝方式二:利用json对象
var obj = {name: 'FungLeo',sex: 'man',old: '18'
}
var obj2 = JSON.parse(JSON.stringify(obj))
原文链接:http://blog.csdn.net/fungleo/article/details/54931379
js对象、数字深拷贝方式(转)相关推荐
- js对象继承的方式-三种 +三种
一.原型链继承 每个构造函数都有一个原型对象,原型对象中都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针.当原型对象等于另外一个类型的实例即继承. 缺点:如果某一个构造函数实例对象 ...
- JS对象的深拷贝常用的四种方法
1.for循环完成深拷贝 2.通过JSON.stringify() 和 JSON.parse() 将对象转为字符串之后在转为对象. 3.使用拓展运算符+解构赋值(该方法的局限性在于,当值为undefi ...
- JS 对象数组深拷贝
1. JSON.parse(JSON.stringify(value)) 2. nums.slice(0)
- js中自定义对象、json对象、json字符串、普通js对象 --js学习那本书上的
4.7 自定义对象 JS除了内置对象之外,还允许我们程序自己定义属于我们自己的对象,在JS中自定义对象的方式有2种:通过构造器创建对象,通过初始化器创建对象. 4.7.1 构造器创建对象(原生JS对象 ...
- js中自定义对象、json对象、json字符串、普通js对象
4.7 自定义对象 JS除了内置对象之外,还允许我们程序自己定义属于我们自己的对象,在JS中自定义对象的方式有2种:通过构造器创建对象,通过初始化器创建对象. 4.7.1 构造器创建对象(原生JS对象 ...
- 原生js实现对象的深拷贝及循环引用
我们使用Object.assign(target,-sources)时,其实只是浅拷贝.只能复制第一层属性,而如果第一层属性中有对象或数组的话,其实只是对对象或数组的引用而已. 我们修改target里 ...
- Js将字符串转数字的方式
Js将字符串转数字的方式 Js字符串转换数字方方式主要有三类:转换函数.强制类型转换.弱类型隐式类型转换,利用这三类转换的方式可以有5种转换的方法. parseInt() parseInt()和Num ...
- JS对象拷贝:深拷贝和浅拷贝
摘要:对象拷贝,简而言之就是将对象再复制一份,但是,复制的方法不同将会得到不同的结果. 本文分享自华为云社区<js对象深浅拷贝,来,试试看!>,作者: 北极光之夜.. 一.速识概念: 对象 ...
- js 对象深拷贝、对象数组深拷贝的几种方法总结
写前端的时候经常会遇到对象的拷贝,一般我们会用到深拷贝,深拷贝就是完完整整的将一个对象从内存中拷贝一份出来,放到另一块新开辟的内存中去.向下面这种赋值是浅拷贝,a.b都是对同一块内存进行引用,a.b哪 ...
最新文章
- python quirk
- Quartus II调用modelsim无缝仿真
- Nginx与安全有关的几个配置
- VMWare共享文件
- C++动态数组简单的模拟二元堆
- MS SQL 2008 发布订阅配置错误总结
- 白帽子讲web安全——访问控制
- [MFC] CDialog::DoModal()函数用法
- Web.config常用节点解析:
- arguments.callee 指向正在执行的函数的指针
- Spring AOP会忽略从父类继承的方法
- 定时自动关机计划命令
- 10秒钟搞定圆柱齿轮设计所有课题
- 计算机软件高级职称有啥用,计算机软考高级职称有什么用
- linux基础教程 ppt,Linux基础教程(1)操作系统基础 PPT
- Python+Django毕业设计中小型企业工作日志管理系统APP(程序+LW+部署)
- Fortran编程(VScode配置)——笔记2
- maya中redshift渲染深度景深后nuke合成方法
- iOS虚拟支付被封,6个技巧帮你快速解决烦恼
- 解释X_train,Y_train,X_test,Y_test分别表示什么