js 数据类型

基本数据类型:字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、符号(Symbol)。

引用数据类型:对象(Object)、数组(Array)、函数(Function),还有两个特殊的对象:正则(RegExp)和日期(Date)。

var person = {name: '凯隆',hobby: ['玩耍', '学习', '造梦']
};

一、赋值

赋值操作就是使用赋值运算符,将一个变量的值赋值给另一个变量。

对基本数据类型进行赋值很好理解,变量赋值如下:

let a = 0;
let b = a
// 这里 a 和 b 是两个变量
a = 100;
console.log(a, b); // 100, 0

使用赋值运算符对引用数据类型(对象类型)赋值,两者共用一个地址,互相牵连:

var person1 = person;
person1.name = '杰哥';
console.log(person); // {name: '杰哥', hobby: Array(3)};
console.log(person1); // {name: '杰哥', hobby: Array(3)};

二、浅拷贝

浅拷贝会重新在堆中新建内存,基本数据类型不会共用内存,但引用数据类型还是共用一个内存。

function shallowCopy(obj) {var target = {};for (var i in obj) {if (obj.hasOwnProperty(i)) {target[i] = obj[i];}}return target;
}
var person2 = shallowCopy(person);
person2.name = '泽龙';
person2.hobby[0] = '学习';
console.log(person); // {name: '杰哥', hobby: ['学习', '学习', '造梦']};
console.log(person2); // {name: '泽龙', ['学习', '学习', '造梦']};

Object.protoType.hasOwnProperty 方法返回一个布尔值,判断对象是否包含特定的自身(非继承)属性。

简写写法:

Object.assign(target, ...sources);

Object.assign 方法将所有可枚举属性的值从一个或多个源对象复制到目标对象,同时返回目标对象。

其中 target 是目标对象,sources 是源对象,可以有多个,返回修改后的目标对象。

三、深拷贝

深拷贝会在堆中新建一个内存空间,两个对象互不影响(基本数据类型和引用数据类型都互不影响)。

function deepCopy(obj) {var target = obj.constructor();if (typeof obj === null) {return obj;}if (typeof obj !== 'object') {return obj;}// a instanceof b b的prototype是否在a的原型链上if (obj instanceof Date) {return new Date(obj);}if (obj instanceof RegExp) {return new RegExp(obj);}for (var i in obj) {if (obj.hasOwnProperty(i)) {target[i] = deepCopy(obj[i]);}}return target;
} 

constructor() 返回对象的构造器,Number.constructor() 返回 0,String.constructor() 返回 '',Array.constructor() 返回 [],Object.constructor() 返回 {},Function.constructor() 返回 ƒ anonymous() {},Bool.constructor() 返回 false。

深拷贝的简易写法:

function deepCopy(obj) {var target = obj.constructor();if (typeof obj !== 'Object') {return obj;}for (var i in obj) {if (obj.hasOwnProperty(i)) {target[i] = deepcopy(obj[i]);}}return target;
} 

也可以直接使用 JSON.parse(JSON.stringify()) 方法进行深拷贝:

var newObj = JSON.parse(JSON.stringify(obj));

弊端:拷贝不了函数和正则表达式。

