前端值得一探究竟特辑 --- 原始值和引用值类型及数据类型的判别
1. 原始值和引用值类型及区别
原始类型 保存为简单数据值。
引用类型 保存为对象,其本质是指向内存位置的引用。
2. 数据类型的判别
1. typeof:基本类型
使用typeof判定数据类型,只能区分基本类型。(number, string, boolean, undefined, null, symbol),特注意typeof null => object
, 可以理解为null是一个指向空对象的指针,因此判断一个变量是否为null可使用(!a && typeof a === 'object')
。
2. instanceof:A是B的实例
instanceof 用于判断一个变量是否属于某个对象的实例。也可以用来判断某个构造函数的prototype属性是否存在指定对象的原型链中。a instanceof Array => true
检查a是否是Array的实例,找a的原型链上有没有Array。特别的null instanceof Object => false
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) // false
a.constructor === Array // true
Object.prototype.toString.call(a) // "[object Array]"
Array.isArray(a) // true
上一篇: 并发编程之 CAS 的原理
下一篇: MySQL日期和字符串转换函数实例