js的七种类型
四基两空一对象
数字类型,字符串类型,布尔类型,null,undefined,symbol,Bigint
问题: NaN是什么
答:NaN表示无法表示出的数字,是Number类型 typeof NaN : number NaN == NaN是false,因为NaN不于任何值相等
关于布尔类型中的隐式转换:
falsy值 falsy值共有五个:
undefined
NaN
null
0
""(空字符串)
关于undefined和null的区别
1. undefined == null true undefined === null false 原因是值都是空值,但类型不同,typeof undefined输出undefined,但typeof null输出object
2.undefined表示一个变量没有被声明,或者被声明了但没有被赋值(未初始化), 一个没有传入实参的形参变量的值为undefined,如果一个函数什么都不返回,则该函数默认返回undefined null表示空值,即什么都没有
3.undefined不是一个有效的JSON,但null是 4.undefined和null在转换为原始类型时,null在算术中转换为0,undefined不做转换 复杂类型(引用类型)Object 数组,对象,函数 使用typeof,数组和对象都会返回object,函数返回function
用来区分数组和对象的方法:
1.intanceof let a = {}; console.log(o intanceof Object) // ture
2.Object.portotype.toString.call()
let a = 4;
let b = function () {};
let c = [];
let d = null;
console.log(Object.prototype.toString.call(a));
console.log(Object.prototype.toString.call(b));
console.log(Object.prototype.toString.call(c));
console.log(Object.prototype.toString.call(d));
// [object Number]
// [object Function]
// [object Array]
// [object Null]
然后写个方法来截取一下
function judge(type) {
var string = Object.prototype.toString.call(type);
return string.substr(8, string.length - 9)
}
复杂类型存储在堆内存中,基本类型存储在栈内存中,JS中规定栈内存中可以直接取值, 堆内存中只能用地址来取值,所以深拷贝,浅拷贝只存在复杂类型中
深拷贝和浅拷贝 深拷贝的方法:
1.JSON.parse(JSON.stringify(data))
2.Object.assign({}, data)
3.递归实现深拷贝
// 深拷贝
function cloneDeep(obj) {
// 3.根据obj为对象或者数组,产生一个空的对象或数组,存放数据
var newobj = obj instanceof Array ? [] : {};
// 1.for...in进入循环 for (var k in obj) {
// 2.判断对象的第一个属性是否为数组或者对象,如果是,则进入递归
// if (obj[k] instanceof Array) {
// newobj[k] = cloneDeep(obj[k])
// } else if (obj[k] instanceof Object) {
// newobj[k] = cloneDeep(obj[k])
// }
// 4.上面两个执行逻辑一样,进行合并
if (typeof obj[k] === 'object') { newobj[k] = cloneDeep(obj[k]) } else {
// 5.如果数据为基本类型,则直接赋值
newobj[k] = obj[k] } }
// 6.把存放了数据的新对象返回出去
return newobj
}
补充:typeof能返回的值有六种:undefined,string,number,boolean,function,symbol