[[Put]] 被触发时,实际的行为取决于许多因素,包括对象中是否已经存在这个属性(这是最重要的因素)
如果存在这个属性,[[Put]] 算法会大致检查下面这些内容:
- 属性是佛是访问描述符?如果是并且存在 setter 就调用 setter。
- 属性的数据描述符中 writable 是否是 false?如果是,在非严格模式下静默失败,在严格模式下抛出 TypeError 异常。
- 如果都不是,将该值设置为属性的值。
如果对象中不存在这个属性,[[put]] 操作会更加复杂。
for...in 遍历的是对象中所有可枚举属性,你需要手动获取属性值
属性的特性可以通过属性描述符来控制,比如 writable 和 configurable。此外,可以使用 Object.preventExtensions(...)、Object.seal(..) 和 Object.freeze(..) 来设置对象的不可变性级别。
可以使用 ES6 中 for...of 来遍历数据结构(数组、对象,等等)中的值,for...of 会寻找或者自定义的 @@iterator 对象并调用它的 next() 方法来遍历数据值。
网友评论