新增数据类型和结构
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转化为 0true转化为 1undefined和unll都会报错
静态方法
| 方法名 | 描述 |
|---|---|
BigInt.asUintN(width, BigInt) |
以 的精度无符号数存储的 BigInt |
BigInt.asIntN(width, BigInt) |
以 的精度有符号数存储的 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...in、for...of、Object.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() 方法一样,值相当于数组的元素,键相当于数组的下标 |

Comments NOTHING