阮一峰的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。至于是否“基本类型”,仁者见仁,智者见智。