JavaScript 数据类型
本文将讲解我目前所知道的判断 JavaScript 数据类型的方法.
JavaScript 数据类型一共有 7 种:
- Undefined
- Null
- Boolean
- String
- Symbol
- Number
- Object
除了 Object 之外的 6 种属于原始数据类型. 有时, 我们还会细分 Object 的类型, 比如 Array,Function,Date,RegExp 等.
判断 JavaScript 数据类型:
- typeof
- 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".
1 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 操作符. https://segmentfault.com/a/1190000016416528
- 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.cnblogs.com/Best-Chen/p/9739487.html