细说数据类型
内存分配和数据类型
??简单来说,JavaScript 引擎中的内存可以分为两种:堆区 和栈区 。
??JavaScript 中的数据类型就可分为两大种:原始数据类型 和引用数据类型 。原始数据类型存储在堆区,引用数据类型的指针存储在堆区,数据存储在栈区。
??原始数据类型又称基本数据类型,它包括Undefined 、Null 、Boolean 、String 、Number 、Symbol 、Bigint 等数据类型,其中Symbol 和Bigint 分别是 ES6 和 ES 11 才提出的。
??引用数据类型只有一种就是Object 对象类型,为了方便理解,再分成Array 、Function 和普通对象Object 。
typeof 操作符
??因为 ECMAScript 的类型系统是松散的,所以需要一种手段来确定任意变量的数据类型。 typeof 操作符就是为此而生的。 对一个值使用 typeof 操作符会返回下列字符串之一:
undefined 表示值未定义;
boolean 表示值为布尔值;
string 表示值为字符串;
number 表示值为数值;
object 表示值为对象(而不是函数)或 null;
function 表示值为函数;
symbol 表示值为符号;(ES6 提出)
bigint 表示值为大整数。(ES11 提出)
var demo;
console.log(typeof (demo));
console.log(typeof (true));
console.log(typeof (123));
console.log(typeof ("123"));
??实际上,因为 typeof 是一个操作符而不是函数,可以不需要() ,但是不加() 容易让程序产生误解,所以最佳实践是添加() 。
Undefined 数据类型
??Undefined 类型只有一个值,就是特殊值undefined 。当使用var 或let 声明了变量但没有初始化时,就相当于给变量赋予了undefined 值:
var demo;
console.log(demo == undefined);
console.log(typeof (demo));
??一般来说,永远不用显式地给某个变量设置undefined 值。字面值undefined 主要用于比较,而且在 ECMA-262第 3 版之前是不存在的。增加这个特殊值的目的就是为了正式明确空对象指针(null)和未初始化变量的区别。
举个例子:
let demo;
console.log(demo);
console.log(age);
补充:
let demo;
console.log(typeof (demo));
console.log(typeof (age));
??无论是声明还是未声明, typeof 返回的都是字符串"undefined" 。逻辑上讲这是对的,因为虽然严格来讲这两个变量存在根本性差异, 但它们都无法执行实际操作。
PS: ??即使未初始化的变量会被自动赋予 undefined 值,但仍然建议在声明变量的同时进行初始化。 ??这样,当typeof 返回"undefined" 时,你就会知道那是因为给定的变量尚未声明,而不是声明了但未初始化(实际上使用未声明的变量会直接报错,除非声明提升)。
Null 类型
??Null 类型同样只有一个值,即特殊值 null 。逻辑上讲, null 值表示一个空对象指针,这也是给 typeof 传一个 null 会返回"object" 的原因:
var demo = null;
console.log(typeof (demo));
Boolean 类型
??Boolean(布尔值)类型是 ECMAScript 中使用最频繁的类型之一,有两个字面值:true 和 false 。
??注意:布尔值字面量 true 和 false 是区分大小写的,是两个严格的关键字,因此 True 和False(及其他大小混写形式)是有效的标识符,但不是布尔值。
Boolean() 布尔转换
??要将一个其他类型的值转换为布尔值,可以调用特定的Boolean() 转型函数:
let demo = "Hello world!";
let demoAsBoolean = Boolean(demo);
console.log(demoAsBoolean);
??Boolean() 转型函数可以在任意类型的数据上调用,而且始终返回一个布尔值。什么值能转换为true 或 false 的规则取决于数据类型和实际的值。
??下表总结了不同类型与布尔值之间的转换规则。
数据类型 | 转换为 true 的值 | 转换为 false 的值 |
---|
Boolean | true | false | String | 非空字符串 | “”(空字符串) | Number | 非零数值(包括无穷值) | 0、 NaN(参见后面的相关内容) | Object | 任意对象 | null | Undefined | N/A(不存在) | undefined |
理解以上转换非常重要,因为像 if 等流程控制语句会自动执行其他类型值到布尔值的转换。
|