JavaScript的数据类型如何判断
JavaScript的数据类型如何判断使用 Javascript 的软件项目
JavaScript数据类型一共有7种:
- Undefined
- Null
- Boolean
- String
- Symbol
- Number
- Object
除了Object之外的6种属于原始数据类型。有时,我们还会细分Object的类型,比如Array,Function,Date,RegExp等。
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"。注意Number和String作为普通函数调用的时候,是把参数转化为相应的原始数据类型,也就是类似于做一个强制类型转换的操作,而不是默认当做构造函数调用。注意和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数据类型的方法,希望大家能有所收获。如果本文有什么错误或者不严谨的地方,欢迎在评论区留言。
本次给大家推荐一个免费的学习群,里面概括移动应用网站开发,css,html,webpack,vue node angular以及面试资源等。
对web开发技术感兴趣的同学,欢迎加入Q群:864305860,不管你是小白还是大牛我都欢迎,还有大牛整理的一套高效率学习路线和教程与您免费分享,同时每天更新视频资料。
最后,祝大家早日学有所成,拿到满意offer,快速升职加薪,走上人生巅峰。
网友评论