范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

你不知道的JSON。stringify

  JSON.stringify 是我们经常用到的的一个方法,它主要作用是将 JavaScript 值和对象转换为字符串。如: JSON.stringify({ foo: "bar" }); // => "{"foo":"bar"}"  JSON.stringify(123); // => "123"
  但是JS 的许多地方都有问题,这个函数也不例外。我们可能会想象一个叫做 "stringify "的函数总是返回一个字符串......但它并没有!
  例如,如果你尝试 stringify  undefined ,它返回 undefined  ,而不是一个字符串。 JSON.stringify(undefined); // => undefined
  接下来,我将分两部分讲:  列举  JSON.stringify  不返回字符串的情况 我们将如何避免这些陷阱  什么时候JSON.stringify不返回字符串?
  undefined 、任意的函数以及 symbol  值,在序列化过程中会被忽略(出现在非数组对象的属性值中时)或者被转换成 null (出现在数组中时)。函数、undefined  被单独转换时,会返回 undefined 。
  对包含循环引用的对象(对象之间相互引用,形成无限循环)执行此方法,会抛出错误
  我认为  JSON.stringify  能够返回字符串以外的东西是挺惊讶的。但在6种情况下,它可以返回undefined : 试图在顶层对  undefined  进行序列化,会返回 undefined 。 JSON.stringify(undefined); // => undefined 尝试序列化函数也会返回  undefined 。对于常规函数、箭头函数、异步函数和生成器函数都是如此。 JSON.stringify(function foo() {}); // => undefined  JSON.stringify(() => {}); // => undefined  function bar() {} bar.someProperty = 123; JSON.stringify(bar); // => undefined 尝试序列化symbol 也会返回  undefined 。 JSON.stringify(Symbol("computers were a mistake")); // => undefined 在浏览器中,试图序列化被废弃的 document.all  也会返回 undefined 。 // => undefined
  这只影响到浏览器,因为document.all在其他环境中是不可用的,比如Node。  带有  toJSON  函数的对象将被运行,而不是试图正常地序列化它们。但是如果 toJSON  返回上面的一个值,试图在顶层序列化它将导致 JSON.stringify  返回undefined 。 JSON.stringify({ toJSON: () => undefined }); // => undefined  JSON.stringify({ ignored: true, toJSON: () => undefined }); // => undefined  JSON.stringify({ toJSON: () => Symbol("heya") }); // => undefined 你可以传递第二个参数,称为 "replacer",它可以改变序列化的逻辑。如果这个函数为顶层返回上述值之一, JSON.stringify  将返回undefined 。 JSON.stringify({ ignored: true }, () => undefined); // => undefined  JSON.stringify(["ignored"], () => Symbol("hello")); // => undefined
  需要注意的是,其中的许多东西实际上只影响到顶层的序列化。例如, JSON.stringify({foo: undefined}) ,返回字符串"{}" ,这并不令人惊讶。
  我还想提一下,TypeScript的类型定义在这里是不正确的。例如,下面的代码类型的校验可以通过:  const result: string = JSON.stringify(undefined);
  在第2部分中,我们将讨论如何更新 TypeScript 的定义以确保其正确性。
  JSON.stringify  也可能遇到问题,导致它抛出一个错误。在正常情况下,有四种情况会发生: 循环引用会导致抛出一个类型错误。  const b = { a }; a.b = b;  JSON.stringify(a); // => TypeError: cyclic object value
  注意,这些错误消息在不同浏览器可能提示是不样的,例如,Firefox 的错误信息与Chrome的不同。  BigInts不能用 JSON.stringify  进行序列化,这些也会导致一个TypeError。 JSON.stringify(12345678987654321n); // => TypeError: BigInt value can"t be serialized in JSON  JSON.stringify({ foo: 456n }); // => TypeError: BigInt value can"t be serialized in JSON 带有  toJSON  函数的对象将被运行。如果这些函数抛出错误,它将冒泡到调用者。 const obj = {   foo: "ignored",   toJSON() {     throw new Error("Oh no!");   }, };  JSON.stringify(obj); // => Error: Oh no! 你可以传递第二个参数,称为  replacer 。如果这个函数抛出一个错误,它将冒泡。 JSON.stringify({}, () => {   throw new Error("Uh oh!"); }); // => Error: Uh oh!
  现在我们已经看到了  JSON.stringify  不返回字符串的情况,接下来,我们来看看如何避免这些问题。 如何避免这些问题
  没有关于如何解决这些缺陷的通用方法,所以这里只介绍一些常见的情况。  处理循环引用
  根据个人经验, JSON.stringify  在传递循环引用时最容易出错。如果这对你来说是一个常见的问题,我推荐 json-stringify-safe 包,它能很好地处理这种情况。 const stringifySafe = require("json-stringify-safe");  const a = {}; const b = { a }; a.b = b;  JSON.stringify(a); // => TypeError: cyclic object value  stringifySafe(a); // => "{"b":{"a":"[Circular ~]"}}" 封装
  你可能想用你自己的自定义函数来封装  JSON.stringify 。你可以决定你想要它做什么。错误应该冒出来吗?如果 JSON.stringify  返回 undefined ,应该怎么做?
  例如,Signal Desktop有一个名为 reallyJsonStringify 的函数,它总是返回一个用于调试的字符串。就像这样  function reallyJsonStringify(value) {   let result;   try {     result = JSON.stringify(value);   } catch (_err) {     // If there"s any error, treat it like `undefined`.     result = undefined;   }    if (typeof result === "string") {     // It"s a string, so we"re good.     return result;   } else {     // Convert it to a string.     return Object.prototype.toString.call(value);   } } 关于TypeScript类型的说明
  如果你已经在用 TypeScript,可能会惊讶地发现,TypeScript对  JSON.stringify 的官方定义在这里并不正确。它们实际上看起来像这样: // Note: 这里面简化过 interface JSON {   // ...   stringify(value: any): string; }
  不幸的是,这是一个长期存在的问题,没有一个完美的解决方案。
  你可以尝试修补  JSON.stringify  的类型,但每个解决方案都有一定的缺点。我建议用自定义类型定义自己的包装器并。例如,Signal Desktop的reallyJsonStringify  的模板: function reallyJsonStringify(value: unknown): string {   // ... 总结JSON.stringify  有时会返回 undefined ,而不是一个字符串 JSON.stringify  有时会抛出一个错误 我们可以通过用不同的方式包装函数来解决这个问题
  希望这篇文章能让你对  JSON.stringify  有更全面的了解。
  我是刷碗智,励志退休后要回家摆地摊的人,我们下期见。
  作者:BlackLivesMatter 译者:前端小智 来源:devinduct 原文:https://evanhahn.com/when-stringify-doesnt-return-a-string

编程英语单词幸福编程之英语学习篇。英语单词学习打卡第一天!程序员在日常程序编写过程中有一件简单而让人头疼的事,那就是命名变量,虽然有些编程语言支持使用中文来命名变量,但是程序开发过程中不推荐使360手机卫士推出拦截网购诈骗网站新功能随着双十一抢购热潮的结束,根据以往经验判断,在未来的几天至十几天的时间里,往往是网络诈骗的高峰期。钓鱼网站挂马网站冒充网站二维码扫描或冒充店铺工作人员等诈骗方式层出不穷。为此,近日你喜欢手机还是单反的拍照效果?一般都是用手机拍照,手机方便随时从衣服包里拿出来照像和摄像,照好发给头条和微信那是非常方便。单反相机是专门照人像要洗出像片出来更好,效果比手机更明更有层次感,像素比手机还是要好太多银河系与仙女座星系终将上演惊天大碰撞,太阳系真的会平安无事吗?在宇宙当中天体之间的碰撞是最为常见的事情了。地球就是在不断的碰撞中形成的。从某种意义上讲碰撞不是毁灭而是重生。50亿年后太阳变成了红巨星,就会严重威胁着地球上的人类的生存。可是你知有人说金星距离地球比较近,为什么人类不选择登陆金星?其实人类是先选择去了探索金星之后,发现一再失望,才最终把主要精力放在火星上。探索之前其实,如果不到金星和火星金星探测。科学家也会认为去金星远比去火星划算。我们可以对比一些数据就会知华为与长安的智能电动汽车合作伙伴关系扩展到包括芯片四位知情人士表示,中国的华为技术有限公司(HWT。UL)正在扩大与国有的重庆长安汽车有限公司的电动智能汽车合作伙伴关系,以及包括汽车用半导体的设计和开发。两位消息人士称,这两家公司网商银行逐步停止支付宝余额转入功能新京报贝壳财经讯(记者潘亦纯)4月19日,针对网商银行暂停支付宝转入功能这一消息,网商银行方面回应贝壳财经记者称,公司基于业务规则调整,逐步停止支付宝余额转入的功能,同时,仅支持本哪些行业场景天然适配小程序?小程序的定位是即用即走的服务,对用户的粘性较弱,特别适合工具类行业的应用场景。场景1健康码类场景健康码属于用户需要查询某类信息的场景,查询得到该信息即完成目标。如果使用公众号H5来有人说互联网行业的冬天来了,你怎么看?互联网行业未来的发展前景怎么样?目前这个时候不是互联网行业的冬天来了,而是经济危机的寒冬来了,冬天来了就不只是针对某一个行业,而是大环境,主要原因是1每隔10年一次的经济周期,使经济发展到了一个拐点,前面的高速发工业富联又出手,4个月投资额接近去年全年4倍!青睐这类项目长期扎根先进制造与工业互联网领域的工业富联(601138)开始加码对外投资业务,新设私募公司,最新完成思灵机器人独家战略投资,且今年以来其对外投资金额已超百亿元,接近去年全年投资总比特币重回40,000美元这是接下来可能发生的事情最近几周,加密货币市场出现了一些重大挫折。BTC受到市场萎缩的打击。在3月下旬达到2022年4。9万美元的峰值之后,该资产此后持续下滑,让投资者对其下一站持矛盾态度。在持续下跌之后
拼多多公开虚假宣传和忽悠消费者这么多年,为什么没有法律敢管?6万人砍拼多多到小数点后6位仍失败,也验证了那句话,供需关系决定价格,而商家把越来越多的精力放在研究需求端的人性上,大数据杀熟砍价刷单刷评论等等,毕竟价格这个东西由供需关系决定,只支付宝余额将不能直接转入网商银行,为何?移动支付网4月19日消息,网商银行于日前发布网商银行类账户相关业务调整及福利金升级公告,对网商银行类户入金规则进行调整。公告显示,自2022年4月21日起,网商银行将逐步暂停支付宝专家热议银行数字化转型要充分释放数据价值潜能来源经济参考报2022清华五道口全球金融论坛日前在北京举行,在主题为数字经济与金融机构创新的全体大会上,与会人士围绕金融机构数字化转型的路径和方向进行讨论。与会专家认为,数据是数字畅联股份,步步高,招商银行,中交地产,荣盛发展,青海春天立昂技术是大数据概念。招商银行是银行概念。高新兴是软件开发概念。泰禾集团是住宅开发概念。荣盛发展是住宅开发概念。北汽蓝谷是新能源车概念。贵研铂业是小金属概念。金晶科技是建筑节能概念8点1氪丨民航局发布东航事故调查初步报告腾讯视频再次宣布涨价个人养老金制度即将出炉,每人每年缴纳上限或为12000元上市进行时圆心科技36氪获悉,据港交所披露,北京圆心科技集团股份有限公司递表港交所主板,高盛与中信证券担任其联席保荐人。圆心科技2015年成立于北京,根据弗若斯特沙利文,按照202如果你是手机产品经理,你会怎么做?要求1。你是公司的高管(位置类似于卢总这种,我只对小米的高管熟悉),你的长期目标给公司带来收益,做大做强!2。一切基于实际,比如说华为断芯,小米冲击高端,魅族活下去,拯救者专注游戏京东方总裁高文宝SID60周年三大创新理念引领产业可持续发展当地时间5月11日,以显示行业奥斯卡之称享誉全球的国际显示周(SIDDisplayWeek2022)在美国圣何塞正式启幕,今年这一全球顶级行业盛会也迎来了其60周年盛大庆典。BOE数字科技助力中医药与时代对话吴晓旭随着互联网大数据人工智能等为代表的数字技术向经济社会各领域全面渗透,我省紧跟时代步伐,提出构建数字基础设施数字核心产业数字融合应用数字治理能力数字生态体系五位一体的发展格局,AI智能垃圾桶产品规划视频加载中(上面的的这个视频,呈现的是AI智能垃圾桶的移动底测调试过程)家用场景第一代AI垃圾桶功能1。可移动底盘模块2。视觉模块自我避障功能3。语音控制包括唤醒及简短命令4。AP京东618将于23日晚8点开启海量电脑数码产品至高享24期免息5月20日,以人间烟火气与有责任的供应链618京东和你在一起为主题的京东618启动发布会在线上举行,正式公布今年618将于5月23日晚8点开启。京东零售CEO辛利军在发布会上表示,美国防部将百亿云计算合同授予时间推迟至12月微软(MSFT。US)亚马逊(AMZN。US)等或受影响智通财经APP获悉,美国国防部周二表示,将把云计算合同(JWCC)授予时间推迟至12月(原定于下月),这可能会对微软(MSFT。US)亚马逊(AMZN。US)谷歌(GOOG。US)