数据类型

176 阅读7分钟

JS中数据类型主要分:原始值类型和引用类型两个大类。

  • 原始值类型(值类型/基本数据类型)

    • Number 数字
    • Boolean 布尔
    • String 字符串
    • Null 空对象指针
    • Undefined 未定义
    • Symbol 唯一值
    • Bigint 大数
  • 引用类型(对象类型)

    • 标准普通对象
    • 标准特殊对象: Array 、RegExp、Date、Math、Error ...
    • 非标准特殊对象:Number 、String 、Boolean
    • 可调用(执行)对象:Funciton

非标准特殊对象的特性:基于构造函数或 Object 创造出的 原始值的对象类型的格式信息,数据类型属于对象类型。 可调用(执行)对象的特点是实现了 call() 方法。

Undefined 类型

Undefined 类型只有一个值,就是特殊值 undefined,表示未定义的。

undefined 是一个假值。

在对未初始化的变量调用 typeof 时,返回的结果是"undefined"

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

let message;
console.log(message == undefined); // true

Null 类型

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

用等于操作符(==)比较 null 和 undefined 始终返回 true。

null 是一个假值。

任何时候,只要变量要保存对象,而当时又没有那个对象可保存,就要用 null 来填充该变量。

Number 数字

Number 类型使用 IEEE 754 格式表示整数和浮点值(在某些语言中也叫双精度值)。

整数

不同的数值类型相应地也有不同的数值字面量格式。

  • 一般都是用的十进制整数。
  • 整数也可以用八进制或十六进制字面量表示。
    • 八进制字面量,第一个数字必须是零(0),数值 0~7
    • 十六进制字面量,必须加前缀 0x,数字是(09及AF),A~F不区分大小写
  • 在进行算术计算时,八进制和十六进制表示的数值,都将被转换成十进制整数。

浮点值

**浮点值的特点:**数值中必须包含小数点,而且小数点后面必须至少有一个数字。

科学记数法

对于非常大或非常小的数值,浮点值可以用科学记数法来表示。

科学记数法用于表示一个应该乘以 10 的给定次幂的数值。

let floatNum = 3.125e7; // 等于 31250000 即

这种表示法实际上相当于说:“以 3.125 作为系数,乘以 10 的 7 次幂。”

精准度问题 浮点值的精确度最高可达 17 位小数,但在算术计算中远不如整数精确。例如,0.1 加 0.2 得到的不 是 0.3,而是 0.300 000 000 000 000 04。

console.log( 0.1+ 0.2 === 0.3 ); // false

值的范围

ECMAScript 可以表示的:

  • 最小数值保存在 Number.MIN_VALUE
  • 最大数值保存在 Number.MAX_VALUE

如果数值结果超出了 JavaScript 可以表示的范围,那么这个数值会被自动转换为 Infinity(无 穷)值。

  • 任何无法表示的负数以-Infinity(负无穷大)表示
  • 任何无法表示的正数以 Infinity(正无穷大)表示。
  • 要检测一个值是不是有限大,可以使用 isFinite()函数

特殊的数值 NaN

NaN(Not a Number):意思是“不是数值”,用于表示本来要返回数值的操作失败了(而不是抛出错误)。

  • 0 除任意数值会返回 NaN
  • 0、+0 或0 相除会返回 NaN

NaN 有几个独特的属性:

  • 任何涉及 NaN 的操作始终返回 NaN
  • NaN 不等于包括 NaN 在内的任何值。
console.log(NaN == NaN); // false

isNaN()函数

作用:
isNaN()函数,接收一个参数,可以是任意数据类型,然后判断这个参数是否“不是数值”。

返回值:
不是数值,返回 true;是数值,返回 false 。

机制:
把一个值传给 isNaN()后,如这个值不是 Number 类型,该函数会尝试把它转换为数值。

  • 任何不能转换为数值的值都会导致这个函数返回 true 。
  • 可以直接转换成数值的这个函数返回 false。
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

Object.is(NaN,NaN); // true

Boolean 类型

  • 只有两个字面值:true 和 false。
  • 所有其他 ECMAScript 类型的值都有相应布尔值的等价形式。

String 类型

String(字符串)数据类型表示零或多个 16 位 Unicode 字符序列。

