ECMAScript6——Symbol类型

2022-07-27,,

1、初始化

let sym = Symbol();
console.log(typeof sym);  //symbol

2、不会覆盖已有的属性

let s1 = Symbol();
let s2 = Symbol();
let s3 = Symbol('symbol');
console.log(s1 == s2); //false
console.log(s2 == s3); //false

3、重用

let s1 = Symbol.for('s');
let s2 = Symbol.for('s');
let s3 = Symbol('s');
console.log(s1 === s2); //true
console.log(s1 === s3); //false

4、查询全局注册表

let s1 = Symbol.for('s');
console.log(Symbol.keyFor(s1)); //s 

let s2 = Symbol('s');
console.log(Symbol.keyFor(s2)); //undefined

5、使用Symbol变量作为属性

let s1 = Symbol('ss1'),
    s2 = Symbol('ss2');
let o = {
  [s1]: 'ss1 val',
  s3: 'ss3 val',
  s4: 'ss4 val'
}
Object.defineProperty(o, s2, {value: 'ss2 val'});
let s5 = Object.getOwnPropertySymbols(o).find((symbol) => symbol.toString().match(/ss1/))

console.log(Object.getOwnPropertySymbols(o));
//[Symbol(ss1),Symbol(ss2)]
console.log(Object.getOwnPropertyNmaes(o));
//["s3","s4"]
console.log(Object.getOwnPropertyDescriptors(o));
//{s3: {value: "ss3 val", writable: true, enumerable: true, configurable: true}, s4: {value: "ss4 val", writable: true, enumerable: true, configurable: true}, Symbol(ss1): {value: "ss1 val", writable: true, enumerable: true, configurable: true}, Symbol(ss2): {value: "ss2 val", writable: false, enumerable: false, configurable: false}}
console.log(Reflect.ownKeys(o));
//{"s3", "s4", Symbol(ss1), Symbol(ss2)}
console.log(s5);
//Symbol(ss1)

6、Symbol.hasInstance:判断一个对象是否是一个类或者一个方法的实例

function F(){}
let f = new F();
console.log(F[Symbol.hasInstance](f));//true

class S(){}
let s = new S();
console.log(S[Symbol.hasInstance](s));//true

注:
1、Symbol()函数不能用作构造函数,与new关键字一起用。若需使用则需借用Object()函数。

let s1 = Symbol();
let s2 = Object(s1);
console.log(typeof s2); //object

本文地址:https://blog.csdn.net/qq_44675204/article/details/110185981

《ECMAScript6——Symbol类型.doc》

下载本文的Word格式文档,以方便收藏与打印。