数据与变量
数据类型
类型分类
简单数据类型(基本类型)
1)布尔值Boolean: true / false
2)数值型Number: 所有数字
3)字符串String: 带引号
4)Undefined
5)Null
复杂数据类型(引用类型)
对象 Object
数组 Array
函数 Function
数据类型检测
typeOf
返回相关数据类型的字符串
可以检测 Boolean Number String Undefined Function
不能检测 Null ,返回Object
instanceOf
返回布尔值
用来检测Object的具体类型
全等号===
要检测的数据必须具有唯一性
可以检测 undefined 和 null
Object.prototype.toString.call(数据)
可以检测所有的数据类型
深拷贝与浅拷贝
深拷贝
简单数据类型存在栈中,将一个存着简单数据类型的变量赋值给另一个变量时,会复制一份值,且在内存中重新开辟一个空间,将值保存;两者相互独立,修改一个,另外一个不会跟着变;
浅拷贝
复杂数据类型的变量名存在栈中,值存在堆中,栈中的变量名通过引用地址指堆中的值;将一个存着复杂数据类型的变量赋值给另一个变量时,会赋值一份引用地址,新的变量就会指向变量,修改一个变量,就修改了堆中的值,由于都是同一个地址,指向同一个值,所以另一个也会随之变化;
复杂数据的深拷贝与浅拷贝对比
(1)浅拷贝:浅拷贝一个变化另外一个也会随着变化, 将原对象或原数组的引用直接赋给新对象,新数组,新对象/数组只是原对象的一个引用,
(2)深拷贝:相互独立,深拷贝一个变化另外一个不会变; 创建一个新的对象或数组,将原对象的各项属性和属性值(数组的所有元素)拷贝过来,是“值”而不是“引用”
深拷贝的实现
1 JSON序列化与反序列化
JSON.parse(JSON.string(变量)),
这也是我用得最多的
JSON.stringfy 将数据转化为简单数据类型—JSON字符串,然后通过 JSON.parse() 将它转化为普通的对象或数组
2 jQuery的extend
$.extend( [deep ], target, object )
deep: true / false,true为深拷贝,false为浅拷贝
target: 目标对象,需要被赋值的对象
object: 拷贝的数据源
这两种可以将所有复杂数据类型进行深拷贝,使用方便,尤其是 JSON
数组的深拷贝:
1拼接一个空数组
Array.concat()
2 从开始截取到最后
Array.slice()
3 展开运算符
let […newArray] = oldArray
缺点:只能拷贝一级数据
经验总结
我们经常会使用到push修改数组,经常我们会遇到重新渲染页面,初始化的情况,这个时候就要考虑到数组的置空或初始化处理;不然很容易出现问题
将一个变量赋值给另一个变量是,一定要考虑到数据类型,如果是复杂数据类型,要不要深拷贝,大部分时候都需要进行深拷贝处理,不然也容易出bug