x-note
Search…
ECMAScript 6 Symbol
ES6 引入了新的基本数据类型Symbol,对于每一个Symbol的实例都是唯一的。
1
Symbol('A') === Symbol('A'); // false
Copied!
对象的属性名现在可以是三种类型:
  • 数字类型
  • 字符串类型
  • Symbol实例
1
const obj = {
2
[1]: 1,
3
['a']: 'a',
4
[Symbol('A')]: 'symbol'
5
}
Copied!
Symbol作为属性名,该属性不会被for...infor...of遍历,Object.keys()Object.getOwnPropertyNames()JSON.stringify()也无法返回。只能通过Object.getOwnPropertySymbols()方法,获取指定对象的所Symbol属性名。
Symbol 函数不能使用 new 命令
1
const symbolA = new Symbol('A'); // TypeError: Symbol is not a constructor
Copied!
Symbol函数可以接受一个字符串作为参数作为对Symbol实例的描述,仅仅是描述。如果接受一个对象则会调用该对象的toString()方法。
1
const strSymbol = Symbol('A'); // Symbol(A)
2
const numSymbol = Symbol(1); // Symbol(1)
3
const boolSymbol = Symbol(true); // Symbol(true)
4
const obj = {
5
toString() {
6
return 'obj to string'
7
}
8
}
9
const objSymbol = Symbol(obj); // Symbol(obj to string)
10
const objSymbol2 = Symbol({}); // Symbol([object Object])
11
const arrSymbol = Symbol([1, 2]); // Symbol(1,2)
Copied!
Symbol实例不能转换成数值,所以不能进行数值运算
1
const symbol1 = Symbol(1);
2
Number(symbol1); // TypeError: Cannot convert a Symbol value to a number
3
let n = 1 + symbol1; // TypeError: Cannot convert a Symbol value to a number
Copied!
Symbol可以转为字符串或布尔值
1
const symbol1 = Symbol(1);
2
Boolean(symbol1); // true
3
String(symbol1); // "Symbol(1)"
Copied!

相关API

Symbol.for
接受一个字符串,如果给定的 key 已经存在则返回现有的Symbol对象,如果不存在则返回一个新的Symbol实例.
1
const symbolA1 = Symbol('A'); // Symbol(A)
2
const symbolA2 = Symbol.for('A'); // Symbol(A)
3
const symbolA3 = Symbol.for('A'); // Symbol(A)
4
5
symbolA1 === symbolA2; // false
6
symbolA2 === symbolA3; // true
Copied!
Symbol.for()Symbol()都能够产生新的Symbol。不过,Symbol.for()产生的实例会登记在全局环境中供搜索。
Symbol.keyFor
返回一个已登记的Symbol类型值的key
1
var symbolA = Symbol.for('A');
2
Symbol.keyFor(symbolA); // "A"
3
var symbolB = Symbol("B");
4
Symbol.keyFor(symbolB) // undefined
Copied!
Symbol.hashInstance
Symbol.hasInstance()属性指向一个内部方法。当其他对象使用instanceof运算符,判断是否为该对象的实例时,会调用这个方法。
1
class MyClass {
2
[Symbol.hasInstance](foo) {
3
return foo instanceof Array;
4
}
5
}
6
[1, 2, 3] instanceof new MyClass() // true
Copied!
Symbol.isConcatSpreadable
对象使用Array.prototype.concat()时,是否允许展开
1
let arr1 = ['c', 'd'];
2
['a', 'b'].concat(arr1, 'e'); // ['a', 'b', 'c', 'd', 'e']
3
arr1[Symbol.isConcatSpreadable]; // undefined
4
5
let arr2 = ['c', 'd'];
6
arr2[Symbol.isConcatSpreadable] = false;
7
['a', 'b'].concat(arr2, 'e'); // ['a', 'b', ['c','d'], 'e']
8
9
let obj = {length: 2, 0: 'c', 1: 'd'};
10
['a', 'b'].concat(obj, 'e'); // ['a', 'b', obj, 'e']
11
obj[Symbol.isConcatSpreadable] = true;
12
['a', 'b'].concat(obj, 'e'); // ['a', 'b', 'c', 'd', 'e']
Copied!
Copy link
Contents
相关API