欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

前端值得一探究竟特辑 --- 原始值和引用值类型及数据类型的判别

程序员文章站 2022-03-08 23:08:52
...

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返回构造函数的名字来判别。
但是{}.constructor123.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