前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据类型判断

数据类型判断

作者头像
Chor
发布2019-11-07 18:16:26
1.4K0
发布2019-11-07 18:16:26
举报
文章被收录于专栏:前端之旅前端之旅

typeof

typeof 操作符返回一个表示数据类型的字符串,它可以应付常规场景下的数据类型判断。对基本数据类型 undefined, boolean, string, number 和引用数据类型 function 都可以正确判断,但是对 null,数组,对象则统一返回 “object”。也就是说,typeof 不适合用来判断引用数据类型。

代码语言:javascript
复制
var a = 1
typeof a // "number"
var b = [1,2,3]
typeof b // "object"
var c = {}
typeof c // "object"

instanceof

instanceof 解决了上述问题,它的原理就是判断右操作数(通常是构造函数)的原型对象是否出现在左操作数(通常是实例)的原型链上,如果在则返回 true。据此可以判断引用数据类型具体是哪种类型。

代码语言:javascript
复制
var b = [1,2,3]
b instanceof Array // true
var c = {}
c instanceof Object // true

需要注意的是,instanceof 对于不是通过 new 创建的基本数据类型无法做出正确的判断:

代码语言:javascript
复制
var a = 1
a instanceof Number // false

这是因为此时的 a 仅仅是一个基本类型的值,而不是实例对象,如果我们通过 new 创建 a,那么就能正确判断

代码语言:javascript
复制
var a = new Number(1);
a instanceof Number // true

结合 instanceof 的原理其实就很好理解其中原因了。

>> 另外要注意,instanceof 这个方法并非百试百灵 —— 假定脚本中有多个全局环境,例如 html 中有多个子 iframe,那么对于每一个全局环境而言,它都有自己版本的构造函数,进而有自己版本的原型链。instanceof 左右两边的操作数来自于不同全局环境时,即使实例和构造函数对应,也只会返回 false。

Object.getPrototypeOf()

代码语言:javascript
复制
let arr = [1,2];
console.log(Array.prototype.isPrototypeOf(arr)); // true

利用原型链。存在同上问题。

isPrototypeOf()

代码语言:javascript
复制
let arr = [1,2];
console.log(Object.getPrototypeOf(arr) === Array.prototype); // true

利用原型链。存在同上问题。

Object.prototype.toString.call()

代码语言:javascript
复制
let arr = [1,2];
`Object.prototype.toString.call(arr)`; //"[object Array]"

这个方法基本很完善,原理就是:在任何值上调用 Object 原生的 toString() 方法,都会返回一个格式为 [object NativeconstructorName] 的字符串。据此可以准确判断任何值的数据类型。

这里注意几个点:

  1. arr 作为对象,也是 Object 的一个实例,为什么不直接使用 arr.toString()?这是因为它的这个方法被重写了,即 Array.prototype.toString()。在使用 arr.toString() 的时候,它优先在原型链上找到并调用了重写的方法,最后输出的是 "1,2"
  2. 对象字面量调用 toString() 的时候则依然输出 "[object Object]",这是因为它没有重写这个方法,所以找到的是 Object.prototype 的该方法。
  3. 同样的,函数对象的 toString() 方法也被重写了,即 Function.prototype.toString()。调用的时候返回一个表示当前函数源代码的字符串。当对内置函数对象调用该方法时,返回如下格式的字符串:
代码语言:javascript
复制
Object.toString();

// "function Object() {
//    [native code]
// }"

Array.toString(); 
// "function Array() { 
//    [native code] 
// }"

实际上,这里的 Object 是构造函数,既然是函数,就可以看作是 Function 构造函数实例化的对象,因此这里相当于函数对象调用了 toString() 方法,也就是调用的 Function.prototype.toString() 方法。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • typeof
  • instanceof
  • Object.getPrototypeOf()
  • isPrototypeOf()
  • Object.prototype.toString.call()
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档