【前端知识】JavaScript——Symbol类型

【前端知识】JavaScript——Symbol类型

  1. 什么是Symbol(符号)类型?

​ Symbol是原始值,且Symbol实例是唯一、不可变的。Symbol的用途是确保对象属性使用唯一标识符,不会发生属性冲突的危险。Symbol创建唯一记号,进而用作非字符串形式的对象属性。

  1. 如何使用Symbol?
function foo() {
    let sym = Symbol();
    console.log(typeof sym);
}
foo(); // symbol
  1. 全局符号注册表
// 创建新符号
let newSymbol = Symbol.for('foo'); 
console.log(typeof newSymbol); // symbol
// 重用已有符号
let copySymbol = Symbol.for('foo'); 
console.log(newSymbol === copySymbol); // true

// 即使采用相同的符号描述,在全局注册表中定义的符号跟使用 Symbol()定义的符号也并不等同
let localSymbol = Symbol('foo'); 
let globalSymbol = Symbol.for('foo'); 
console.log(localSymbol === globalSymbol); // false

// 查询已注册的符号
let s = Symbol.for('foo'); 
console.log(Symbol.keyFor(s)); // foo

  1. 使用符号作为属性
let s1 = Symbol('foo'), 
    s2 = Symbol('bar'), 
    s3 = Symbol('baz'), 
    s4 = Symbol('qux'); 

// 方式一:
let o = { 
    [s1]: 'foo val' 
}; 
// 这样也可以:o[s1] = 'foo val'; 
console.log(o); // {Symbol(foo): foo val} 

// 方式二:
Object.defineProperty(o, s2, {value: 'bar val'}); 
console.log(o); // {Symbol(foo): foo val, Symbol(bar): bar val} 

// 方式三:
Object.defineProperties(o, { 
    [s3]: {value: 'baz val'}, 
    [s4]: {value: 'qux val'} 
}); 
console.log(o); 
// {Symbol(foo): foo val, Symbol(bar): bar val, 
// Symbol(baz): baz val, Symbol(qux): qux val}
  1. 常用内置符号

​ 内置符号是全局函数 Symbol 的普通字符串属性,指向一个符号的实例。所有内置符号属性都是不可写、不可枚举、不可配置的

  1. Symbol.asyncIterator

​ Symbol.asyncIterator 作为一个属性表示“一个方法,该方法返回对象默认的 AsyncIterator。由 for-await-of 语句使用”。for-await-of 循环会利用这个函数执行异步迭代操作。循环时,它们会调用以Symbol.asyncIterator为键的函数,并期望这个函数会返回一个实现迭代器 API 的对象。

  1. Symbol.hasInstance

​ Symbol.hasInstance 作为一个属性表示“一个方法,该方法决定一个构造器对象是否认可一个对象是它的实例。由 instanceof 操作符使用”。instanceof 操作符可以用来确定一个对象实例的原型链上是否有原型。

  1. Symbol.isConcatSpreadable

​ Symbol.isConcatSpreadable 作为一个属性表示“一个布尔值,如果是 true,则意味着对象应该用 Array.prototype.concat()打平其数组元素”

  1. Symbol.iterator

​ Symbol.iterator 作为一个属性表示“一个方法,该方法返回对象默认的迭代器。由 for-of 语句使用”。换句话说,这个符号表示实现迭代器 API 的函数。

  1. Symbol.match

​ Symbol.match 作为一个属性表示“一个正则表达式方法,该方法用正则表达式去匹配字符串。由 String.prototype.match()方法使用”

  1. Symbol.replace

​ Symbol.replace 作为一个属性表示“一个正则表达式方法,该方法替换一个字符串中匹配的子串。由 String.prototype.replace()方法使用”。

  1. Symbol.search

​ Symbol.search 作为一个属性表示“一个正则表达式方法,该方法返回字符串中匹配正则表达式的索引。由 String.prototype.search()方法使用”

  1. Symbol.species

​ Symbol.species 作为一个属性表示“一个函数值,该函数作为创建派生对象的构造函数”。这个属性在内置类型中最常用,用于对内置类型实例方法的返回值暴露实例化派生对象的方法。

  1. Symbol.split

​ Symbol.split 作为一个属性表示“一个正则表达式方法,该方法在匹配正则表达式的索引位置拆分字符串。由 String.prototype.split()方法使用”。

  1. Symbol.toPrimitive

​ Symbol.toPrimitive 作为一个属性表示“一个方法,该方法将对象转换为相应的原始值。由 ToPrimitive 抽象操作使用”。

  1. Symbol.toStringTag

​ Symbol.toStringTag 作为一个属性表示“一个字符串,该字符串用于创建对象的默认字符串描述。由内置方法 Object.prototype.toString()使用”。

  1. Symbol.unscopables

​ Symbol.unscopables 作为一个属性表示“一个对象,该对象所有的以及继承的属性,都会从关联对象的 with 环境绑定中排除”。

你可能感兴趣的:(前端知识,JavaScript,前端,javascript,开发语言)