ES6 Symbols(符号)的浅谈及其使用方法简单示例

 

简单说明

在ES6的所有新特性中,接触了一个比较感兴趣的特性 Symbols。我从来没有在实践中看到或使用过这些基本类型。这是一个有意思、新疑的概念,我将在本文中简单分享下我所了解的

 

ES6 Symbols(符号)的浅谈及其使用方法简单示例

ES6 Symbols(符号)

JavaScript Symbols(符号)到底是什么?它是ES6中引入的一种新的惟一的、不可变的、基本的数据类型,最初的目的是提供私有属性

var sym = Symbol(); 
typeof sym; // Returns "symbol"

符号可以用来访问对象属性,就像字符串一样:

var obj = {};
var sym = Symbol();
obj[sym] = "a";
console.log(obj[sym]); // "a"

主要区别是,sym访问的属性在迭代或stringify时不会显示在对象中。例如:

var obj = {};
var sym = Symbol();
obj['hi'] = "bye";
obj[sym] = "a";

console.log(obj);  // "{hi: 'bye'}"

for (var i in obj) {
    console.log(i);  // "hi"
}

console.log(JSON.stringify(obj));  // {"hi":"bye"}

因此,如你所见,访问“符号化”属性的唯一方法是使用原始符号对象,否则你甚至不知道该属性的存在。这意味着我们可以使用符号在JavaScript中作为私有属性?不对,符号从最初的规范中严重降级(原因不明),不能用于可靠地创建私有属性。对象的符号可以通过Object.getOwnPropertySymbols访问,让所有人都能看到

var obj = {};
var sym = Symbol();
obj['hi'] = "bye";
obj[sym] = "a";

Object.getOwnPropertySymbols(obj);    // [ Symbol() ]

警告一下,许多人仍然相信JS符号为对象提供私有属性,所以在论坛和Stack Overflow上阅读的东西一定要小心对待。希望一旦ES6成为主流,这些误解将得到纠正

你也可以看到很多例子,其中的符号是传递一个可选的字符串,像这样:

var sym = Symbol("foo");

此描述符严格用于调试目的,不影响符号的唯一性。为了更清楚地说明这一点,这里有一个例子:

Symbol("foo") === Symbol("foo");    // false

var sym = Symbol("foo");
console.log(sym.toString());        // "Symbol(foo)"

 

全局作用域

重要的是要认识到,使用Symbol()函数不会创建全局范围内可用的全局符号。符号仍然特定于它所使用的对象。但是,你可以使用symbol.for()和symbol.keyfor()创建全局符号,以从全局符号注册表中获取和设置符号

Symbol.for(key)使用给定的键(字符串)搜索现有的符号,如果找到则返回。如果没有找到符号,则在全局注册表中使用给定的键创建一个新符号,然后返回

Symbol.for("foo");                // 创建一个新的全局symbol
var sym = Symbol.for("foo");        // 检索已创建的symbol

与Symbol([description])不同,在Symbol.for(key)中指定key,每次返回的符号都是相同的,因此:

Symbol.for("bar") === Symbol.for("bar");    // true
Symbol("bar") === Symbol("bar");            // false

Symbol.keyFor(sym)本质上与Symbol.for(key)相反,它不是传递一个键来获取一个符号,而是传递一个符号来获取一个键

var sym = Symbol.for("foo");        // 创建一个新的全局 symbol
console.log(Symbol.keyFor(sym));    // "foo"

 

结论

尽管JavaScript symbol是一个新的、有趣的想法,但不保证私有属性我对它的有用性还是持怀疑态度。也有人认为它对于避免命名冲突还是有帮助的,但是我认为他的潜力还是建立在提供私有属性上,希望将来的更新发展能有所期待~

 

转载请注明出处豆豆网

欢迎分享至:

版权声明:原创文章自由转载-非商用-非衍生-保持署名及文章出处(创意共享3.0许可证
转载说明:转载请注明出处豆豆网
部分文章选自网络(文首、末未标明豆豆网的均来自网络),我们对文中观点保持中立,本站涉及软件下载,仅供参考学习、交流之目的,涉及版权请告知删除,邮箱地址:豆豆网博客


发表评论

邮箱地址不会被公开。 必填项已用*标注