【发布时间】:2018-04-18 05:18:52
【问题描述】:
我是 chrome 扩展的新手。 我知道 Java,但 Javascript 完全不同。
我想问一下localStorage["something"]和localStorage.something有什么区别?
方括号与点。
【问题讨论】:
我是 chrome 扩展的新手。 我知道 Java,但 Javascript 完全不同。
我想问一下localStorage["something"]和localStorage.something有什么区别?
方括号与点。
【问题讨论】:
没有区别。其实这两种语法在 JavaScript 整体上并没有什么区别:
someObj.someProp === somObj["someProp"];
唯一的区别是某些字符在字符串中有效,在点属性名称中无效:
someObj["some-prop"] // valid
someObj.some-prop // this is actually the value of `someObj.some` minus the value of `prop`
请注意,这两种在localStorage 中存储值的方法也与使用.getItem 和.setItem 方法相同。根据W3C spec:
每个存储对象都提供对键/值对列表的访问,这些键/值对有时称为items。
这些项目可以通过同名的对象属性或通过使用.getItem和.setItem按名称引用它们来访问和可变。唯一的区别是可以覆盖函数以提供包装,例如,在存储之前对对象进行 JSON 化:
localStorage.setItem = function(key, val) {
localStorage[key] = JSON.stringify(val);
}
【讨论】:
someObj.someProp === somObj["someProp"]; 不正确,如果值为 NaN。特洛洛洛洛:P
var someObj={};Object.defineProperty(someObj,'someProp',{get:function(){return{};}}); 时两者都不成立。不过,NaN 比这个更可能发生;)
localStorage 上的点和括号表示法与set/getItem 略有不同:属性访问不能持久地将值存储在共享localStorage 上的本机属性名称,而函数访问可以。 localStorage.setItem = "foo" 行不会导致持久存储,而localStorage.setItem("setItem", "foo") 会。 :P