扫码关注官方订阅号
如下 var test={name:"Jack"}; 这两种有区别么 test.name 和 test["name"]
ringa_lee
由于test.name和test["name"]规范定义均为Property Accessor,并且定义访问Property Accessor的运算过程为 对test.name或test["name"]进行运算得到类型为Reference的中间变量,数据结构为 { base: test, propertyName: "name", useStrict: false } 然后再通过内部方法[[GetValue]]或[[PutValue]]处理中间变量 而从test.name或test["name"]到Reference实例的过程是parser处理的,而运行时对test.name和test['name']无感知,因此实质上是无区别的。 但由于点方式中属性名必须遵循identifier的命名规范,而下标方式方式中则采用StringLiteral,所以下标方式方式中属性命名的字符集更广泛。
这两种都是访问对象属性的方式,其结果是一样的,差别就是[]方式更通用一点,比如属性名是 "my name",那就只能用 [] 访问了,即 test['my name']
[]
这2种都可以访问到对象的属性
比较常见的一种区别就是,如果你要设置对象的某个属性是用变量来定义的,那么不能使用 obj.x的方式,而是需要使用 obj[x]的方式获取属性值,因为前一种js会认为你是给obj对象赋予一个叫x的属性
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
扫描下载App
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
由于test.name和test["name"]规范定义均为Property Accessor,并且定义访问Property Accessor的运算过程为
对test.name或test["name"]进行运算得到类型为Reference的中间变量,数据结构为
{
base: test,
propertyName: "name",
useStrict: false
}
然后再通过内部方法[[GetValue]]或[[PutValue]]处理中间变量
而从test.name或test["name"]到Reference实例的过程是parser处理的,而运行时对test.name和test['name']无感知,因此实质上是无区别的。
但由于点方式中属性名必须遵循identifier的命名规范,而下标方式方式中则采用StringLiteral,所以下标方式方式中属性命名的字符集更广泛。
这两种都是访问对象属性的方式,其结果是一样的,差别就是
[]
方式更通用一点,比如属性名是 "my name",那就只能用 [] 访问了,即 test['my name']这2种都可以访问到对象的属性
比较常见的一种区别就是,如果你要设置对象的某个属性是用变量来定义的,那么不能使用 obj.x的方式,而是需要使用 obj[x]的方式获取属性值,因为前一种js会认为你是给obj对象赋予一个叫x的属性