js中的数据类型、以及浅拷贝和深拷贝
一、js中的数据类型
1、基本类型(值类型):Undefined、Boolean、String、Number、Symbol
2、引用类型:函数、数组、对象、null、new Number(10)都是对象,对象就是引用类型。
- 值类型的类型判断用typeof,引用类型的类型判断用instanceof
console.log(typeof x); // undefined
console.log(typeof 10); // number
console.log(typeof 'abc'); // string
console.log(typeof true); // boolean
console.log(typeof function () {}); //function
console.log(typeof [1, 'a', true]); //object
console.log(typeof { a: 10, b: 20 }); //object
console.log(typeof null); //object
console.log(typeof new Number(10)); //object
var fn = function () { };
console.log(fn instanceof Object); // true
- 特别说明:
ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值,通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保 证不会与其他属性名产生冲突。
let s=Symbol()
typeof s //"symbol"
Symbol函数中还可以接受一个字符串参数, 主要是对Symbol实列的描述,主要是为了利于区分;
let s1=Symbol("foo");
let s2=Symbol("bar");
s1 //Symbol("foo")
s2 //Symbol("bar")
s1.toString() //"Symbol("foo")"
s2.toString() //"Symbol("bar")"
二、js中深拷贝和浅拷贝
如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,如果B没变,那就是深拷贝。
先理解主要知识点:栈堆、基本数据类型和引用数据类型
先举一个浅拷贝的例子:let a=[0,1,2,3,4],b=a;
a[0]=1;

这两种数据类型的存储方式:打印出来后,发现b复制a后,改变b,a也跟着变了,所以接下来了解基本数据类型和引用数据类型;
a:基本数据类型:名和值存储在栈内存中,如 let a=1;
| name | value |
| a | 1 |
当b=a复制时,栈内存会开辟一个新内存,如下图:
| name | value |
| a | 1 |
| b | 1 |
所以此时修改a的值时,对b的值不会有影响,因为b的值已经放在了自己的栈内存中,但是一般我们所要讲到的深拷贝主要是针对Object类型数据
b.引用数据类型--名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值
我们设置 let a=[0,1,2,3,4],b=a;b[0]=1;

最后我们来讲解一下实现深拷贝的方法:
1、可以递归去复制所有层级属性,代码如下:
let a=[1,2,3,4],
b=deepClone(a);
a[0]=2;
console.log(a,b);

从上图可以看出,当a改变时,b没有受影响
2、除了递归,还可以用JSON对象的JSON.parse和JSON.stringify
function deepClone(obj)
{
let _obj=JSON.stringify(obj),
objClone=JSON.parse(_obj);
return objClone
}
let a7=[0,1,[2,3],4],
b7=deepClone(a7);
a7[0]=1;
a7[2][0]=1
console.log(a7,b7)

通过这种方式也能实现深拷贝,此时b不再受a的影响
3、JQ的$.extend
$.extend([deep],target,object1[,objectN])
deep表示为是否为深拷贝,为true为深拷贝,为false为浅拷贝
target目标对象,其他对象的成员属性将会附加在该对象上
object1 objectN,可选,object类型,第一个到第N个被合并的对象
let a=[0,1,[2,3],4],
b=$.extend(true,[],a);
a[0]=1;
a[2][0]=1;
console.log(a,b);

