阮一峰的ES6 Symbol中提到的JavaScript语言的数据类型包括:Undefined、Null、Boolean、String、Number、Object,以及新增的Symbol。而其前文又提到Function被作为“一等公民”,应与String、Number等平起平坐,而此处又只字不提,便颇为好奇。查阅一番资料,却也有不少讨论……

MDN中(参见:语法和数据类型JavaScript数据类型和数据结构),将数据类型定义为六种原始类型:Boolean、Null、Undefined、Number、String、Symbol,以及Object类型。而cnblogs的一篇文章却有着另一番较为详尽的讨论:JavaScript中“基本类型”之争。其结论此处不再赘述,可点击链接详细了解。此处,针对浏览器的类型判断,作一补充。见下表:

  typeof Object.prototype.toString.call() constructor
Array object [object Array] Array
Boolean boolean [object Boolean] Boolean
Date object [object Date] Date
Function function [object Function] Function
Number number [object Number] Number
Object object [object Object] Object
RegExp object [object RegExp] RegExp
String string [object String] String
undefined undefined [object Undefined] -(报错)
null object [object Null] -(报错)
NaN number [object Number] Number
Symbol symbol [object Symbol] Symbor

如上,实际上,对于函数的类型判断,typeof返回function,理应作为一种数据类型,甚至可作为“基本类型”。而从Object.prototype.toString.call和constructor的结果来看,null和undefined实际上并无constructor,而null甚至直接按object处理。从其各自的含义理解,undefined即未定义,作为一种“泛类型”,而null即传统理解上的“空对象”,是作为对象的一种“空值”。至于NaN,同null,是number的一种空值特例,不足以作为类型存在。

因此,个人理解的数据类型,同《JavaScript语言精髓与编程实践》所持观点一致,即:Undefined、Number、String、Boolean、Function、Object,以及ES6新增的Symbol。至于是否“基本类型”,仁者见仁,智者见智。