💙《JavaScript高级程序设计》 | 语言基础(中篇)

97 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情

3.4 数据类型

ECMAScript 有 7 种简单数据类型(原始类型):Undefined、Null、Boolean、Number、String、Symbol 和 BigInt。还有一种复杂数据类型叫 ObjectObject 是一种无序名值对的集合。 typeof 操作符


typeof 操作符用来确定任意变量的数据类型。

  • undefined 表示值未定义;
  • boolean 表示值为布尔值;
  • string 表示值为字符串;
  • object 表示值为对象或 null
  • function 表示值为函数;
  • symbol 表示值为符号;
  • bigint 表示值为大整数;
  • typeof null 返回的是 object

Undefined 和 Null 的区别


Undefined 类型只有一个值,即特殊值 undefined,表示未定义;

当使用 varlet 声明了变量但没有初始化时,就相当于给变量赋予了 undefined 值;

Null 类型同样只有一个值,即特殊值 null,表示空对象;

null 值表示一个空对象指针,这也是给 typeof 传一个 null 会返回"object"的原因:

undefined 值是由 null 值派生而来的;

等于操作符(==)比较 nullundefined 始终返回 true。全等于则为 false

null == undefined // true
null === undefined // false

Symbol 和 BigInt(ES6 新增的数据类型)


Symbol 代表创建后独一无二且不可变的数据类型,它主要是为了解决可能出现的全局变量冲突的问题。

BigInt 是一种数字类型的数据,它可以表示任意精度格式的整数,使用 BigInt 可以安全地存储和操作大整数,即使这个数已经超出了 Number 能够表示的安全整数范围。

Boolean 类型


Boolean(布尔值)类型有两个字面值:truefalse

下表总结了不同类型与布尔值之间的转换规则 ⬇️:

数据类型转换为 true 的值转换为 false 的值
Booleantruefalse
String非空字符串""(空字符串)
Number非零数值(包括无穷值)0、NaN
Object任意对象null
UndefinedNaN(不存在)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 转换为 1false 转换为 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() 的返回值相同。