localStorage - 使用 getItem/setItem 函数还是直接访问对象?

IT技术 javascript local-storage
2021-02-08 01:01:30

与直接访问对象属性相比,使用 localStorage 对象上定义的方法是否有一些好处?例如,而不是:

var x = localStorage.getItem(key);
localStorage.setItem(key, data);

我一直在这样做:

var x = localStorage[key];
localStorage[key] = data;

这有什么问题吗?

4个回答

并非如此,它们基本上完全相同。一种使用封装(getter/setter)来更好地保护数据和简单使用。你应该使用这种风格(为了安全)。

当名称(键)未知以及数组和循环时,另一个允许更好的使用。使用.key().length遍历您的存储项目而不知道它们的实际键名。

我发现这是一个很好的资源:http : //diveintohtml5.info/storage.html

这个问题也可能为一些人提供更多的见解:HTML5 localStorage key order

附录:

显然,关于封装存在一些混淆。查看这个快速的维基百科但说真的,我希望这个网站的用户知道如何谷歌。

继续前进,封装是这样一种想法,即您几乎没有制作与另一个系统通信的进出门户。假设您正在制作一个供其他人使用API包。假设您在该 API 系统中有一组通过用户输入进行更新的信息。您可以让 API 的用户直接将该信息放入数组中...使用该array[key]方法。或者你可以使用封装。获取将其添加到数组中的代码,并将其包装在一个函数(例如,asetArray()setWhateverMakesSense()函数)中,API 的用户调用该函数来添加此类信息。然后,在此set函数中,您可以检查数据是否存在问题,您可以以正确的方式将其添加到数组中,以防您需要以某种方式将pushed 或shifted 到数组中……等等。控制来自用户的输入如何进入实际程序。因此,它本身不会增加安全性,但允许由 API 的作者您编写安全性。这也允许更好的版本控制/更新,因为如果您决定进行内部更改,您的 API 用户将不必重写代码。无论如何,这是良好的OOP所固有的

(因此,为了回应 Natix 在下面的评论......)

在这里的javascript和localStorage对象的情况下,他们已经编写了这个API,他们是作者,我们是它的用户。如果作者决定改变localStorage工作方式,那么如果使用了封装方法,就不太可能需要重写您的代码。但我们都知道这种程度的变化极不可能发生,至少不会很快发生。由于作者在这里没有任何固有的不同安全检查,那么,目前,这两种使用localStorage方式本质上是相同的。它有点像一个垫片。但是,我们可以轻松地覆盖/替换现有的封装localStorage来进行我们自己的安全检查。因为 JavaScript 就是这么棒。

PT

正如我所说,一个人使用封装(getter/sitter)......所以这应该是显而易见的......它的功能以“get”或“set”开头......如果你了解封装。另一种是使用.key().length迭代的方式。
2021-03-18 01:01:30
我不确定缺乏这些信息是否值得投反对票。这里。看到OP没有要求它。正如我所说,答案是......不是真的。这两种javascript方式没有任何真正的本质安全差异。将所有内容发送到函数(封装)的术语允许该事务的门户。如果你愿意,你可以重写那个门户......这是超出这个上下文的其他东西。但是,如何使用这种控制水平来提高安全性应该是显而易见的。假设您知道封装,这很明显。
2021-03-28 01:01:30
那么,如果这些方法基本上完全相同,它们究竟如何更好地保护数据并提高安全性
2021-04-02 01:01:30

我认为它们完全相同,文档中唯一指出的是:

注意:虽然可以使用标准 JavaScript 属性访问方法设置和读取值,但建议使用 getItem 和 setItem 方法。

但是,如果使用完整的垫片,它会指出:

使用方法 localStorage.yourKey = yourValue; 并删除 localStorage.yourKey;使用 此代码设置或删除密钥不是一种安全的方式

和有限的垫片:

此代码不允许使用 localStorage.yourKey 方法来获取、设置或删除密钥

不完全相同,getter 返回,null而直接对象属性返回undefined缺少的键
2021-03-23 01:01:30

我看到的最大好处之一是我不必在 JSON.parse() 之前检查值是否未定义,因为 getItem() 返回 NULL 而不是未定义。

使用localstorage时,应始终JSON.parse使用try/catch包装因为返回的值不可靠且可能无法解析
2021-03-17 01:01:30

只要您不使用像 window.localStorage.key 这样的“点表示法”,您就可能没问题,因为它在 Windows Phone 7 中不可用。我还没有用括号进行测试(您的第二个示例)。我个人总是使用 set 和 get 函数(你的第一个例子)。