JS数据类型

一步一步重温 JavaScript 基础系列。
本章节将会理解JS的数据类型,以及如何检测JS数据类型。

1 JavaScript 数据类型

  • 六种基本数据类型:Null、Undefined、Boolean、Number、String 和 Symbol(es6)
  • 一种引用数据类型:Object

1.1 Null 和 Undefined 区别

  • Null 是指变量未声明, 或者声明但未赋值
  • Undefined 是指变量声明且赋值为空

一般会在以下两种情况下,将变量赋值为null:

  1. 当一个变量准备用来存放一个对象,一开始又没有存放时,可以先赋值为null
  2. 解除引用,比如释放定时器等(注:解除一个值的引用并不意味着自动回收该值所占用的内存,让变量脱离执行环境,以便垃圾收集器在下次运行时将其回收)

1.2 Symbol

一种类似于字符串的数据类型,表示独一无二的值,用来防止属性名的冲突

3 检测数据类型

① typeof 返回该种数据类型的字符串形式,如:

1
2
3
4
5
typeof 1          // "number"
typeof(typeof 1) // "string"

typeof null // "object", null表示一个空对象指针,故返回"object"
typeof foo // "function", function也是对象,理论上应返回"object", 但是函数有其特殊属性,有必要进行区分,故返回 "function"

typeof 只能用来检测除 null 类型外的其它基本类型,另外能够检测出引用类型中 function 数据类型。

② instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上, 如下:

1
2
3
4
5
6
7
8
function 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
2
3
4
5
Object.prototype.toString.call(1)    // "[object Number]"
Object.prototype.toString.call('1') // "[object String]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call({}) // "[object Object]"
...

综上所述,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();
}

原创技术分享,您的支持将鼓励我继续创作