Symbol定义:一种新的原始数据类型,表示独一无二的值,是一种类似字符串的数据类型
特点:
值是唯一的,用来解决命名冲突的问题
值不能与其他数据进行运算
注意点
Symbol 值作为属性名时,该属性是公有属性不是私有属性,可以在类的外部访问。但是不会出现在 for...in 、 for...of 的循环中,也不会被 Object.keys() 、 Object.getOwnPropertyNames() 返回。如果要读取到一个对象的 Symbol 属性,可以通过 Object.getOwnPropertySymbols() 和 Reflect.ownKeys() 取到。
// 创建Symbol() let s = Symbol(); let s2= Symbol('小红') let s3= Symbol('小红') consle.log(s2===s3) //false //Symbol.for创建 let s4 =Symbol.for('小明'); let s5 =Symbol.for('小明'); console.log(s4===s4) //true //不能与其他数据进行运算 let result= s+100 // 报错 // 使用场景 let up = Symbol('say'); let game = { up: '1111', [up]: function () { console.log('我可以发言') }, [Symbol('down')]: function () { console.log('我可以下降') } } console.log(game)
symbol.for()
Symbol.for() 类似单例模式,首先会在全局搜索被登记的 Symbol 中是否有该字符串参数作为名称的 Symbol 值,如果有即返回该 Symbol 值,若没有则新建并返回一个以该字符串参数为名称的 Symbol 值,并登记在全局环境中供搜索。
let yellow = Symbol("Yellow"); let yellow1 = Symbol.for("Yellow"); yellow === yellow1; // false let yellow2 = Symbol.for("Yellow"); yellow1 === yellow2; // true
Symbol.keyFor()
Symbol.keyFor() 返回一个已登记的 Symbol 类型值的 key ,用来检测该字符串参数作为名称的 Symbol 值是否已被登记。
let yellow1 = Symbol.for("Yellow"); Symbol.keyFor(yellow1); // "Yellow"
Symbol 内置值(扩展对象功能的)
迭代器(Iterator)
就是对象里的属性
主要供for...of 遍历 键值
let xiyou=['唐僧','孙悟空','猪八戒','沙僧'] 遍历数据工作原理 // 创建指针独享,指向当前数据 结构的起始位置 let iterator = xiyou[Symbol.iterator](); // 调用对象的next方法 第一次调用next方法,指针自动指向数据结构的第一个成员 接下来不断调用next方法,指针一直往后移动,直到指向最后一个成员 每调用next方法返回一个包含value和dine属性的对象 console.log(iterator.next()) //{value:'唐僧',done:false} console.log(iterator.next()) //{value:'孙悟空',done:false} console.log(iterator.next()) //{value:'猪八戒',done:false} console.log(iterator.next()) //{value:'沙僧',done:false} console.log(iterator.next()) //undefined{value:undefined,done:false}