我只是偶然发现JavaScript中新的数据类型的文档(针对ES6提出,但已在Firefox,Chrome和Opera中实现)Symbol
:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol http://people.mozilla.org/~jorendorff/es6-draft.html#sec-symbol-objects
我正在阅读有关它的信息,但我只是想不到可能的使用情况。
该文件说:
符号是唯一且不可变的数据类型,可以用作对象属性的标识符。
好的,可以说我按照文档中的说明进行操作:
obj[Symbol("a")] = "a";
但是,由于Symbol('a')始终返回唯一值(对象),并且:
符号在for ...迭代中不可见。
如何从中检索我的财产obj
?
var obj = { normalProperty: 'just a string' };
obj[Symbol('a')] = 'a';
document.getElementById('retrieve').addEventListener('click', function() {
document.write('Stringified object:' + JSON.stringify(obj) + '<br/><br/>');
document.write('Trying to get Symbol-property value, aaaand...: <br/>');
document.write(obj[Symbol('a')]); // undefined
}, false);
<button id="retrieve">Retrieve obj's property</button>
当然,您可以像这样检索它:
var x = Symbol('a');
obj[x] = 'a';
obj[x]; // "a"
但是这样做的目的是什么?
提前致谢 :)
阅读文档和玩这一点后Symbol
输入chrome,则显得Symbol
是一种方法来定义一个名字-不是价值- ,而事实上,用符号定义的属性使用是不可见的for..in
,Object.getOwnPropertyNames()
或JSON.stringify()
使符号对于元数据属性很有用:
// define metadata symbols
var Metadata = {
Date: Symbol('Message date')
};
var email = function(recipient, message) {
this.Recipient = recipient;
this.Message = message;
this[Metadata.Date] = new Date();
};
var email1 = new email('@Me', 'test');
JSON.stringify(email1);
// {
// Recipient: '@Me',
// Message: 'test'
// }
// Date is still accessible using
email1[Metadata.Date];
// Thu Nov 27 2014 16:50:00 GMT+0000
// Debugging in Console:
// {
// Recipient: '@Me',
// Message: 'test'
// Symbol(Message date): Thu Nov 27 2014 16:50:00 GMT+0000
// }
可以使用Symbol.for
函数将符号设置为全局符号,因此元数据名称可以创建一次,并在所有项目文件中使用。
使用符号访问值需要在创建符号时引用该符号。Symbol()
即使使用相同的描述,每次调用都会创建一个新的调用:
var a = Symbol('a');
var b = Symbol('a');
a != b
// and
a != Symbol('a')
但是,使用创建符号Symbol.for
,它将被注册到全局注册表中,并且描述成为键,意味着在全局注册表中将只存在一个具有相同键的符号:
var a = Symbol.for('a');
var b = Symbol.for('a');
a == b
// and
a == Symbol.for('a')
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句