数据类型及判断"/>
JS基础数据类型及判断
js基础(弱类型语言—>不必事先声明数据类型)
js数据类型
- 基础类型:number、string、boolean、null、undefined、symbol、bigInt(基础数据类型无原型)
- 引用数据类型: object包含object、array、function、date
数据类型判方法:
1、typeof判断
- 可判断出除null(null判断为object)外的基础类型(包含:String、Number、Boolean、undefined、symbol、bigint)
- 对非基本类型只可判断出function,其他(new Date、Array、null、{}、[]、)都是object
2、instanceof判断
语法:object instanceof constructor
原理:instanceof 运算符用于测试构造函数(constructor)的 prototype 属性是否存在于实例对象(object)的原型链上,如存在,则返回 true。
- (不适用于基础数据类型,因为基础数据类型没有构造器,存储在栈中)
- instanceof运算符会沿着对象的原型链向上查找,直到找到构造函数的原型或者到达原型链的末端
// 手写instanceof
function myInstanceof(obj,constructor){// Obejct.getPrototypeOf作用:获取指定对象的原型(内部[[Prototype]]属性的值),如果没有继承属性,则返回 null let proto = Obejct.getPrototypeOf(obj);while(proto !== null){if(proto === constructor.prototype){return true;}proto = Object.getPrototypeOf(proto);}return false;
}
题外话: Object.setPrototypeOf():为现有对象设置原型,返回一个新对象;
接收两个参数:第一个是现有对象,第二是原型对象。
3、万能判断法:Object.prototype.toString.call()
eg: Object.prototype.toString.call(10) ---> '[object Number]'
4、constructor判断:不稳定,不建议使用,undefined/null使用时会报错
题外话:
防御性编程:即foo.list && foo.list instanceof Array && foo.list.forEach(() =>{…});
隐式转换规则:
1、+ 加其他类型= string
2、+ 两边都是NAN时结果为NAN,undefined转为NAN
3、 NAN为Number类型, —> perferredType—感兴趣可看
4、Infinity + Infinity= infinity(无穷大);
5、infinity + (-infinity)= NaN
6、对象在转换基本类型时,会调用对象上的valueof()或toStrng()方法,该方法的返回值为基本类型的结果,内置函数toPrimitive;
Js的引用与拷贝:
基本数据类型: 占用空间小,大小固定,频繁使用,保存在栈中
引用数据类型:占用空间较大,大小不固定,保存在堆中
Object.assign:
const bar ={a: 1}; const foo = {a:10,b:20};
Object.assign(bar,foo) —-> {a:1, b:20} === bar
返回值为第一个参数,浅层拷贝、值拷贝
深浅拷贝: 拷贝时地址拷贝到哪一层,第一层还是第n层
参考:
更多推荐
JS基础数据类型及判断
发布评论