一.有哪些数据类型
- 原始数据类型:string number boolean null undefined Symbol
- 引用数据类型:Object,Function,Array,String,Number,Boolean,Date,Mate,RegExp等
区别:
- 原始数据类型:存储在栈(函数调用栈)中,先进后出,占空间小,大小固定
- 引用数据类型:存储在堆中,占空间大,大小不定(引用类型在栈中存储指针,指向堆中堆实体起始位置)
二.常用判断数据类型方法(typeof,instanceof,constructor,Object.prototype.toString.call)
| 方法/数据类型 | 原始数据类型 | 引用数据类型 | 自定义类型 |
|---|---|---|---|
| typeof | null判断为object | function能判断,其它均判断为object | √ |
| instanceof | x | √ | √ |
| constructor | null和undefined不能判断 | √ | √ |
| Object.prototype.toString.call | √ | √ | x |
例子:
[] instanceof Array和[] instanceof Object 均为true
三.其它常见场景
1.判断对象是否为空
- 将对象转换成json字符串
console.log(JSON.stringfy(obj) === '{}') //true表示为空 - for in循环判断
for (let key in obj) { return false; } return true; // 空 - object.getOwnPropertyNames
let arr = Object.getOwnPropertyNames(obj); console.log(arr.length) // 为0时表示空 - ES6的object.keys(原理同上)
let arr = Object.keys(obj) console.log(arr.length) // 为0时表示空
2.深浅拷贝
js不允许直接操作内存中的地址,所以对象的操作都只是对它对引用操作,只有当要复制的对象的所有属性都不是引用类型时,可以使用浅拷贝
- 浅拷贝
- js内部函数object.assign 深拷贝第一层
object.assign(newObj, oldObj) //第一个参数为新对象,第二个为被拷贝的原对象- 遍历赋值
function shallowCopy(obj) { let copy = {}; for(let key in obj) { if(obj.hasOwnProperty(key)) { copy[key] = obj[key] } } return copy; }- array.slice()可以视为数组的浅拷贝
- 深拷贝
-
遍历 想了想还是看看大神的吧,juejin.cn/post/684490…
-
JSON转换
JSON.parse(JSON.stringfy(obj)) // 只支持基础类型、数组和对象,不支持变量、函数和对象实例,原型链会丢失- lodash
lodash _.baseClone()- jQuery
jQuery.extend() -