首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Typescript: JSON.parse(localStorage.getItem(‘of’))返回[object Object]而不是预期的object

Typescript是一种静态类型的编程语言,它是JavaScript的超集,可以在编译时进行类型检查。在给定的问答内容中,问题是关于JSON.parse(localStorage.getItem('of'))返回[object Object]而不是预期的object。

首先,让我们解释一下这个问题的原因。在Typescript中,localStorage是浏览器提供的Web API之一,用于在浏览器中存储数据。localStorage的getItem方法返回的是一个字符串,而不是一个对象。当我们使用JSON.parse方法将其解析为对象时,如果字符串无法正确解析为一个有效的JSON对象,那么它将返回一个默认的[object Object]字符串。

为了解决这个问题,我们可以采取以下步骤:

  1. 确保存储在localStorage中的数据是一个有效的JSON字符串。可以使用JSON.stringify方法将对象转换为JSON字符串,并使用localStorage的setItem方法将其存储起来。
  2. 在使用JSON.parse方法之前,先检查localStorage.getItem('of')返回的值是否为null或undefined。如果是,说明localStorage中没有存储该项数据,需要进行相应的处理。
  3. 在使用JSON.parse方法之前,可以使用try-catch语句来捕获可能的解析错误。如果解析失败,可以根据具体情况进行错误处理,例如给出一个默认的对象或者提示用户输入的数据格式有误。

下面是一个示例代码,演示了如何处理这个问题:

代码语言:txt
复制
const data = localStorage.getItem('of');
let parsedData;

if (data) {
  try {
    parsedData = JSON.parse(data);
  } catch (error) {
    console.error('Failed to parse data:', error);
    // 可以根据具体情况进行错误处理,例如给出一个默认的对象
    parsedData = {};
  }
} else {
  // 处理localStorage中没有存储该项数据的情况
  parsedData = {};
}

console.log(parsedData);

在这个示例中,我们首先检查localStorage.getItem('of')返回的值是否存在。如果存在,我们尝试使用JSON.parse方法将其解析为一个对象。如果解析失败,我们将在控制台输出错误信息,并给出一个默认的空对象作为解析结果。如果返回的值为null或undefined,我们也给出一个默认的空对象。

对于Typescript开发者,可以使用类型断言来明确告诉编译器解析结果的类型,例如:

代码语言:txt
复制
const data = localStorage.getItem('of');
let parsedData: object;

if (data) {
  try {
    parsedData = JSON.parse(data) as object;
  } catch (error) {
    console.error('Failed to parse data:', error);
    parsedData = {};
  }
} else {
  parsedData = {};
}

console.log(parsedData);

这样,编译器就知道parsedData的类型是一个对象。

总结一下,当Typescript中的JSON.parse(localStorage.getItem('of'))返回[object Object]而不是预期的object时,可能是由于存储在localStorage中的数据不是一个有效的JSON字符串,或者解析过程中发生了错误。我们可以通过检查数据的有效性、使用try-catch语句捕获解析错误以及给出默认的解析结果来解决这个问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么 useState 返回的是 array 而不是 object?

[count, setCount] = useState(0) 这里可以看到 useState 返回的是一个数组,那么为什么是返回数组而不是返回对象呢?...为什么是返回数组而不是返回对象 要弄懂这个问题要先明白 ES6 的解构赋值,来看 2 个简单的例子: 数组的解构赋值 const foo = [1, 2, 3]; const [one, two, three...,这个问题就很好解释了 如果 useState 返回的是数组,那么使用者可以对数组中的元素命名,代码看起来也比较干净 如果 useState 返回的是对象,在解构对象的时候必须要和 useState 内部实现返回的对象同名...总结 useState 返回的是 array 而不是 object 的原因就是为了降低使用的复杂度,返回数组的话可以直接根据顺序解构,而返回对象的话要想使用多次就得定义别名了 首发自:为什么 useState...返回的是 array 而不是 object?

2.3K20

为什么 waitnotifynotifyAll 在 Object 类定义而不是 Thread 类?

作者:Yujiaao 来源:segmentfault.com/a/1190000019962661 一个较难回答的 Java 问题, Java 编程语言又不是你设计的,你如何回答这个问题呢?...为什么在 Object 类中定义 wait 和 notify 方法,每个人都能说出一些理由。...记住同步和等待通知是两个不同的领域,不要把它们看成是相同的或相关的。同步是提供互斥并确保 Java 类的线程安全,而 wait 和 notify 是两个线程之间的通信机制。...2) 每个对象都可上锁,这是在 Object 类而不是 Thread 类中声明 wait 和 notify 的另一个原因。...3) 在 Java 中,为了进入代码的临界区,线程需要锁定并等待锁,他们不知道哪些线程持有锁,而只是知道锁被某个线程持有, 并且需要等待以取得锁, 而不是去了解哪个线程在同步块内,并请求它们释放锁。

