自ECMAScript2015起,symbol成为了一种新的原始数据类型,就像number和string一样
symbol类型的值是通过Symbol构造函数创建的
可以传递参数作为唯一标识,只支持string和number类型的参数
let sym1 = Symbol()
let sym2 = Symbol("key")
Symbol的值是唯一的
const s1 = Symbol()
const s2 = Symbol()
s1 === s2 // false
用作对象属性的键
let sym = Symbol()
let obj = {
[sym]: "value"
}
console.log(obj[sym])
使用symbol定义的属性,是不能通过如下方式遍历拿到的
const symbol1 = Symbol("666")
const symbol2 = Symbol("777")
const obj = {
[symbol1]: 'xx',
[symbol2]: 'yy',
age: 19,
sex: '女'
}
// 1. for in 遍历
for (const key in obj) {
// 注意在console看key,是不是没有遍历到symbol1,symbol2
console.log(key);
}
// 2. Object.keys 遍历
console.log(Object.keys(obj));
// 3. getOwnPropertyNames
console.log(Object.getOwnPropertyNames(obj));
// 4. JSON.stringify()
console.log(JSON.stringify(obj))
下面两种可以取到
// 1. 拿到具体的symbol属性,对象中有几个就可以拿到几个
console.log(Object.getOwnPropertySymbols(obj))
// 2. es6的Reflect拿到对象的所有属性
console.log(Reflect.ownKeys(obj))
Symbol.iterator 迭代器 和 生成器 for of
支持遍历大部分类型迭代器 arr nodeList argumetns set map 等
var arr = [1, 2, 3, 4]
let iterator = arr[Symbol.iterator]()
console.log(iterator.next()) //{ value: 1, done: false }
console.log(iterator.next()) //{ value: 2, done: false }
console.log(iterator.next()) //{ value: 3, done: false }
console.log(iterator.next()) //{ value: 4, done: false }
console.log(iterator.next()) //{ value: undefined, done: true }
以下这些是Symbol的属性
Symbol.hasInstance:方法,会被instanceof运算符调用。构造器对象用来识别一个对象是否是其实例。
Symbol.replace:布尔值,表示当在一个对象上调用Array.prototype.concat时,这个对象的数组元素是否可展开。
Symbol.Iterator:方法,被for-of语句调用,返回对象的默认迭代器
Symbol.replace:方法,被String.prototype.replace调用。正则表达式用来替换字符串中匹配的子串。
Symbol.search:方法,被String.prototype.search调用。正则表达式返回被匹配部分在字符串中的索引。