Js进阶3-赋值、浅拷贝、深拷贝深度解析相关推荐

  1. 一文搞懂JS中的赋值·浅拷贝·深拷贝

    前言 为什么写拷贝这篇文章?同事有一天提到了拷贝,他说赋值就是一种浅拷贝方式,另一个同事说赋值和浅拷贝并不相同.我也有些疑惑,于是我去MDN搜一下拷贝相关内容,发现并没有关于拷贝的实质概念,没有办法只 ...

  2. Interview:算法岗位面试—10.11下午—上海某公司算法岗位(偏机器学习,互联网数字行业)技术面试考点之XGBoost的特点、python的可变不可变的数据类型、赋值浅拷贝深拷贝区别

    ML岗位面试:10.11下午-上海某公司算法岗位(偏机器学习,互联网数字行业)技术面试考点之XGBoost的特点.python的可变不可变的数据类型.赋值浅拷贝深拷贝区别 Interview:算法岗位 ...

  3. python3 赋值 浅拷贝 深拷贝 简介

    目录 一.赋值 二.浅拷贝(shallow copy) 三.深拷贝(deep copy) 四.关于拷贝操作的警告 一.赋值 在python中,对象的赋值就是简单的对象引用,这点和C++不同.如下: a ...

  4. python赋值浅拷贝和深拷贝的区别_python赋值、浅拷贝、深拷贝区别

    在写Python过程中,经常会遇到对象的拷贝,如果不理解浅拷贝和深拷贝的概念,你的代码就可能出现一些问题.所以,在这里按个人的理解谈谈它们之间的区别. 一.赋值(assignment) 在<Py ...

  5. js 浅拷贝直接赋值_js 深拷贝 vs 浅拷贝

    本文主要讲一下 js 的基本数据类型以及一些堆和栈的知识和什么是深拷贝.什么是浅拷贝.深拷贝与浅拷贝的区别,以及怎么进行深拷贝和怎么进行浅拷贝. 本文思维导图如下:本文思维导图 堆和栈的区别 其实深拷 ...

  6. Python 直接赋值、浅拷贝和深度拷贝全解析

    直接赋值:其实就是对象的引用(别名,其实就是一个人今天叫张三 明天叫张狗子的意思). 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy): copy 模块的 de ...

  7. 部分仍在编辑文章 - Python基础专题 - 深度解析python中的赋值与拷贝

    深度解析python中的赋值与拷贝 jcLee95 的 CSDN 博客:https://blog.csdn.net/qq_28550263?spm=1011.2124.3001.5343 邮箱 :29 ...

  8. 【进阶3-5期】深度解析 new 原理及模拟实现

    定义 new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例. --(来自于MDN) 举个栗子 function Car(color) {this.color = color; ...

  9. js中的浅拷贝深拷贝深入理解

    举个例子来说明一下什么是浅拷贝什么是深拷贝 浅拷贝 var x = {a: 1,b: {f: {g: 1}},c: [1, 2, 3] }; var y = shallow(x); 得出的结果可以看出 ...

最新文章

  1. cssbefore图片大小_两小时学会CSS-before after 伪元素
  2. python语言入门p-MicropPython的学习,如何从0到1?
  3. 【LDA学习系列】Beta分布Python代码
  4. hdu 4966 最小树形图
  5. php类库下载下来怎么使用,PHP如何实现$this-[类库名称]-[类库方法]。
  6. 设计模式解密(12)- 桥接模式
  7. Csharp:user WebControl Read Adobe PDF Files In Your Web Browser
  8. 传西门子中国运营中近一半业务涉及行贿
  9. 美国红帽软件公司是做什么的
  10. 清除壁垒 大数据推动城市规划质突破
  11. 羽毛球比赛五类典型假动作盘点及技术解读
  12. canvas图片合成
  13. V4L2驱动的移植与应用(三)
  14. Debussy5.4安装过程
  15. C#中的异步和多线程
  16. anemometer mysql_MySQL慢日志简介及Anemometer工具介绍
  17. bp神经网络数学建模论文,关于bp神经网络的论文
  18. 萨克斯的最佳清洁办法
  19. 【主观感受】无处不在的广告和垃圾软件,“百度一下,你就上当了”
  20. 电脑排行,十大笔记本电脑排名(笔记本电脑排行前十)

热门文章

  1. win7取消文件默认打开方式
  2. 检测手机号码是否合法
  3. 网线-超六类布线知识
  4. 信者自信,愿者上钩。创业是福,也是罪。正确认识创业观念
  5. 复数的加减乘除C语言实现
  6. 微信公众平台开发教程(四)
  7. 渐进式框架 Vue.js
  8. Java基础知识之扫描器(Scanner)
  9. IDA分析-熊猫烧香
  10. 3DMAX模型转成XPL格式