原始类型
网上很多说JavaScript的原始(基本)数据类型答案都是错的。
正确的是这样:
原始(基本)数据类型6种:String,Number,Boolean,Null,Undefined,Symbol
最新的 stage 3,有一个新的原始类型 BigInt,等到 stage 4 的时候,就正式成为 Symbol 之后的又一个原始类型。
ES6的官方文档是这么写的:
对象类型
除了原始类型都是对象类型
知识点
1. 原始数据类型存的是值,对象类型存的是地址
2. typeof
对于基本类型,typeof可以准确判断
对于对象类型,typeof只能区分function和非function
3. intanceof
对于基本类型,intanceof无法做出判断(除非写成形如这样:new String('') instanceof String)
对于对象类型,一般情况下能够准确区分,但是如果class的static function Symbol.hasInstance 被改写了,那这个class的instanceof就不一定是想要的结果了
class Person { static [Symbol.hasInstance](val) { return typeof val === 'number' } } 123 instanceof Person; // true
如果有Symbol.toPrimitive,则用这个,否则依次尝试valueOf toString,如果3个方法都不能把对象转成基本类型,就报错
5. 四则运算
加法:如果其中一方是字符串,都转成字符串;如果其中一方,非数字、非字符串,转数字或者字符串
加法以外:都转成数字
6. 比较运算
对象:通过Symbol.toPrimitive来转换
字符串:转化为第一个字符的 unicode
索引