JS localStorage属性描述符工作机制及规范依据查询
localStorage的行为是否有明确规范?
确实有明确的规范定义localStorage的完整行为,即WHATWG的HTML标准中Web Storage章节,你看到的只是基础API的说明,规范中还详细定义了特殊key的处理、对象的奇异行为等细节。
规范对特殊key的定义
Storage对象属于ECMAScript标准中的奇异对象(exotic object),它的属性访问、枚举、属性描述符等行为都被规范特殊重写,而非遵循普通JS对象的逻辑:
- 当你使用
setItem设置像length、setItem、__proto__这类与内置属性同名的key时,这些键值对会被正常存储,但不会覆盖Storage对象本身的内置属性。 - 属性访问语法(
storage[key])的行为:- 当key是内置属性名时,优先返回内置属性的值(比如
localStorage.length始终返回存储的键值对数量,而非存储的名为'length'的值); - 要获取与内置属性同名的存储值,必须使用
getItem(key)方法。
- 当key是内置属性名时,优先返回内置属性的值(比如
关于Chrome中的特殊表现
你观察到的Object.keys(localStorage)和Object.getOwnPropertyNames(localStorage)包含存储的特殊key(如'length'),但Object.getOwnPropertyDescriptors(localStorage)不返回对应描述符的现象,完全符合规范:
- 规范要求Storage对象的[[OwnPropertyKeys]]抽象操作(这是
Object.keys、Object.getOwnPropertyNames的底层依据)返回所有存储的键,按插入顺序排列; - 而[[GetOwnProperty]]抽象操作仅对内置属性返回真实的属性描述符,对于存储的键,不会返回描述符——因为这些键并不是真正的对象自有属性,只是通过属性访问语法模拟出来的访问方式。
ECMAScript标准中提到的“奇异对象可覆盖抽象操作”,正是Storage对象实现这种特殊行为的依据,HTML规范明确指定了Storage对象需要重写哪些抽象操作以及具体的行为逻辑。
内容的提问来源于stack exchange,提问作者bogdanb
相关产品推荐
相关产品推荐

