Javascript类型判断

Javascript类型判断

技术杂谈小彩虹2021-08-22 4:49:47160A+A-

类型系统

Javascript内置七种类型

  • 空值(null )
  • 未定义(undefined )
  • 布尔值(boolean )
  • 数字(number )
  • 字符串(string )
  • 对象(object )
  • 符号(symbol ,ES6 中新增)

使用typeof查看值的类型,返回的是类型的字符串值,但这与他们的类型值并非是完全一一对应的

null

你可能很早就知道typeofnull的处理有问题:

typeof null === 'object'  // true

正确的结果应该为null才对,所以我们需要另外的方法检测null

Array

让我们再关注一下Array,使用typeof进行处理:

typeof [] === 'object'  // true

对于数组的处理,返回的是字符串:object,查阅规范可以看出,Array是Object的子类型。

对象按照字符串键值来进行索引,而数组则是按照数字顺序来进行索引。所以确切的说,Array就是对象。

那么是否Object的所有子类型,通过typeof检测后的返回值都是‘object’呢?事实并非如此

function

使用typeof处理function

typeof function() {/** */} === 'function'  // true

但我们已经知道JavaScript内置类型中不存在function

所以使用typeof来处理类型的检测是不准确的

自定义处理函数

我们知道在Object链上有一个toString方法,其他类型上的toString则是重写了该方法,导致功能发生了变化。例如:

let num = 2
num.toString()  // "2"

toString在number类型上重写后会输出字符串。而Object链上的toString方法则能返回包含类型的字符串

let num = 2
Object.prototype.toString.call(num)  // "[object Number]"

根据这个方法,可以写出我们自己的类型检测方法

通过key-value的形成映射,通过映射返回类型字符串

function typeofs(obj) {
  const map = {
      "[object Number]": "number",
      "[object Boolean]": "boolean",
      "[object String]": "string",
      "[object Function]": "function",
      "[object Array]": "array",
      "[object Date]": "date",
      "[object RegExp]": "regExp",
      "[object Undefined]": "undefined",
      "[object Null]": "null",
      "[object Object]": "object"
  }  
  return map[Object.prototype.toString.call(obj)]
}

如果仔细观察,可以发现其实toString返回的字符串内已经包含了该类型的字符串

所以我们改造一下代码

function typeofs(obj) {
  return Object.prototype.toString.call(obj).split(/( |\])/)[2].toLowerCase()
}

In the end

最后,JavaScript中的变量是没有类型的,只有值才有。而变量是可以随时赋予任何类型的值。

参考

你不知道的JavaScript(中卷)

点击这里复制本文地址 以上内容由权冠洲的博客整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

支持Ctrl+Enter提交

联系我们| 本站介绍| 留言建议 | 交换友链 | 域名展示
本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除

权冠洲的博客 © All Rights Reserved.  Copyright quanguanzhou.top All Rights Reserved
苏公网安备 32030302000848号   苏ICP备20033101号-1
本网站由 提供CDN/云存储服务

联系我们