开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情
3.4 数据类型
ECMAScript 有 7 种简单数据类型(原始类型):Undefined、Null、Boolean、Number、String、Symbol 和 BigInt。还有一种复杂数据类型叫 Object。Object 是一种无序名值对的集合。
typeof 操作符
typeof 操作符用来确定任意变量的数据类型。
undefined表示值未定义;boolean表示值为布尔值;string表示值为字符串;object表示值为对象或null;function表示值为函数;symbol表示值为符号;bigint表示值为大整数;typeof null返回的是object。
Undefined 和 Null 的区别
Undefined 类型只有一个值,即特殊值 undefined,表示未定义;
当使用 var 或 let 声明了变量但没有初始化时,就相当于给变量赋予了 undefined 值;
Null 类型同样只有一个值,即特殊值 null,表示空对象;
null 值表示一个空对象指针,这也是给 typeof 传一个 null 会返回"object"的原因:
undefined 值是由 null 值派生而来的;
等于操作符(==)比较 null 和 undefined 始终返回 true。全等于则为 false。
null == undefined // true
null === undefined // false
Symbol 和 BigInt(ES6 新增的数据类型)
Symbol 代表创建后独一无二且不可变的数据类型,它主要是为了解决可能出现的全局变量冲突的问题。
BigInt 是一种数字类型的数据,它可以表示任意精度格式的整数,使用 BigInt 可以安全地存储和操作大整数,即使这个数已经超出了 Number 能够表示的安全整数范围。
Boolean 类型
Boolean(布尔值)类型有两个字面值:true 和 false;
下表总结了不同类型与布尔值之间的转换规则 ⬇️:
| 数据类型 | 转换为 true 的值 | 转换为 false 的值 |
|---|---|---|
| Boolean | true | false |
| String | 非空字符串 | ""(空字符串) |
| Number | 非零数值(包括无穷值) | 0、NaN |
| Object | 任意对象 | null |
| Undefined | NaN(不存在) | undefine |
Number 类型
八进制第一位数必须是 0,数值在 0 ~ 7 之间;十六进制前缀必须是 0x(区分大小写),数值在 (0 ~ 9 以 及 A ~ F)之间;
存储浮点值使用的内存空间是存储整数值的两倍;
在小数点后面没有数字的情况下,数值就会变成整数;
科学记数法的格式要求是一个数值(整数或浮点数)后跟一个大写或小写的字母 e,再加上一个要乘的 10 的多少次幂。例如 0.000 000 000 000 000 03。这个数值用科学记数法 可以表示为 3e-17。
NaN 和 isNaN() 函数
NaN 意思是没有数值(Not a Number),用于表示本来要返回数值的操作失败了(不抛出错误)。
NaN 不等于包括 NaN 在内的任何值。
console.log(NaN == NaN); // false
console.log(NaN !== NaN); // true
ECMAScript 提供了 isNaN()函数。该函数接收一个参数,可以是任意数据类型,然后判断这个参数是否“不是数值”。把一个值传给 isNaN()后,该函数会尝试把它转换为数值。
任何不能转换为数值的值都会导致这个函数返回true。
console.log(isNaN(NaN)); // true
console.log(isNaN(10)); // false,10 是数值
console.log(isNaN("10")); // false,可以转换为数值 10
console.log(isNaN("blue")); // true,不可以转换为数值
console.log(isNaN(true)); // false,可以转换为数值 1
3 个函数可以将非数值转换为数值:Number()、parseInt()和 parseFloat()。
Number()函数基于如下规则执行转换:
- 布尔值,
true转换为1,false转换为0。 - 数值,直接返回。
null,返回0。undefined,返回NaN。- 字符串:有数值返回数值;其他有效进制转换为十进制;空字符串返回
0。除此之外其他字符均返回NaN。 - 对象,调用
valueOf()方法,并按照上述规则转换返回的值。如果转换结果是NaN,则调用toString()方法,再按照转换字符串的规则转换。
parseInt() 函数也能识别不同的整数格式(十进制、八进制、十六进制)。
parseInt()接收的第二个参数,用于指定底数(进制数);
不传底数参数相当于让 parseInt() 自己决定如何解析,所以为避免解析出错,建议始终传给它第二个参数。
parseFloat() 函数的另一个不同之处在于,它始终忽略字符串开头的零。
parseFloat()只解析十进制值,因此不能指定底数。
如果字符串表示整数(没有小数点或者小数点后面只有一个零),则 parseFloat()返回整数。
String 类型
String(字符串)数据类型表示零或多个 16 位 Unicode 字符序列;
字符串可以使用双引号(")、单引号(')或反引号(``)标示;
两种方式把一个值转换为字符串:
toString()方法:
- toString()方法可见于数值、布尔值、对象和字符串值;
- toString()可以接收一个底数参数,通过传入参数,可以得到数值的二进制、八进制、十六进制,或者其他任何有效基数的字符串表示;
- null 和 undefined 没有 toString()方法。
转型函数 String()方法,直接返回了这两个值的字面量文本。
Object 类型
对象其实就是一组数据和功能的集合;对象通过 new 操作符后跟对象类型的名称来创建。
Object 实例都有如下属性和方法:
constructor:用于创建当前对象的函数。在前面的例子中,这个属性的值就是 Object()函数。hasOwnProperty(*propertyName*):用于判断当前对象实例(不是原型)上是否存在给定的属性。要检查的属性名必须是字符串(如o.hasOwnProperty("name"))或符号。isPrototypeOf(*object*):用于判断当前对象是否为另一个对象的原型。(第 8 章将详细介绍原型。)propertyIsEnumerable(*propertyName*):用于判断给定的属性是否可以使用(本章稍后讨论的)for-in语句枚举。与hasOwnProperty()一样,属性名必须是字符串。toLocaleString():返回对象的字符串表示,该字符串反映对象所在的本地化执行环境。toString():返回对象的字符串表示。valueOf():返回对象对应的字符串、数值或布尔值表示。通常与toString()的返回值相同。