目录
-
- 数据分类
-
Symbol 数据类型
-
- 概述
-
作为属性名
-
属性名的遍历
-
定义一个私有属性
-
定义一个私有方法
-
Symbol.for(),Symbol.keyFor()
-
其他方法详解
-
BigInt 数据类型
-
- 为什么要引入?
-
BigInt 对象
-
基本类型: 直接存取基本类型
-
字符串
-
数值
-
布尔类型
-
null
-
undefined
-
Symbol
(ES6) -
BigInt
(ES2020) -
复杂类型: 通过引用的方式存取复杂类型
-
对象
-
数组
-
函数
回到顶部 目录
概述
为什么要引入该数据类型:
ES5 的对象属性名都是字符串,这容易造成属性名的冲突
Symbol:表示独一无二的值,最大的用法是用来定义对象的唯一属性名,而且它是一个值类型。
let sym1 = Symbol();
let sym2 = Symbol();
console.log(sym1) // Symbol()
console.log(typeof sym1) // ‘symbol’
console.log(sym1 == sym2) // false
console.log(sym1 === sym2) // false
Symbol函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述
主要是为了在控制台显示,或者转为字符串时,比较容易区分
let s1 = Symbol(‘foo’);
let s2 = Symbol(‘bar’);
console.log(s1) // Symbol(foo)
console.log(s2) // Symbol(bar)
console.log(s1.toString()) // “Symbol(foo)”
console.log(s2.toString() )// “Symbol(bar)”
-
Symbol 值不能与其他类型的值进行运算,会报错
-
Symbol 值可以显式转为字符串、也可以转为布尔值,但是不能转为数值
-
在ES2019中增加了一个description可用于读取Symbol的描述
.description
作为属性名
Symbol具有唯一性,用于对象的属性名,就能保证不会出现同名的属性
const my = Symbol();
const s = Symbol();
// 1
const a = {};
amy = ‘hello’;
// 2
const b = {
s { … }
};
// 3
const c = {};
Object.defineProperty(a, my, {value: ‘hello’});
-
Symbol 值作为对象属性名时,不能用点运算符
-
Symbol 值作为属性名时,该属性还是公开属性,不是私有属性
属性名的遍历
Symbol 作为属性名不会被查询的几种方法:
-
for…in、for…of循环中
-
Object.keys()
-
Object.getOwnPropertyNames()
-
JSON.stringify()
Symbol 作为属性名可以被获取的方法:
- Object.getOwnPropertySymbols()方法
该方法返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值
- Reflect.ownKeys()方法可以返回所有类型的键名,包括常规键名和 Symbol 键名
回到顶部 目录
定义一个私有属性
let size = Symbol(‘size’);
class Count{
constructor(){
this[size] = 0;
}
add(item){
this[this[size]] = item;
this[size] ++;
}
static sizeOf(instance){
return instance[size];
}
}
let x = new Count();
console.log(Count.sizeOf(x));// 0
x.add(‘foo’);
console.log(Count.sizeOf(x));// 1
console.log(Object.keys(x)); // [“0”]
console.log(Object.getOwnPropertyNames(x));// [“0”]
console.log(Object.getOwnPropertySymbols(x));// [Symbol(size)]
// 对象x的size属性是一个 Symbol 值,所以Object.keys(x)、Object.getOwnPropertyNames(x)都无法获取它。这就造成了一种非私有的内部方法的效果
最后
其实前端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
这里再分享一个复习的路线:(以下体系的复习资料是我从各路大佬收集整理好的)
《前端开发四大模块核心知识笔记》
最后,说个题外话,我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。