js 检测数据类型

33 篇文章 0 订阅

1 typeof

可以确定值的原始类型

1.2 使用

typeof value

1.2 返回值

boolean:布尔值
function:函数
number:数值
object:对象或null
string:字符串
symbol:符号
undefined:未定义

1.3 缺点

不能具体细分对象

console.log(typeof null) // object
console.log(typeof [])  // object
console.log(typeof undefined) // undefined
console.log(typeof 123) // number
console.log(typeof function() {}) // function

2 instanceof

用于确保值的引用类型,当前实例是否属于某个类

2.1 使用:

value instanceof type

2.2 返回值:

属于返回true,不属于返回false

2.3 缺点:

2.3.1 只要是这个实例原型链上的类,用instanceof检测都是true
2.3.2 无法检测null和undefined,会报错
2.3.3 无法检测直接赋值的基本数据类型,通过new 关键字创建的基本数据类型才能检测

console.log([] instanceof Array) // true
console.log({} instanceof Array) // false
console.log(function(){} instanceof Function) // true

function Fn() {}
Fn.prototype = [];
console.log(Fn instanceof Function) // true
console.log(new Fn() instanceof Array) // true
console.log(new Fn() instanceof Fn) // true

console.log(123 instanceof Number) // false
console.log(new Number(123) instanceof Number) // true

3 constructor

3.1 使用

value.constructor === type

3.2 返回值

数据类型

3.2 缺点

原型可以被改变。声明一个构造函数,将其原型指向其他类型。constructor无法检测原来的类型。

console.log([].constructor === Array) // true
console.log({}.constructor === Array) // false
console.log((function(){}).constructor === Function) // true
        
function Fn() {}
console.log(Fn.constructor == Function) // true
console.log((new Fn()).constructor === Fn) // true
Fn.prototype = [];
console.log(Fn.constructor == Function) // true
console.log((new Fn()).constructor === Fn) // false
console.log((new Fn()).constructor == Array) // true

console.log((123).constructor === Number) // true
console.log((new Number(123).constructor === Number)) // true

4 Object.prototype.toString.call()最优解

4.1 使用

在object.prototype上有一个toString方法,这个方法执行时会返回方法中this关键字对应数据值的数据类型
通过call/apply改变里面的this关键词,检测指定数据的类型

4.2 返回值

[object 数据类型] 固定格式的字符串

let a = Object.prototype.toString
console.log(a.call([]),typeof (a.call([]))) // [object Array] string
console.log(a.call({})) // [object Object]
console.log((a.call(function(){}))) // [object Function]
    
function Fn() {}
console.log(a.apply(Fn)) // [object Function]
console.log(a.apply(new Fn())) // [object Object]
Fn.prototype = [];
console.log(a.apply(Fn)) // [object Function]
console.log(a.apply(new Fn())) // [object Object]

console.log(a.call(123)) // [object Number]
console.log(a.call(new Number(123))) // [object Number]

参考:https://www.cnblogs.com/zt123123/p/7623409.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值