摘要:值通过函数生成,使用,结果为函数前不能使用命令,否则会报错。函数的参数只是表示对当前值的描述,相同参数的函数的返回值是不相等的。值可以作为标识符,用于对象的属性名,可以保证不会出现同名的属性。方法返回一个已登记的类型值的。
ES6 引入了一种新的原始数据类型 Symbol,表示独一无二的值。 1. Symbol 值通过 Symbol 函数生成,使用 typeof,结果为 "symbol"
var s = Symbol(); console.log(typeof s); // "symbol"2. Symbol 函数前不能使用 new 命令,否则会报错。这是因为生成的 Symbol 是一个原始类型的值,不是对象。 3. instanceof 的结果为 false
var s = Symbol("foo"); console.log(s instanceof Symbol); // false4. Symbol 函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。
var s1 = Symbol("foo"); console.log(s1); // Symbol(foo)5. 如果 Symbol 的参数是一个对象,就会调用该对象的 toString 方法,将其转为字符串,然后才生成一个 Symbol 值。
const obj = { toString() { return "abc"; } }; const sym = Symbol(obj); console.log(sym); // Symbol(abc)6. Symbol 函数的参数只是表示对当前 Symbol 值的描述,相同参数的 Symbol 函数的返回值是不相等的。
// 没有参数的情况 var s1 = Symbol(); var s2 = Symbol(); console.log(s1 === s2); // false // 有参数的情况 var s1 = Symbol("foo"); var s2 = Symbol("foo"); console.log(s1 === s2); // false7. Symbol 值不能与其他类型的值进行运算,会报错。
var sym = Symbol("My symbol"); console.log("your symbol is " + sym); // TypeError: can"t convert symbol to string8. Symbol 值可以显式转为字符串。
var sym = Symbol("My symbol"); console.log(String(sym)); // "Symbol(My symbol)" console.log(sym.toString()); // "Symbol(My symbol)"9. Symbol 值可以作为标识符,用于对象的属性名,可以保证不会出现同名的属性。
var mySymbol = Symbol(); // 第一种写法 var a = {}; a[mySymbol] = "Hello!"; // 第二种写法 var a = { [mySymbol]: "Hello!" }; // 第三种写法 var a = {}; Object.defineProperty(a, mySymbol, { value: "Hello!" }); // 以上写法都得到同样结果 console.log(a[mySymbol]); // "Hello!"10. Symbol 作为属性名,该属性不会出现在 for...in、for...of 循环中,也不会被 Object.keys()、Object.getOwnPropertyNames()、JSON.stringify() 返回。但是,它也不是私有属性,有一个 Object.getOwnPropertySymbols 方法,可以获取指定对象的所有 Symbol 属性名。
var obj = {}; var a = Symbol("a"); var b = Symbol("b"); obj[a] = "Hello"; obj[b] = "World"; var objectSymbols = Object.getOwnPropertySymbols(obj); console.log(objectSymbols); // [Symbol(a), Symbol(b)]11. 如果我们希望使用同一个 Symbol 值,可以使用 Symbol.for。它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建并返回一个以该字符串为名称的 Symbol 值。
var s1 = Symbol.for("foo"); var s2 = Symbol.for("foo"); console.log(s1 === s2); // true12. Symbol.keyFor 方法返回一个已登记的 Symbol 类型值的 key。
var s1 = Symbol.for("foo"); console.log(Symbol.keyFor(s1)); // "foo" var s2 = Symbol("foo"); console.log(Symbol.keyFor(s2) ); // undefined
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/95527.html
摘要:值可以作为标识符,用于对象的属性名,可以保证不会出现同名的属性。的结果为因为不是通过的方式实现的,所以的结果自然是。这个实现类似于函数记忆,我们建立一个对象,用来储存已经创建的值即可。方法返回一个已登记的类型值的。 前言 实际上,Symbol 的很多特性都无法模拟实现……所以先让我们回顾下有哪些特性,然后挑点能实现的……当然在看的过程中,你也可以思考这个特性是否能实现,如果可以实现,该...
摘要:通常,它做为一个偏功能性的标记来表示,在全剧中它是唯一的。并且使用来生成,会在存入当前全局上下文中一个结构中,我们称它为顾名思义,它是全局的,所以使用时我们需要谨慎,尤其是在大型项目中。 ES6中基础类型增加到了7种,比上一个版本多了一个Symbol,貌似出现了很长时间,但却因没有使用场景,一直当作一个概念层来理解它,我想,用它的最好的方式,还是要主动的去深入了解它吧,所以我从基础部分...
阅读 766·2023-04-25 17:33
阅读 3625·2021-07-29 14:49
阅读 2480·2019-08-30 15:53
阅读 3431·2019-08-29 16:27
阅读 2000·2019-08-29 16:11
阅读 1029·2019-08-29 14:17
阅读 2431·2019-08-29 13:47
阅读 2016·2019-08-29 13:28