一步一步重温 JavaScript 基础系列。
本章节将会理解JS的数据类型,以及如何检测JS数据类型。
1 JavaScript 数据类型
- 六种基本数据类型:Null、Undefined、Boolean、Number、String 和 Symbol(es6)
- 一种引用数据类型:Object
1.1 Null 和 Undefined 区别
- Null 是指变量未声明, 或者声明但未赋值
- Undefined 是指变量声明且赋值为空
一般会在以下两种情况下,将变量赋值为null:
- 当一个变量准备用来存放一个对象,一开始又没有存放时,可以先赋值为null
- 解除引用,比如释放定时器等(注:解除一个值的引用并不意味着自动回收该值所占用的内存,让变量脱离执行环境,以便垃圾收集器在下次运行时将其回收)
1.2 Symbol
一种类似于字符串的数据类型,表示独一无二的值,用来防止属性名的冲突
3 检测数据类型
① typeof 返回该种数据类型的字符串形式,如:
1 | typeof 1 // "number" |
typeof 只能用来检测除 null 类型外的其它基本类型,另外能够检测出引用类型中 function 数据类型。
② instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上, 如下:
1
2
3
4
5
6
7
8function A () {}
function B () {}
var a = new A()
var B = new B()
a instanceof A // true, 因为Object.getPrototypeOf(a).__proto__ === A.prototype
a instanceof B // false
instanceof只能够检测出引用类型的变量,是否在右侧构造函数的原型链上,并且由于所有引用类型都是Object的实例,所以在检测一个引用类型的变量 和 Object构造函数时,instanceof操作符始终会返回true。
③ Object.prototype.toString, 能够检测出所有的数据类型, 如下:
1 | Object.prototype.toString.call(1) // "[object Number]" |
综上所述,JS检测数据,最优方法如下:1
2
3
4
5
6
7
8
9
10/*
* @desc 数据类型检测
* @params val { any } 待检测的数据
* @return { String } 类型字符串
*/
function type(val) {
return typeof val !== "object"
? typeof val
: Object.prototype.toString.call(val).slice(8, -1).toLowerCase();
}