JS中数据类型的判断( typeof,instanceof,constructor,Object.prototype.toString.call() )

本文详细解析了JavaScript中typeof、instanceof和constructor这三个概念,包括它们的用途、示例和在对象原型中的行为。从Undefined到Function,理解对象类型和原型链的关键技术。
摘要由CSDN通过智能技术生成

一、typeof

typeof 操作符返回一个字符串,表示未经计算的操作数的类型。

类型结果
Undefined"undefined"
Null"object" (见下文)
Boolean"boolean"
Number"number"
BigInt(ECMAScript 2020 新增)"bigint"
String"string"
Symbol (ECMAScript 2015 新增)"symbol"
宿主对象(由 JS 环境提供)取决于具体实现
Function 对象 (按照 ECMA-262 规范实现 [[Call]])"function"
其他任何对象"object"

二、instanceof

instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。

// 定义构造函数
function C(){}
function D(){}

var o = new C();


o instanceof C; // true,因为 Object.getPrototypeOf(o) === C.prototype


o instanceof D; // false,因为 D.prototype 不在 o 的原型链上

o instanceof Object; // true,因为 Object.prototype.isPrototypeOf(o) 返回 true
C.prototype instanceof Object // true,同上

C.prototype = {};
var o2 = new C();

o2 instanceof C; // true

o instanceof C; // false,C.prototype 指向了一个空对象,这个空对象不在 o 的原型链上.

D.prototype = new C(); // 继承
var o3 = new D();
o3 instanceof D; // true
o3 instanceof C; // true 因为 C.prototype 现在在 o3 的原型链上
 

三、constructor

所有对象都会从它的原型上继承一个 constructor 属性

var o = {};
o.constructor === Object; // true

var o = new Object;
o.constructor === Object; // true

var a = [];
a.constructor === Array; // true

var a = new Array;
a.constructor === Array // true

var n = new Number(3);
n.constructor === Number; // true

四、Object.prototype.toString.call()

使用 Object 对象的原型方法 toString ,使用 call 改变指向,借用Object的 toString  方法,还可以写成({}).toString.call(),效果是一样的

Object.prototype.toString.call(value).slice(8, -1).toLowerCase()

Object.prototype.toString.call(null).slice(8, -1).toLowerCase()

// => 'null'

Object.prototype.toString.call(true).slice(8, -1).toLowerCase()

// => 'boolean'

Object.prototype.toString.call(1).slice(8, -1).toLowerCase()

// => 'number'

Object.prototype.toString.call([1, 2, 3]).slice(8, -1).toLowerCase()

// => 'array'

Object.prototype.toString.call({ a: 1 }).slice(8, -1).toLowerCase()

// => 'object'

Object.prototype.toString.call(new Set()).slice(8, -1).toLowerCase()

// => 'set'

Object.prototype.toString.call(new Map()).slice(8, -1).toLowerCase()

// => 'map'

Object.prototype.toString.call(function() {}).slice(8, -1).toLowerCase()

// => 'function'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值