前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >day014: JS数据类型之问——检测篇

day014: JS数据类型之问——检测篇

作者头像
用户3806669
发布2021-03-10 20:48:58
3220
发布2021-03-10 20:48:58
举报
文章被收录于专栏:前端三元同学前端三元同学

day014: JS数据类型之问——检测篇

1. typeof 是否能正确判断类型?

对于原始类型来说,除了 null 都可以调用typeof显示正确的类型。

代码语言:javascript
复制
typeof 1 // 'number'typeof '1' // 'string'typeof ?developer/article/1799785/undefined // '?developer/article/1799785/undefined'typeof true // 'boolean'typeof Symbol() // 'symbol'

但对于引用数据类型,除了函数之外,都会显示"object"。

代码语言:javascript
复制
typeof [] // 'object'typeof {} // 'object'typeof console.log // 'function'

因此采用typeof判断对象数据类型是不合适的,采用instanceof会更好,instanceof的原理是基于原型链的查询,只要处于原型链中,判断永远为true

代码语言:javascript
复制
const Person = function() {}const p1 = new Person()p1 instanceof Person // true
var str1 = 'hello world'str1 instanceof String // false
var str2 = new String('hello world')str2 instanceof String // true

2. instanceof能否判断基本数据类型?

能。比如下面这种方式:

代码语言:javascript
复制
class PrimitiveNumber {  static [Symbol.hasInstance](x) {    return typeof x === 'number'  }}console.log(111 instanceof PrimitiveNumber) // true

如果你不知道Symbol,可以看看MDN上关于hasInstance的解释。

其实就是自定义instanceof行为的一种方式,这里将原有的instanceof方法重定义,换成了typeof,因此能够判断基本数据类型。

3. 能不能手动实现一下instanceof的功能?

核心: 原型链的向上查找。

代码语言:javascript
复制
function myInstanceof(left, right) {    //基本数据类型直接返回false    if(typeof left !== 'object' || left === null) return false;    //getProtypeOf是Object对象自带的一个方法,能够拿到参数的原型对象    let proto = Object.getPrototypeOf(left);    while(true) {        //查找到尽头,还没找到        if(proto == null) return false;        //找到相同的原型对象        if(proto == right.prototype) return true;        proto = Object.getPrototypeof(proto);    }}

测试:

代码语言:javascript
复制
console.log(myInstanceof("111", String)); //falseconsole.log(myInstanceof(new String("111"), String));//true

4. Object.is和===的区别?

Object在严格等于的基础上修复了一些特殊情况下的失误,具体来说就是+0和-0,NaN和NaN。源码如下:

代码语言:javascript
复制
function is(x, y) {  if (x === y) {    //运行到1/x === 1/y的时候x和y都为0,但是1/+0 = +Infinity, 1/-0 = -Infinity, 是不一样的    return x !== 0 || y !== 0 || 1 / x === 1 / y;  } else {    //NaN===NaN是false,这是不对的,我们在这里做一个拦截,x !== x,那么一定是 NaN, y 同理    //两个都是NaN的时候返回true    return x !== x && y !== y;  }
本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-22,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 前端三元同学 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • day014: JS数据类型之问——检测篇
    • 1. typeof 是否能正确判断类型?
      • 2. instanceof能否判断基本数据类型?
        • 3. 能不能手动实现一下instanceof的功能?
          • 4. Object.is和===的区别?
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
          http://www.vxiaotou.com