JavaScript 数据类型
JavaScript 数据类型
简要介绍
ES5 之前,JavaScript 中有 6 种数据类型:数字(number)、字符串(string)、布尔值(boolean)、未定义(undefined)、空值(null)、对象(Object)。其中对象类型又包括:数组(Array)、函数(Function)、正则(RegExp)、日期(Date)和数学(Math)等。
ES6 及之后,新增了 Symbol、Bigint(ES2020 新增)基础类型,一共 8 种。

当前生产环境大部分都会借助 ES6 的特性去开发应用,然后借助 babel 转换,webpack 模块化打包最终生成的待发布的项目。
语言类型

JavaScript 是一种弱类型的、动态的语言。
- 弱类型,意味着你不需要告诉 JavaScript 引擎这个或那个变量是什么数据类型,JavaScript 引擎在运行代码的时候自己会计算出来。
- 动态,意味着你可以使用同一个变量保存不同类型的数据。
JS 数据类型划分
按储存/堆栈/可变类型
- 基本/不可变类型(栈 stack,7 种):数字(Number)、字符串(String)、布尔值(Boolean)、Undefined、Null、Symbol、Bigint。基本数据类型是按值访问由高向低分配,栈内存最大是 8MB(超出报栈溢出) ,String:是特殊的栈内存(向高分配大小不定),由开发者分配。
- 引用/可变类型(堆 heap):对象(Object)。引用类型数据在栈内存中保存的实际上是对象在堆内存中的引用地址(指针),向高分配,系统自动分配。
区别:
- 基本类型值:指的是保存在栈内存中的简单数据段;
- 引用类型值:指的是那些保存在堆内存中的对象,意思是,变量中保存的实际上只是一个指针,这个指针指向内存堆中实际的值

基本包装类型
基本类型和基本包装类型最显著的区别在于创建时候不同,基本包装类型需要一个 new 来创建。请看下面的例子:
1、字面量写法:
var box = "front"; //字面量
box.name = "前端"; //无效属性
box.age = function () {
//无效方法
return 100;
};
console.log(box); //front
console.log(box.substring(2)); // ont
console.log(typeof box); //string
console.log(box.name); //undefined
console.log(box.age()); // Uncaught TypeError: box.age is not a function
2、new 运算符写法:
var box = new String("front"); //new 运算符
box.name = "前端"; //有效属性
box.age = function () {
//有效方法
return 100;
};
console.log(box); // String {"front", name: "前端", age: ƒ}
console.log(box.substring(2)); // ont
console.log(typeof box); //object
console.log(box.name); //前端
console.log(box.age()); //100
以上字面量声明和 new 运算符声明很好的展示了他们之间的区别。但有一定还是可以肯定的,那就是不管字面量形式还是 new 运算符形式,都可以使用它的内置方法。并且 Boolean 和 Number 特性与 String 相同,三种类型可以成为基本包装类型。
按是否有方法类型
- 有方法类型:数字(number)、字符串(string)、布尔值(boolean)、对象(object)、Symbol、Bigint
- 无方法类型:undefined、null
最大最小值
String 用于表示文本数据。ECMA 规定其有最大长度是 253 - 1。
Number 类型有 18437736874454810627(即 264-253+3) 个值,由 IEEE754 限制范围。Number 类型基本符合 IEEE 754-2008 规定的双精度浮点数规则,但是 JavaScript 为了表达几个额外的语言场景(比如不让除以 0 出错,而引入了无穷大的概念),规定了几个例外情况:
- NaN,占用了 9007199254740990,这原本是符合 IEEE 规则的数字;
- Infinity,无穷大;
- -Infinity,负无穷大。
另外,值得注意的是,JavaScript 中有 +0 和 -0,在加法类运算中它们没有区别,但是除法的场合则需要特别留意区分,“忘记检测除以-0,而得到负无穷大”的情况经常会导致错误,而区分 +0 和 -0 的方式,正是检测 1/x 是 Infinity 还是 -Infinity。
Array 类型最大值为:232-1,Math.pow(2,32)-1 即 4294967295。
typeof 类型检测

请注意typeof null是特例,函数是一等公民有对象类型具有的属性和功能。
typeof null; // "object"
typeof Object; // "function"
- 使用 typeof 检测 Null 类型时,返回的是 Object。这是当初 JavaScript 语言的一个 Bug,一直保留至今,之所以一直没修改过来,主要是为了兼容老的代码。
- Object 类型比较特殊,它是由上述 7 种类型组成的一个包含了 key-value 对的数据类型。
- typeof 只能判断基本类型、function 和是否引用类型。
typeof [1, 2]结果是object,结果中没有array这一项,引用类型除了function其他的全部都是object。
图片总结

对象值转换约定
JavaScript 约定,所有“对象 -> 值”的转换结果要尽量地趋近于 string、number 和 boolean 三者之一。不过这从来都不是“书面的约定”,而是因为 JavaScript 在早期的作用,就是用于浏览器上的开发,而:
- 浏览器可以显示的东西,是 string;
- 可以计算的东西,是 number;
- 可以表达逻辑的东西,是 boolean。
因此,在一个“最小的、可以被普通人理解的、可计算的程序系统中”,支持的“值类型数据”的最小集合,就应该是这三种。