总结JS中判断数据类型的几种方式

总结JS中判断数据类型的几种方式

这几种应该也是用的比较多、涵盖范围广的类型检测方式,新特性提供的一些也可用其实现。

1、Object.prototype.toString.call(target)

  • 我认为这应该是最精准的类型校验,也比较严谨,能具体的区分基础数据类型引用数据类型,能准确知道 target 的具体类型。
  • 他还有另一种写法就是将Object变成 {} 形式,在JS种它俩指向的原型一样。
Object.prototype.toString.call(123); // "[object Number]"
Object.prototype.toString.call("hello"); // "[object String]"
Object.prototype.toString.call(true); // "[object Boolean]"
Object.prototype.toString.call(undefined); // "[object Undefined]"
Object.prototype.toString.call(null); // "[object Null]"
Object.prototype.toString.call({}); // "[object Object]"
Object.prototype.toString.call([]); // "[object Array]"
Object.prototype.toString.call(function(){}); // "[object Function]"
Object.prototype.toString.call((function() { return arguments;})()); 
//  "[object Arguments]"
Object.prototype.toString.call(/\w/); // "[object RegExp]"
Object.prototype.toString.call(new Date()); // "[object Date]"

// 以上写法把Object变成 {} 是一样的
  • 而随着ES6推出Symbol后,有了Symbol.toStringTag属性。
  • 我理解为它期待将一个属性值作为泛型,用于规范化。
let A = class {};
A.prototype[Symbol.toStringTag] = "A";
Object.prototype.toString.call(new A()); // "[object A]"

2、typeof

  • 只能识别基础类型和引用类型,且对数组和对象的识别都为Object
  • NaN会被识别为number类型。
  • 一般用来检测具体的基础类型。
console.log(typeof 123); // "number"
console.log(typeof "hello"); // "string"
console.log(typeof true); // "boolean"
console.log(typeof undefined); // "undefined"
console.log(typeof null); // "object"
console.log(typeof {}); // "object"
console.log(typeof []); // "object"
console.log(typeof function(){}); // "function"
console.log(typeof null); // "object"
console.log(typeof NaN); // "number"

3、instanceof

  • 一般用来检测target是否属于某一具体type,且只可判断引用类型。
  • 它的返回值是Boolean型。
  • 其实现原理是type的原型对象是否为target原型链上的某个对象。
const target = { name: "丽丽", age: 18 }
console.log(target instanceof Object); // true
console.log(target instanceof Array); // false

4、is变量

  • Array.isArray(target),检测target是否为数组,返回布尔值。
  • Object.is(target1,target2),检测target1、target2是否为相同数值,且为严谨类型,返回布尔值。
  • Number.isNaN(target) ,检测target是否为 NaN,返回布尔值。
console.log(Array.isArray([1, 2, 3])); // true
console.log(Array.isArray({})); // false
console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN(123)); // false
console.log(Object.is('1', 1)); // false
console.log(Object.is(1, 1));   // true
  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值