03-新增数据类型和结构

nobility 发布于 2022-10-14 02-ES6 2780 次阅读


新增数据类型和结构

BigInt

  • 内部以字符串的形式存储,可以表示任意大的数字,但是不能是小数,所以做除法运算时会像其他语言中的 int 类型数据一样只保留整数部分
  • typeof 返回结果是 bigint
  • 转化成字符串或数值类型时后缀 n 会消失
  • 不能自动转化,所以不能与普通数值直接计算,但是在作为逻辑运算时可以自动转化成布尔值
  • 不能使用 >>> 运算符运算
console.log(0n == 0);   //true
console.log(0n === 0);  //false

console.log(5n / 2n);   //2n

console.log(typeof 0n);   //bigint

console.log(String(0n));   //0
console.log(Number(0n));   //0

console.log(!0n);   //true

创建方式

字面量方式
  • 必须添加 n 后缀
  • 可以有使用 - 号做前缀,但是不能使用 + 号做前缀,否则会报错
  • 同样可以使用各种进制的前缀
函数和构造函数

构造函数与函数形式的用法和返回结果是一样的,只不过是语义不同,函数代表转化,而构造函数代表新生

  • 必须有参数
  • 数字只能是整数,不能是小数,可以使用科学计数法
  • 忽略前后空格,若是全数字字符串转化为数字(支持正负号),有一个非数字字符就会报错,要注意带 n 后缀的字符串和科学计数法的字符串,也是会报错的
  • 空字符串转化为 0
  • false 转化为 0
  • true 转化为 1
  • undefinedunll 都会报错

静态方法

方法名 描述
BigInt.asUintN(width, BigInt) [0,2width1][0,2^{width}-1] 的精度无符号数存储的 BigInt
BigInt.asIntN(width, BigInt) [2width1,2width11][-2^{width-1},2^{width-1}-1] 的精度有符号数存储的 BigInt
BigInt.parseInt(string) 将字符串转化成 BigInt,用法与 Number.parseInt() 一致,但浏览器还未支持
let max = 3n;
console.log(BigInt.asIntN(3, max)); //3n
console.log(BigInt.asIntN(3, max + 1n));    //-4n

max = 3n;
console.log(BigInt.asUintN(2, max)); //3n
console.log(BigInt.asUintN(2, max + 1n));    //0n

Symbol

属于原始数据类型,可以理解为一种特殊的字符串,主要解决为对象添加属性保证不会覆盖掉之前的属性,也就是说该原始数据类型可以作为对象的属性

  • typeof 返回结果是 bigint
  • 是独一无二的
  • 该数据类型的 toString() 方法返回的是定义时的方法中的字符串去掉双引号形式
  • 该原始数据类型无法与任何数据类型直接运算,包括自己
  • 对象属性是该数据类型时,不会被 for...infor...ofObject.keys()Object.getOwnPropertyNames()JSON.stringify() 获取到,只有 ``Object.getOwnPropertySymbols(obj)`才可以取得的
let a = Symbol("a");
let b = Symbol("a");

console.log(a === b);   //false
console.log(typeof a);  //symbol
console.log(a); //Symbol(a)

//console.log( a + a );	//报错
//console.log( a + "" );	//报错

创建方式

通过 Symbol() 函数生成,所以在作为对象的属性时需要用方括号表达式,由于不是字符串在取值时也不能使用点属性的形式,需要用方括号的形式

  • 注意不是构造函数

  • 若参数不是字符串则会先调用该参数的 toString() 方法转化为字符串

let a = Symbol("a");
//let b = new Symbol("b");	//报错,不能使用构造函数方式

let b = Symbol({});
console.log(b);	//Symbol([object Object])

let a = Symbol("a");
let obj = {
	[a]:1
};
console.log(obj.a);   //undefined,此时a是字符串,所以返回undefined
console.log(obj[a]);  //1,此时a是Symbol类型的变量,可以取到

静态方法

方法名 描述
Symbol.for(str) Symbol() 函数类似,都是创建一个 symbol 数据类型的数据,不同的是该方法会先从全局中找有没有该参数的 symbol 已经注册,若没有在创建并注册,若有则返回之前注册的
Symbol.keyFor(symbol) 返回已注册的 symbol 类型的数据,若未注册则返回 undefined
let a = Symbol("a");

console.log(a === Symbol("a")); //false

console.log(a === Symbol.for("a")); //false ,未注册,第一次注册
console.log(Symbol.for("a") == Symbol.for("a"));    //treu  ,已经注册返回注册的

console.log(Symbol.keyFor(Symbol.for("a")));  //a   返回已经注册的symbol的key,也就是描述
console.log(Symbol.keyFor(a));  //undefined 未注册返回undefined

实例属性

属性名 描述
Symbol.prototype.description 返回定义时的字符串描述信息

Set

构造函数

必须使用 new 关键字,否则会报错

参数 描述
无参 创建一个空的 set 集合
一个数组 将数组转化为 set 集合,可以实现数组去重操作,内部使用严格相等且识别 NaN

实例方法

继承自 Object 的 keys()values()entries() 方法,set 集合中键和值是同一个值

方法名 描述
Set.prototype.size 是个属性,返回 set 集合成员数
Set.prototype.add(value) value 添加到该 set 集合中,并返回该 set 集合,所以可以链式调用
Set.prototype.delete(value) value 从 set 集合中删除,成功返回 true
Set.prototype.has(value) 判断该 set 集合中是否有 value 成员
Set.prototype.clear() 清空该 set 集合
Set.prototype.forEach(callback[,thisTar]) 与数组的 forEach() 方法一样,值相当于数组的元素,键相当于数组的下标

Map

继承自 Object 的 keys()values()entries() 方法,map 集合中的键可以存放任意数据类型

构造函数

必须使用 new 关键字,否则会报错

参数 描述
无参 创建一个空的 map 集合
一个元素为 [key,value] 二维数组 将数组转化为 map 集合,内部使用严格相等且识别 NaN

实例方法

方法名 描述
Map.prototype.size 是个属性,返回 map 集合的成员数
Map.prototype.set(key,value) 将键值对添加到该 set 集合中,并返回该 set 集合,所以可以链式调用
Map.prototype.get(key) 通过键获取值,没有就返回 undefined
Map.prototype.has(key) 判断该 map 集合中是否有该键
Map.prototype.delete(key) 通过键删除键值对
Map.prototype.clear() 清空 map 集合
Map.prototype.forEach(callback[,thisTar]) 与数组的 forEach() 方法一样,值相当于数组的元素,键相当于数组的下标
加油啊!即便没有转生到异世界,也要拿出真本事!!!\(`Δ’)/
最后更新于 2022-10-14