1. 原始值和引用值类型及区别
原始类型 保存为简单数据值。
引用类型 保存为对象,其本质是指向内存位置的引用。
2. 数据类型的判别
1. typeof:基本类型
使用typeof判定数据类型,能够区分8种类型(number, string, boolean, undefined, symbol,bigInt, function,object)。
特注意typeof null => object
, 可以理解为null是一个指向空对象的指针。
因此判断一个变量是否为null可使用(!a && typeof a === 'object')
。
typeof 123 //"number"
typeof '123' //"string"
typeof undefined //"undefined"
typeof true //"boolean"
typeof Symbol() //"symbol"
typeof 2n //"bigint"
typeof function(){} //"function"
typeof null //"object"
2. instanceof:A是B的实例
MDN:instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。
instanceof 用于判断一个变量是否属于某个对象的实例,如果使用instanceof来判断基本类型,将会返回false。
也可以用来判断某个构造函数的prototype属性是否存在指定对象的原型链中。
a instanceof Array => true
检查a是否是Array的实例,找a的原型链上有没有Array。
特别的null instanceof Object => false
({}) instanceof Object // true
Object.create(null) // {}
(Object.create(null)) instanceof Object // false 一种创建非 Object 实例的对象的方法
3. isPrototypeOf: A是B的原型
isPrototypeOf是用来检测调用此方法的对象是否存在于指定对象的原型链中。
(Object.prototype).isPrototypeOf(Array.prototype) => true
,检查Object.prototype
是否在在Array.prototype
中。
4. Object.prototype.toString.call()
返回的是"[object Type]"
的形式,可以返回参数的类型,非常细致
Object.prototype.toString.call([]) // "[object Array]"
Object.prototype.toString.call({}) // "[object Object]"
Object.prototype.toString.call(123) // "[object Number]"
Object.prototype.toString.call('123') // "[object String]"
Object.prototype.toString.call(new Date) // "[object Date]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(Symbol()) // "[object Symbol]"
5. constructor:构造函数名
constructor 则是通过a.constructor
返回构造函数的名字来判别。
但是{}.constructor
和123.constructor
会报语法错误。let obj = {}; obj.constructor
这样不会报错。
let a = 123;
a.constructor; // Number
let obj = {};
obj.constructor; // Object
[].constructor; // Array
'123'.constructor; // String
(new Date).constructor; // Date
6. in: A是B的属性
in则是检查当前某个对象是否存在某个属性,无论是私有属性还是公有属性。'length' in []; => true
。
7. hasOwnProperty: A有B这个私有属性
hasOwnProperty检查当前某个对象是否存在某个私有属性
3. 判别数组的五种方法
const a = [];
a instanceof Array // true
Array.prototype.isPrototypeOf(a) // true
a.constructor === Array // true
Object.prototype.toString.call(a) // "[object Array]"
Array.isArray(a) // true