js中的数据类型、以及浅拷贝和深拷贝的更多相关文章
- JS中的引用、浅拷贝和深拷贝
js的深拷贝浅拷贝是很常遇到的问题,一直模模糊糊有点说不过去,所以这次好好总结一下. 1.js的引用 JS分为基础类型和引用类型两种数据类型: 基础类型:number.string.boolean.n ...
- 面试题常考&必考之--js中的对象的浅拷贝和深拷贝(克隆,复制)(下)
这里主要是讲深拷贝: 深拷贝:个人理解就是拷贝所有的层级 1.像对象里再放数组和对象这些叫引用值.开始我们先判断大对象中是否有引用值(数组和小对象), 然后在判断引用值是数组还是对象 2.开始啦: 1 ...
- js中的数据类型
JS中的数据类型: ——数字 (number)NaN ——字符串(string) ——布尔 (boolean)——函数 (function) 也是对象的一种 ——对象 (object) ...
- 如何判断js中的数据类型?
js六大数据类型:number.string.object.Boolean.null.undefined string: 由单引号或双引号来说明,如"string" number: ...
- 如何判断js中的数据类型
如何判断js中的数据类型:typeof.instanceof. constructor. prototype方法比较 如何判断js中的类型呢,先举几个例子: var a = "iamstri ...
- 【转】Python中的赋值、浅拷贝、深拷贝介绍
这篇文章主要介绍了Python中的赋值.浅拷贝.深拷贝介绍,Python中也分为简单赋值.浅拷贝.深拷贝这几种"拷贝"方式,需要的朋友可以参考下 和很多语言一样,Python中 ...
- [转]如何判断js中的数据类型
原文地址:http://blog.sina.com.cn/s/blog_51048da70101grz6.html 如何判断js中的数据类型:typeof.instanceof. constructo ...
- 浅谈js中的数据类型,使用typeof获取js数据类型
JS中的数据类型 1):Undefined——值未定义 注:Undefined类型只有一个值,即特色的undefined.在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined ...
- 如何判断js中的数据类型(转)
如何判断js中的数据类型:typeof.instanceof. constructor. prototype方法比较 如何判断js中的类型呢,先举几个例子: var a = "iamstri ...
随机推荐
- Jenkins使用QQ邮箱构建邮件提醒服务
前置条件: 已安装好Jenkins服务端 步骤: 访问Jenkins服务端(ip+端口),登录Jenkins 点击系统管理 选择管理插件 选择可选插件 搜索Mailer Plugin 点击直接安装 点 ...
- Image & Raw Image的区别
一.面板参数 1.Image类型: Source Image:图片资源(sprite) Color:颜色 Material:材质 Raycast Target :是否作为射线目标 Sprite 2D: ...
- IDEA Maven的下载和配置
首先去官网下载如图: 下载之后解压打开如图: 配置:1.打开conf文件夹下的settings.xml(我用的notepad++) 第55行左右加上图上的<localRepository> ...
- react native onEndReached频繁多次调用问题
今天被这个问题搞得头疼,写一个分页加载,但是listview的onEndReached方法老是被频繁调用,知道加载完所有的分页数据才停止. <ListView automaticallyAdju ...
- LR-SVM(有待重新整理)
参考:http://www.zhihu.com/question/26768865 总结: 1)在线学习:SVM不支持在线学习,LR支持 2)不平衡数据:SVM不依赖于数据的分布,所以数据是否平衡影响 ...
- ANOVA-方差分析和单尾方差分析
https://www.cnblogs.com/webRobot/p/6877283.html https://blog.csdn.net/zijinmu69/article/details/8056 ...
- 阿里云一 第一篇:云服务器ECS
阿里云(www.aliyun.com)创立于2009年,是全球领先的云计算及人工智能科技公司,为200多个国家和地区的企业.开发者和政府机构提供服务.截至2017年3月,阿里云付费云计算用户达87.4 ...
- Python学习笔记,day4
Python学习第四天 一.装饰器 函数调用顺序: 其他高级语言类似,Python 不允许在函数未声明之前,对其进行引用或者调用 高阶函数: 满足下列条件之一就可成函数为高阶函数 某一函数当做参数传入 ...
- UGUI之用ScrollRect做下拉刷新
在ScrollView下有中层次是scorllview->viewport->content scorllView对象下的ScrollRect组件是关键 ,scorllRect中指定其对 ...
- [ZJOI2007]矩阵游戏【bzoj1059/洛谷1129】/ [HEOI2016/TJOI2016]游戏
小QQ是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个N \times NN×N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种 ...