资讯专栏INFORMATION COLUMN

如何判断JavaScript的数据类型?

jackzou / 900人阅读

摘要:本文将讲解我目前所知道的判断数据类型的方法。数据类型一共有种除了之外的种属于原始数据类型。等价于问题四的返回值是什么答案。

本文将讲解我目前所知道的判断JavaScript数据类型的方法。
JavaScript数据类型一共有7种:

Undefined

Null

Boolean

String

Symbol

Number

Object

除了Object之外的6种属于原始数据类型。有时,我们还会细分Object的类型,比如ArrayFunctionDateRegExp等。

typeof

typeof可以用来区分除了Null类型以外的原始数据类型对象类型的可以从普通对象里面识别出函数

typeof undefined // "undefined"
typeof null // "object"
typeof 1 // "number"
typeof "1" // "string"
typeof Symbol() // "symbol"
typeof function() {} // "function"
typeof {} // "object"

问题一:typeof不能识别null,如何识别null
答案:如果想要判断是否为null,可以直接使用===全等运算符来判断(或者使用下面的Object.prototype.toString方法):

let a = null
a === null // true

问题二:typeof作用于未定义的变量,会报错吗?
答案:不会报错,返回"undefined"

typeof randomVariable // "undefined"

问题三:typeof Number(1)的返回值是什么?
答案:"number"。注意NumberString作为普通函数调用的时候,是把参数转化为相应的原始数据类型,也就是类似于做一个强制类型转换的操作,而不是默认当做构造函数调用。注意和Array区分,Array(...)等价于new Array(...)

typeof Number(1) // "number"
typeof String("1") // "string"

Array(1, 2, 3)
// 等价于
new Array(1, 2, 3)

问题四:typeof new Number(1)的返回值是什么?
答案:"object"

typeof new Number(1) // "object"
typeof new String(1) // "object"
instanceof

instanceof不能用于判断原始数据类型的数据:

3 instanceof Number // false
"3" instanceof String // false
true instanceof Boolean // false

instanceof可以用来判断对象的类型:

var date = new Date()
date instanceof Date // true

var number = new Number()
number instanceof Number // true

var string = new String()
string instanceof String // true

需要注意的是,instanceof的结果并不一定是可靠的,因为在ECMAScript7规范中可以通过自定义Symbol.hasInstance方法来覆盖默认行为。详情参见ECMAScript7规范中的instanceof操作符。

Object.prototype.toString
Object.prototype.toString.call(undefined).slice(8, -1) // "Undefined"
Object.prototype.toString.call(null).slice(8, -1) // "Null"

Object.prototype.toString.call(3).slice(8, -1) // "Number"
Object.prototype.toString.call(new Number(3)).slice(8, -1) // "Number"

Object.prototype.toString.call(true).slice(8, -1) // "Boolean"
Object.prototype.toString.call("3").slice(8, -1) // "String"
Object.prototype.toString.call(Symbol()).slice(8, -1) // "Symbol"

由上面的示例可知,该方法没有办法区分数字类型和数字对象类型,同理还有字符串类型和字符串对象类型、布尔类型和布尔对象类型。

另外,ECMAScript7规范定义了符号Symbol.toStringTag,你可以通过这个符号自定义Object.prototype.toString方法的行为:

"use strict"
var number = new Number(3)
number[Symbol.toStringTag] = "Custom"
Object.prototype.toString.call(number).slice(8, -1) // "Custom"

function a () {}
a[Symbol.toStringTag] = "Custom"
Object.prototype.toString.call(a).slice(8, -1) // "Custom"

var array = []
array[Symbol.toStringTag] = "Custom"
Object.prototype.toString.call(array).slice(8, -1) // "Custom"

因为Object.prototype.toString方法可以通过Symbol.toStringTag属性来覆盖默认行为,所以使用这个方法来判断数据类型也不一定是可靠的。

Array.isArray

Array.isArray(value)可以用来判断value是否是数组:

Array.isArray([]) // true
Array.isArray({}) // false
(function () {console.log(Array.isArray(arguments))}()) // false
总结

本文讲解了我目前所知道的判断JavaScript数据类型的方法,希望大家能有所收获。如果本文有什么错误或者不严谨的地方,欢迎在评论区留言。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/98080.html

相关文章

  • JavaScript专题系列文章

    摘要:专题系列共计篇,主要研究日常开发中一些功能点的实现,比如防抖节流去重类型判断拷贝最值扁平柯里递归乱序排序等,特点是研究专题之函数组合专题系列第十六篇,讲解函数组合,并且使用柯里化和函数组合实现模式需求我们需要写一个函数,输入,返回。 JavaScript 专题之从零实现 jQuery 的 extend JavaScritp 专题系列第七篇,讲解如何从零实现一个 jQuery 的 ext...

    Maxiye 评论0 收藏0
  • javascript如何判断变量数据类型

    摘要:除和外,所有的数据类型都是可以转化为对象,而如果是对象,就肯定有构造函数。特性因为和没有构造函数,因此不能用此方法来判断。由于同一条原型继承链上的各个对象的构造函数都不一样,因此,此方法可以区分开继承链上的各个自定义数据类型。 typeof 用法示例 var arr = []; typeof arr; //object typeof(arr); //object typeo...

    曹金海 评论0 收藏0
  • JavaScript中,如何判断数组是数组?

    摘要:比如我们今天要讨论的,在当中如何判断一个数组是数组。在数组的原型链上也能找到构造函数由上面的几行代码可以看出,使用运算符可以分辨数组和对象,可以判断数组是数组。用判断实例化的数组拥有一个属性,这个属性指向生成这个数组的方法。 如果你没有注意过这个问题,那么这个标题应该会让你感到困惑,判断数据类型这么基础的问题能有什么坑呢? 少年,你不能太天真了,我们朝夕面对的这门语言,可是JavaSc...

    kohoh_ 评论0 收藏0
  • 关于javascript类型判断那些疑惑

    摘要:对于复杂类型它的每个实例都有属性。当检测实例时优于因为能检测这段代码是从的。补充以下结果,发现第三种方法也能正确判断出。我们知道结果是那如何判断两个变量呢比较两个变量,使用的即可。 Javascript中数据类型分为两种: 简单数据类型:Undefined, NULL, Boolean, Number, String 复杂数据类型:Object 接下来我们就来看看怎么做数据类型判别...

    李增田 评论0 收藏0
  • 分析 JavaScript 数据类型与变量

    摘要:基本数据类型在中,基本数据类型有种,即数值字符串布尔值。两个布尔值转为数值进行比较。对于对象和布尔值,调用它们的方法得到对应的字符串值,然后进行字符串相加。减法对于字符串布尔值或者,自动调用,转换结果若为,那么最终结果为。 这篇文章,来聊聊 JS 中的数据类型与变量。这是在学习 JS 时最基础的一类问题,但却很重要。希望我的分享有帮助到你。 文章开头,我先提几个面试中遇到的问题: 比如...

    Mike617 评论0 收藏0

发表评论

0条评论

jackzou

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<