【问题标题】:Back slashes in localStorage JSON StringifylocalStorage JSON Stringify 中的反斜杠
【发布时间】:2022-01-12 10:58:34
【问题描述】:

我想知道为什么 console.log 在我在教程中遵循的这个简单示例中返回反斜杠(我对使用 localStorage 很陌生)-

localStorage.clear();

let myObj = { name: "Bob", age: 50 };

let myObj_serialized = JSON.stringify(myObj);

localStorage.setItem("myObj", myObj_serialized);

console.log(localStorage);

我看过其他帖子,其中解释了如何删除反斜杠,但是,我想知道为什么会发生这种情况以及如何避免这种情况。

我遵循的教程的链接是-https://www.youtube.com/watch?v=AUOzvFzdIk4&t=275s

谢谢。

【问题讨论】:

  • 这似乎有效。
  • 这看起来是正确的。你提到你得到反斜杠。你能添加一个例子来说明你的意思吗?您添加的代码没有显示您得到什么输出以及您期望什么。
  • JSON 输出为 "{\"name\":\"Bob\",\"age\":50}",因为 JS 输出使用 " 作为字符串分隔符。如果您尝试myObj_serialized.match(/\\/g),则输出为空。表示字符串不包含反斜杠

标签: javascript stringify


【解决方案1】:

发生这种情况的原因是字符串化对象使用 JSON,正确的 JSON 具有 " 周围的属性和(字符串)值。但是-您要保存的东西也是一个字符串。为了使其正确存储,它必须转义内部的"

例如,如果您要手动创建相同的字符串化 JSON,则需要执行相同操作,否则您将不断打开和关闭字符串定义:

// suggested and invalid.
let stringThing = "{"name":"Bob","age":50}";
// correct
let stringThing2 = "{\"name\":\"Bob\",\"age\":50}";

现在显然在 js 中有解决这个问题的方法,可以简单地使用 ' 来启动字符串,并且您不再需要转义 ",但是如果您要注销,您仍然会看到转义双引号结果字符串。

编辑

evolutionxbox 在 cmets 中对这个答案提出了一个很好的观点 - 但需要稍微澄清一下。 \ 是一个转义字符(在 javascript 中)。当在字符串中单独使用时,它永远不会真正显示您是否将该字符串的值打印到 DOM 的屏幕上。

您保存的数据中显示的\技术上在内存中时实际上并不存在于字符串中。它在存储时放置在那里,以便稍后解析回字符串时它不会提前终止字符串(就像在我的 stringThing 变量中一样)。

我在字符串中看到的\最常见用法是字符串终止字符。在这种情况下"。创建了转义 " 字符,以便人们计算机可以确定该字符是否存在于字符串中。

注意如果您要使用console.log 您的myObj_serialized 变量,您会看到输出未显示\"。这支持\ 在内存中实际上不存在于字符串中的点。

这是对转义字符的目的和使用的过度简化 - 但您可以放心,从存储的对象中删除 \ 将是一个错误,当您将该值解析回内存时,您将不会甚至不知道他们一开始就在那里。

【讨论】:

  • 还要注意JSON.stringify的输出实际上并没有在字符串中添加反斜杠,创建stringThing2的行也没有
  • 谢谢.. 现在我知道转义字符的原因了。实际上,当将数据解析为另一个通过 localStorage 访问的变量时,返回的对象是完整的,即保留在代码开头声明的对象的相同属性 - myObj。
猜你喜欢
  • 2016-06-14
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
  • 2022-07-07
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
相关资源
最近更新 更多