ES6学习笔记之Symbol

    xiaoxiao2021-03-25  119

    参考自:http://es6.ruanyifeng.com/#docs/symbol

    概述

    Symbol是ES6新引入的一种原始数据类型。它是JS语言的第7种数据类型。前6中是number、string、boolean、undefined、null、object。 let s = Symbol(); typeof s; // "symbol" Symbol能够产生独一无二的值,避免与之前的代码/其他人的代码产生覆盖。 var s1 = Symbol(); var s2 = Symbol(); s1 == s2; // false Symbol() == Symbol(); // false Symbol不是一个构造函数,所以无法使用new来调用 new Symbol; // TypeError: Symbol is not a constructor Symbol可以接受字符串作为参数,也可以显示转换为字符串和布尔值,但是不能转换为数值。 var s1 = Symbol('s1'); Boolean(s1); // true !s1; //false String(s1); // "Symbol(s1)" s1.toString(); // "Symbol(s1)" Number(s1); // TypeError: Cannot convert a Symbol value to a number

    Symbol作为属性名

    每一个Symbol都是独一无二的,所以作为属性名是非常适合的,不用担心覆盖。有以下三种写法将一个Symbol作为一个属性名。 var s = Symbol(); // 第一种写法 var a = {}; a[s] = 'symbol'; // 第二种写法 var a = { [s]: 'symbol' }; // 第三种写法 Object.definePropery(a, s, { value: 'symbol', // writable: true, // configurable: true, // enumerable: true })

    以上写法都能得到同样结果:

    a[s]; // symbol Symbol作为属性名时使用[]。如果不使用[]表示这个一个字符串类型的键。 var a = {}; var s = Symbol(); a.s = 'string'; a[s]; // undefined; a['s']; // 'string'; Symbol作为属性名,for…in(属性包括原型链,并且可枚举,属性是字符串)、for…of、Object.keys(属性不包括原型链、可枚举)、Object.getOwnPropertyNames(属性不包括原型链,包括不可枚举)这四个方法无法遍历Symbol作为属性名的情况。通过Object.getOwnPropertySymbols方法个亿获取指定对象的Symbol属性名。 var obj = {}; var a = Symbol('a'); var b = Symbol('b'); obj[a] = 'aaa'; obj[b] = 'bbb'; Object.getOwnPropertySymbols(obj); // [Symbol(a), Symbol(b)] 另一个API----Reflect.ownKeys方法可以返回所有类别的键名,包括常规键名和Symbol键名。

    Symbol.for(),Symbol.keyFor()

    有时,我们希望可以重新使用一个Symbol值,Symbol.for方法可以做到这一点,它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的Symbol值,如果有,就返回这个Symbol值,如果没有,那么就新建一个并返回以该字符串为名称的Symbol值。

    var s = Symbol.for('foo'); var s2 = Symbol('foo'); s == s2; // false var s = Symbol.for('foo'); var s2 = Symbol.for('foo'); s === s2; // true

    可以看出,Symbol和Symbol.for都出返回一个Symbol。但是前者不会被登记到全局环境中供搜索。而后者会。

    Symbol.keyFor返回一个已经登记(使用Symbol.for)的Symbol类型值的key。

    var s1 = Symbol.for('foo'); Symbol.keyFor(s1); // 'foo' var s2 = Symbol('bar'); Symbol.keyFor(s2); // undefined

    内置的Symbol值

    Symbol.hasInstanceSymbol.isConcatSpreadableSymbol.speciedSymbol.matchSymbol.replaceSymbol.searchSymbol.splitSymbol.iterator

    Symbol.toPrimitive 对象的Symbol.toPrimitive属性,指向一个方法。该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值。

    Symbol.toPrimitive被调用时,会接受一个字符串参数,表示当前运算的模式,一共有三种模式。

    Number:该场合需要转成数值String:该场合需要转成字符串Default:该场合可以转成数值,也可以转成字符串 let obj = { [Symbol.toPrimitive](hint) { switch (hint) { case 'number': return 123; case 'string': return 'str'; case 'default': return 'default'; default: throw new Error(); } } }; 2 * obj // 246 3 + obj // '3default' obj == 'default' // true String(obj) // 'str' Symbol.toStringTagSymbol.unscopables
    转载请注明原文地址: https://ju.6miu.com/read-24257.html

    最新回复(0)