Symbol 类型简要

Symbol类型,ES6新增的一种基本数据类型,所定义的类型都是独一无二的,这便能保证锁定已的属性名的唯一性eg:
let s = Symbol();
typeof s // "symbol"

注意,symbol是基本数据类型,故不能使用new操作符定义为对象类型
参数可以是字符串,可以是对象,若是对象的时候,通过toString后将对象转化为字符串然后再转为symbol值
由于symbol值得唯一性,故即便是相同参数的symbol的值也是不等的
symbol值不能参与运算,但可显式的转换为字符串eg:
let s = Symbol('hello')
String(s) // "Symbol(hello)"
Boolean(s) // true
symbol值作为对象中的键值 eg:
let s = Symbol('a')
let o = {
[s]:'hello'
}
o[s] // "hello"

一般可以用于常量的定义,对于键值不会受到遍历影响,不会出现在遍历中,但可以通过Object.getOwnPropertySymbols来获取到symbol作为属性名的一个数组
Symbol.for 可以将之前的symbol值赋值为传递过来的值,若之前已经定义过,则返回的值与之前的值相同eg:
let s1 = Symbol.for('foo');
let s2 = Symbol.for('foo');

s1 === s2 // true
for 会在调用时先检查给定的key是否存在,存在则返回,不存在,则新建一个symbol值
通过for来登记的名字是属于全局环境的,在不同的iframe都能够取到同一个值
Symbol.toStringTag 用来定制toString后面的tag字符串,eg:


// 例一
({[Symbol.toStringTag]: 'Foo'}.toString())
// "[object Foo]"

// 例二
class Collection {
  get [Symbol.toStringTag]() {
    return 'xxx';
  }
}
let x = new Collection();
Object.prototype.toString.call(x) // "[object xxx]"
Symbol.unscopables § ⇧
对象的Symbol.unscopables属性,指向一个对象。该对象指定了使用with关键字时,哪些属性会被with环境排除 eg:
Array.prototype[Symbol.unscopables]
// {
//   copyWithin: true,
//   entries: true,
//   fill: true,
//   find: true,
//   findIndex: true,
//   includes: true,
//   keys: true
// }

Object.keys(Array.prototype[Symbol.unscopables])
// ['copyWithin', 'entries', 'fill', 'find', 'findIndex', 'includes', 'keys']
// 没有 unscopables 时
class MyClass {
  foo() { return 1; }
}

var foo = function () { return 2; };

with (MyClass.prototype) {
  foo(); // 1
}

// 有 unscopables 时
class MyClass {
  foo() { return 1; }
  get [Symbol.unscopables]() {
    return { foo: true };
  }
}

var foo = function () { return 2; };

with (MyClass.prototype) {
  foo(); // 2
}

百度未收录
分享