对象内容的访问的两种方式:
- . 操作符:通常称为
“属性访问”
- [ ] 操作符:通常称为
“键访问”
属性访问和键访问的异同
相同
实际上它们访问的是同一个位置,并且会返回相同的值
区别
. 操作符要求属性名满足标识符的命名规范,而 [“..”] 语法 可以接受任意 UTF-8/Unicode 字符串作为属性名。
. 操作符后面总是字符串,所以为对象增加属性的时候使用点语法,会自动把属性名称转为字符串,
举例:
1.如果要引用名称为 “Super- Fun!” 的属性,那就必须使用 [“Super-Fun!”] 语法访问,因为 Super-Fun! 并不是一个有效 的标识符属性名。
2.使用Symbol值作为对象的属性名时只能使用 [ ]
由于每一个 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。这对于一个对象由多个模块构成的情况非常有用,能防止某一个键被不小心改写或覆盖。
|
|
上面代码通过方括号结构和Object.defineProperty
,将对象的属性名指定为一个 Symbol 值。
注意:第一种写法是不会读取mySymbol
作为标识符所指代的那个值的,因为点语法后面总是字符串,导致a的属性名实际上是一个字符串,而不是一个 Symbol 值。
|
|
同理,在对象的内部,使用 Symbol 值定义属性时,Symbol 值必须放在方括号之中。
[ ] 使用场景
1.可计算属性名
2.Symbol值作属性名
3.需要使用变量方式遍历属性
4.函数传参,参数作属性名,或者属性名的一部分,只能使用 [ ]
5.使用对象法进行数组去重,对象的键是一个变量