1.5K20
  • 「 Map最佳实践」什么时候适合使用 Map 而不是 Object

    方法都是通过对比键名是否相等(===)来获取,不相等则返回undefined 比较 Map 和 Object 定义 //Map const map = new Map(); map.set('key',...() { [native code] }1", creates: 1, a: 1, bug: 1} 这个例子灵感来源于《Effective TypeScript》[1]一书 迭代器 「Map」 是可迭代的...,对于「Object」而言,想要获得对象的属性长度,需要手动对其进行迭代,使其为O(n)复杂度,属性长度为n 在上文提及的示例中,我们可以看到「Map」始终保持按插入顺序返回键名。...但「Object」却不是。...Map是一个纯哈希结构,而Object不是(它拥有自己的内部逻辑)。Map 在频繁增删键值对的场景下表现更好,性能更高。

    84031

    「 Map最佳实践」什么时候适合使用 Map 而不是 Object

    方法都是通过对比键名是否相等(===)来获取,不相等则返回undefined 比较 Map 和 Object 定义 //Map const map = new Map(); map.set('key',...() { [native code] }1", creates: 1, a: 1, bug: 1} 这个例子灵感来源于《Effective TypeScript》[1]一书 迭代器 「Map」 是可迭代的...,对于「Object」而言,想要获得对象的属性长度,需要手动对其进行迭代,使其为O(n)复杂度,属性长度为n 在上文提及的示例中,我们可以看到「Map」始终保持按插入顺序返回键名。...但「Object」却不是。...Map是一个纯哈希结构,而Object不是(它拥有自己的内部逻辑)。Map 在频繁增删键值对的场景下表现更好,性能更高。

    41920

    避免在 TypeScript 代码中使用模糊的 Object 或 {}

    避免 TypeScript 代码中使用模糊的 Object 或 {}在 TypeScript 的世界里,当我们期望一个对象但不确定对象的具体结构时,通常会使用 Object 或 {} 作为类型。...让我们深入探讨一下,看看为什么在 TypeScript 代码中使用这些模糊类型可能是时候慎重考虑了。...理解使用 Object 或 {} 的问题当我们有一个 TypeScript 变量存储任何对象,但对对象的结构不确定时,我们经常使用 Object 或 {} 这样的类型,如下所示:type Param =...,因为我们知道在 JavaScript 中,Object 是一切的基础,因此允许像字符串、日期、布尔值等这样的值被传递而不会抛出 TypeScript 错误,如下所示:myFunc({name: 'John...通过寻找替代方案,我们可以为更加平稳、可预测的代码铺平道路。解决方案1:使用 Record我们可以在 TypeScript 中使用 Record 来解决这个问题。

    16100

    JavaScript localStorage 的使用

    数据存储的格式 key 和 value 都只能接受「字符串 」,若存储的数据非字符串(数组或对象)在存储时会被转成字符串格式,而衍生出其他问题: 我们尝试声明一个 players 的对象,其中包含了三位选手的数据...,并通过 setItem() 方法将 players 对象存储到 localStorage 当中: 图片 players 是一个对象,而非字符串,通过 toString() 的转换过程后,会返回...object Object ,也就是我们在下图 value 中看到的结果 — 这不是我们预期的数据结构和内容:解决方法:将数据转换成 JSON 格式的字符串要解决以上在数据转换过程中的问题,又或者想要让我们存储的数据不局限于...「字符串」的格式,则可以通过 JSON.stringify() 方法,将要存储的数据转换为 JSON 格式的字符串;要取出数据时,再通过 JSON.parse() 方法,将数据转换回原本的格式:使用 setItem...,可以发现这次的格式和预期的相同:当我们要取出数据时,使用 JSON.parse() 方法,将数据转换回原本的格式:总结--开发web应用程序时,若需要将数据存取下来,在往后或离线时使用,一个简单的方式就是通过

    4400

    vue2知识点:浏览器本地缓存

    值,结果为null,而不是undefine,另外JSON.parse(null),那么结果依然是null,而不是undefine注意点4:如果存储值为对象类型...,那么页面缓存保存的实际是调用.toString()后的字符串效果,如图,这样坏处是压根不知道对象里面都有啥属性,哪怕获取到该对象也不明白都包含了啥,使用很不方便,而不是咱们认识的json格式let p...Object转为咱们认识的json格式,可使用JSON.stringify(json对象)和JSON.parse(Object Object)let p = {name:'张三',age:18}localStorage.setItem...('person',JSON.stringify(p))const result = localStorage.getItem('person')console.log(JSON.parse(result...(JSON.parse(result))// console.log(localStorage.getItem('msg3'))}function deleteData(){localStorage.removeItem

    9410

    浅析JSON.parse() 和 JSON.stringify()

    JSON对象在所有现代浏览器中都可以使用,它有两个非常有用的方法来处理JSON格式化的内容:解析和字符串化。JSON.parse() 取一个JSON字符串并将其转换为JavaScript对象。...,该字符串以 JSON 格式保存在 localStorage 里 var restoredSession = JSON.parse(localStorage.getItem('session')); /...(unique).map(function(u){ //Object.keys()返回对象的所有键值组成的数组,map方法是一个遍历方法,返回遍历结果组成的数组.将unique对象的键名还原成对象数组...return JSON.parse(u); }) return arr; } 存在的问题:{x:1,y:2}与{y:2,x:1}通过JSON.stringify字符串化值不同,...(unique).map(function(u) { //Object.keys()返回对象的所有键值组成的数组,map方法是一个遍历方法,返回遍历结果组成的数组.将unique对象的键名还原成对象数组

    66220

    JSON.stringify()妙用

    console.log()没有输出我们想要的结果。它输出了[object Object],因为从对象到字符串的默认转换是“[objectObject]”。...,该字符串以 JSON 格式保存在 localStorage 里 var restoredSession = JSON.parse(localStorage.getItem('session'));...(unique).map(function(u){ //Object.keys()返回对象的所有键值组成的数组,map方法是一个遍历方法,返回遍历结果组成的数组.将unique对象的键名还原成对象数组...(unique).map(function(u) { //Object.keys()返回对象的所有键值组成的数组,map方法是一个遍历方法,返回遍历结果组成的数组.将unique对象的键名还原成对象数组...(unique).map(function(u) { //Object.keys()返回对象的所有键值组成的数组,map方法是一个遍历方法,返回遍历结果组成的数组.将unique对象的键名还原成对象数组

    78110

    Web端IM聊天消息该不该用浏览器本地存储?一文即懂!

    如果 key 对应的 value 获取不到,则返回值是 null。...("username");// 获取到的数据为string,使用时反序列化数据const userLocal = JSON.parse(localStorage.getItem("user"));const...() 查看所有存储数据的键;Object.keys(localStorage); // ['username']Object.keys(sessionStorage);3.2 浏览器查看本地存储的内容可以在浏览器中直接查看...在存储信息过多后,会拖慢浏览器速度,也会因为浏览器存储容量不够而报错,可以封装一层逻辑来实现设置过期时间,以达到清理的目的。...={false} />6.3 减少重复访问接口在浏览页面时,会遇到一些经常访问但返回数据不更新的接口,这种特别适合用做页面缓存,只在页面打开的时候访问一次,其他时间获取缓存数据即可。

    2900

    模式声明和验证库 Zod 介绍

    Zod 是一个以 TypeScript 为首的模式声明和验证库 最近的项目中,涉及到大量的接口调用,前端代码默认接口返回的数据是满足类型声明的,并没有进行校验。...(src_json_str) as User console.log(data_json); 这段代码有个问题,如果接口返回的"age"不是数字,而是字符串,那么就可能会产生一个隐藏的bug,这个时候...import { z } from "zod"; const User = z.object({ name: z.string(), age: z.number(), }); // 假设这里...age 的数据类型为 string,不是 number const src_json_str = '{"name":"hello" , "age":"28"}'; //这里没有验证数据是否满足要求...[image-20220426215733791.png] 当然除了数据类型的判断,Zod库还能做一些简单的逻辑判断: const User = z.object({ name: z.string(

    1.9K00
    领券