字符串可以使用双引号(")、单引号(')或反引号(`)标示。但不能混用,以某种引号作为字符串开头,必须仍然以该种引号作为字符串结尾,否则会报语法错误。

字符串的特点: ECMAScript 中的字符串是不可变的,一旦创建,它们的值就不能变了。要修改某个变量中的字符串值,必须先销毁原始的字符串,然后将包含新值的另一个字符串保存到该变量

Symbol 类型

Symbol(符号)是 ECMAScript 6 新增的数据类型。

符号的特点 符号是原始值,且符号实例是唯一、不可变的。

符号的基本用法

  • 符号需要使用 Symbol()函数初始化。
  • 调用 Symbol() 函数时,也可以传入一个字符串参数作为对符号的描述
  • Symbol()函数不能与 new 关键字一起作为构造函数使用。
  • 如果想使用符号包装对象,可以借用 Object()函数

符号的使用场景

  1. 给对象设置唯一的属性。「对
  2. 象的属性名类型:字符串 & Symbol类型」
  3. redux/vuex公共状态管理的时候,派发的行为标识就可以基于Symbol类型进行宏管理
  4. Symbol.hasInstance \ Symbol.toStringTag \ Symbol.toPrimitive \ Symbol.iterator...很多JS底层的处理机制,就是基于这些属性方法实现的

Symbol.toPrimitive 属性的属性特性:

  • writable false
  • enumerable false
  • configurable false

案例:符号的唯一性体现

  • Symbol() 执行一次生成一个唯一值
  • 永远不和其他值相等,即使是另外一个 Symbol()
  • 即使加了相同的 description
console.log(Symbol() == Symbol()); // false
console.log(Symbol() === Symbol()); // false
console.log(Symbol('AA') === Symbol('AA')); //false

案例:用符号为对象设置唯一属性

// 1. 正确用法
let key = Symbol();
let obj = {
name: 'zhufeng',
age: 12,
[key]: 100
};
console.log(obj[key]); //100

// 2. 错误用法
let obj = {
    name: 'zhufeng',
    age: 12,
    [Symbol()]: 100
};
console.log(obj[Symbol()]); // undefined
// Symbol() 会生成一个新的唯一值
// 获取的时候,是获取一个新的唯一值的属性值

案例:获取某个对象所有Symbol类型的私有属性

  • Object.getOwnPropertySymbols(obj)
  • 返回的结果是个数组
let obj = {
    name: 'zhufeng',
    age: 12,
    [Symbol()]: 100
};
// 获取当前对象所有Symbol类型的私有属性,返回的结果是个数组
let symbolKeys = Object.getOwnPropertySymbols(obj);
console.log(symbolKeys); // [Symbol()]

symbolKeys.forEach(key => {
    console.log(obj[key]);
});
// 100

案例:Symbol类型的私有属性,不能被枚举

let obj = {
    name: 'zhufeng',
    age: 12,
    [Symbol()]: 100
};

for(key in obj)  {
    console.log(key+" --> "+ obj[key]);
}
// name --> zhufeng
// age --> 12

BigInt 大数

**特点:**数字后面加个n即使大数类型

console.log(typeof 10n); // 'bigint'
console.log(typeof 10); // 'number'

使用场景: JS中在进行数学运算的时候,如果计算的数值超过最大/最小安全数字,计算出来的结果很可能是不准确的「如果遇到这样的需求,则一定会出问题:服务器端数据库存储,是有longInt类型,服务器返回给客户端的值也是超过安全数字的{一般会以字符串的方式返回,这样保证返回途中数字的安全性},此时我们去进行数学运算,结果可能就”崩“了」;

解决办法:把服务器返回的值变为bigint格式的,然后进行运算「保证了运算的准确性{进行运算的另外一个值也应该是bigint类型的}」;把运算的结果,再次变为字符串,发送给服务器即可!

Object 类型

ECMAScript 中的 Object 对象其实就是一组数据和功能的集合

ECMAScript 中的 Object 也是派生其他对象的基类。

每个 Object 实例都有如下属性和方法。

  • constructor:指向当前实例的构造函数,即用于创建当前对象的函数。
  • hasOwnProperty(propertyName):用于判断当前对象实例上是否存在给定的属性(私有)。
  • propertyIsEnumerable(propertyName):用于判断给定的属性是否可以使用 for-in 语句枚举。
  • toString():返回对象的字符串表示。
  • valueOf():返回对象对应的字符串、数值或布尔值表示。

关联笔记

数据类型转换 数据类型检测