前面我们介绍了迭代器的本质在于 Symbol.iterator 这个属性
let obj = {}
obj[Symbol.iterator] = () => { ... }一般来说对象的 key 都是一个字符串,而这里的 Symbol.iterator 也是一个字符串吗?很明显不是的,这是一个 symbol 类型的值,它和 string,number,boolean,null,undefined 一起组成了 JavaScript 的 6 种基本数据类型。
自定义 symbol
我们可以通过下面的语法定义自己的 symbol
Symbol([描述])注意,不能使用 new Symbol()。这里的描述主要用于调试的时候方便查看,比如
var sym1 = Symbol('hello')
var sym2 = Symbol('hello')由于 symbol 具有唯一性,所以上面两个即便描述一样,但是却不相等
sym1 === sym2
// false除了这种方式,还可以用 Symbol.for(key) 语法,使用一个唯一 key 搜索现有的 symbol,找到了就返回,没有找到就创建一个新的
var sym3 = Symbol.for('key')
var sym4 = Symbol.for('key')
sym3 === sym4
// true其实这种方式主要是用来查找已经存在的 symbol,不建议用来创建新的 symbol。创建好的 symbol 就可以用在一个对象的键中了
var man = {}
var key = Symbol('age')
man[key] = 25
console.log(man[key])
// 25注意,由于 symbol 的特殊性,在用作 key 的时候只能是括号语法(obj[symbol]),而不能是点语法(obj.symbol)。
内置 symbol
除了 Symbol.iterator,还有一些其它的内置 symbol,比如 Symbol.search 用在字符串搜索 String.prototype.search() 方法中
var str = 'hello'
'hello'.search('o')
// 4
let mySearch = {}
mySearch[Symbol.search] = () => {
return '弄啥呢'
}
'hello'.search(mySearch)
// '弄啥呢'可见 search() 方法确实使用了 Symbol.search 。
枚举
var man = {
name: 'tom'
}
var key = Symbol('age')
man[key] = 25
Object.keys(man)
// ["name"]因为 symbol 类型的属性是不可枚举的,自然也不能被 for...in 遍历到,包括 getOwnPropertyNames 也是拿不到的
Object.getOwnPropertyNames(man)
// ["name"]此外 JSON.stringify() 也拿它没办法
JSON.stringify(man)
// "{"name":"tom"}"所以要拿到 symbol 类型的键,只能通过一个特殊的方法 getOwnPropertySymbols
Object.getOwnPropertySymbols(man)
// [Symbol(age)]因此我们可以拿到一个数组的迭代器 symbol 属性(在其原型上)
Object.getOwnPropertySymbols([].__proto__)
// (2)[Symbol(Symbol.iterator), Symbol(Symbol.unscopables)]其实还可以用 Reflect.ownKeys(),用于返回一个对象自身的所有属性,它等价于 Object.getOwnPropertyNames() 与 Object.getOwnPropertySymbols() 之和
Reflect.ownKeys(man)
// [Symbol(age)]可见,symbol 类型的 key 在很多对象操作方法中都是拿不到的,更像是一个隐身的键,在有类似需求的时候是不错的选择。
Basically desire to say your post is as amazing. The clarity as part of your put up is basically spectacular and that i could suppose you happen to be an professional on this subject. Good along with your permission enable me to grab your RSS feed to keep up to day with forthcoming publish. Thanks a million and please proceed the gratifying work. Aldo Buono
I must convey my respect for your kind-heartedness giving support to men who should have assistance with your idea. Your real commitment to getting the message up and down turned out to be incredibly insightful and have continually allowed people like me to reach their pursuits. Your warm and friendly help denotes much to me and substantially more to my office colleagues. Thank you; from everyone of us. Kennith Chivalette
Thanks for your post right here. One thing I would really like to say is the fact most professional career fields consider the Bachelor Degree just as the entry level standard for an online diploma. Although Associate Diplomas are a great way to begin, completing your current Bachelors opens up many entrance doors to various jobs, there are numerous on-line Bachelor Diploma Programs available via institutions like The University of Phoenix, Intercontinental University Online and Kaplan. Another concern is that many brick and mortar institutions make available Online variants of their qualifications but generally for a drastically higher cost than the organizations that specialize in online qualification plans. Willian Hysell
Perform you blog page? Do you blog to advertise items you are selling? I am rather new to the blogging globe. I primarily blog to promote products that I is offering and websites that I are selling upon. How do I get traffic to my blog? Do I basically just have to add content? Does my blog get picked up in the search? Any advice on blogging is very much needed.. Hello, yes I mention it upon my twitter account and also my other web-sites.. Armando Steppello
Save the battery life on your Casino by turning off Notifications and Location Services until you need to use them. Your Casino will automatically reach out and update these functions regularly and use battery power in the process. Be aware of the power your Casino is using, and you will have it when you need it. Chris Brust