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

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返回构造函数的名字来判别。
但是{}.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) // true
a.constructor === Array // true
Object.prototype.toString.call(a) // "[object Array]"
Array.isArray(a) // true
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值