ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。它是 JavaScript 语言的第七种数据类型,前六种是:undefined、null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。
Symbol 值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。
作为属性名的Symbol
let mySymbol = Symbol(); // 第一种写法 let a = {}; a[mySymbol] = 'Hello!'; // 第二种写法 let a = { [mySymbol]: 'Hello!' }; // 第三种写法 let a = {}; Object.defineProperty(a, mySymbol, { value: 'Hello!' }); // 以上写法都得到同样结果 a[mySymbol] // "Hello!
在对象的内部,使用 Symbol 值定义属性时,Symbol 值必须放在方括号之中。
Object.defineProperty()
方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
Object.defineProperty(obj,prop,descriptor)
参数:
obj要在其上定义属性的对象。
prop要定义或修改的属性的名称。
descriptor将被定义或修改的属性描述符。
如果对象的属性名是Symbol类型的,那么像for ... in Object.keys(),Object.getOwnPropertyNames()是不能遍历出来的
需要使用Object.getOwnpropertySymbols() 但是不会先普通的属性名
如何获取对象中的普通属性名和Symbol的属性名
var names=Symbol('names'); let obj={ [names]:'peter', id:1 }; console.log(Reflect.ownKeys(obj))
以上代码对象有一个普通的属性名和一个Symbol的属性名,如果需要获取这个对象中的所有属性值,需要使用Reflect.ownKeys()
发表评论
侧栏公告
寄语
譬如朝露博客是一个分享前端知识的网站,联系方式11523518。
热评文章
标签列表
热门文章
友情链接