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

你不知道的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

一台6年前128G的iPhone7PLUS,放现在,相当于什么价位的手机?我从转转上花1118买了一台128G的iPhone7Plus,从性能影像续航多个方面来看一下8年前的iPhone7Plus,相当于现在什么价位的手机。在性能方面iPhone7Plu考拉海购平台是干什么的经常听很多朋友们提起考拉海购这个平台,那么考拉海购平台到底是干什么的呢?接下来的内容我们就这个问题为大家做详细的解答,如果您也对考拉海购感兴趣,不妨一起来了解一下。考拉海购平台是阿多只妖股新高,埋伏还是追高市场终于反弹,妖股方面,九安医疗再板新高,湖北广电地天板,冰山冷热新高,海辰药业卡位两个20cm,证明市场炒作情绪依然高亢。今天上市的新股天岳先进,是中国碳化硅衬底第一股,市占率全中概互联网股票集体大涨业内认为是否见底仍有待观察读创深圳商报记者钟国斌隔夜美股中概互联网股领涨,京东上涨10。29,新东方上涨7。34,拼多多上涨5。32,阿里巴巴上涨3。03与此同时,12日港股恒生指数大涨2。79,互联网板块中移动中联通流量包揭谜新卡流量糊涂账老卡资费难降档来源中国消费者报前不久,人民日报发表了有关话费套餐宣传不实降档受阻营销诱导等情况时有发生,亟待规范的读者来信,指出运营商免流量涉嫌虚假宣传,免流范围有限制且不明确。此外,用户想降低独家丨支付宝金选投顾被叫停21世纪经济报道记者姜诗蔷北京报道21世纪经济报道记者独家获悉,支付宝联合6家机构在今年1月4日推出的重磅投顾新品金选投顾目前已经被叫停。据21世纪经济报道记者了解,支付宝金选投顾骁龙88812GB256GB65W快充,从3399跌至2249元,真我GT大降价近期,市面上诞生了好几款骁龙8Gen1芯片手机,不过定价都不便宜,小米12系列iQOO9系列的起售价都在3500元以上。这让不少消费者感觉这些新款手机的价格虚高,这种情况下,不少消最早的QQ用户现在怎么样了?有个流传甚广的一句话鬼故事叫做,00后已到合法婚龄。现在这个故事迎来了续集再过1个月,就是腾讯QQ的23周岁生日。那些23年前为了解锁太阳的青涩少年,已经步入中年。当00后开始独当什么是社会企业互联网时代,又产生了一类全新的企业,马云称之为社会企业。为什么全新的第三类企业会把自己定义为社会企业呢?站在西方经济学的角度观察,我们会觉得是马云想炫耀自己想承担更多的社会责任和义5部手机同时抽中2300元优惠券,扫地机器人大奖背后是何套路?律师涉嫌欺诈标价2680元的扫地机器人,中奖后优惠只要380元。近两年来,不少网友见过这样的抽奖活动,也中过类似的奖。果真是中奖了吗?近日,红星新闻记者用5部不同的手机同时点击同一抽奖链接进行美团公开新专利指纹解锁共享单车IT之家1月12日消息,近日,美团关联公司北京三快在线科技有限公司公开车辆解锁方法装置共享车辆及存储介质专利,公开号CN113920618A。企查查专利摘要显示,该专利通过在共享车
中国之所以很难实现科技创新,是因为缺乏科学家精神,你认同吗?本身这就是个不怀好意的伪命题!谁说中国很难实现科技创新?创新需要可以创新的环境。如果爹妈天天说这不行,那不行,孩子就没有创新力。如果我们有万能的上帝,也用不着我们创新。不赞同,实际电驱系统单车价值超万元,将是新能源车中下一个长坡厚雪赛道一电驱系统单车价值超万元,将是新能源车中下一个长坡厚雪赛道!中金公司指出,新能源汽车中的电驱系统单车价值量超万元,未来全球市场空间超万亿元,有望成为继动力电池系统之后的第二个长坡厚支付宝,不知道该说你啥好最近这段时间支付宝总是在手机上推送一个信息给我,内容就是送给我一个200元的红包,让我去支付宝领取,我一直坚信天上不可能掉馅饼,对吧,从来都不管这个信息,都是直接划掉,昨天不小心在一加小米旗舰怎么选?看看这两款就知道了一加9Pro一加9Pro最近还是提升了很多,最近鲁大师公布了今年上半年手机UI流畅榜,其中一加9Pro装配的ColorOSforOnePlus系统位居第4。并且最为流行的截屏操作基助听器外置受话器和内置受话器有什么区别?受话器外置式助听器比耳背式助听器更小巧,佩戴更隐蔽,受话器靠近鼓膜,听声音更清晰佩戴更舒适,可以开放而验配,减少堵耳效应。后期听力下降,可以直接更换受话器即可。耳背式助听器功率大,耳朵做过手术可以配定制式助听器吗?首先要看过你的耳道,还有检测过你的听力,订制式的助听器有功率限制的。一般做过手术的耳朵不建议做订制机,具体要到验配中心检查测试。您好,耳朵做过手术可以配定制式助听器吗?主要看耳朵做集成灶的功能有哪些,怎么样?谢邀很多人总把集成灶想得很复杂,其实,集成灶顾名思义就是功能集成,集油烟机燃气灶蒸箱消毒柜烤箱等功能于一体。功能一烟灶功能,将油烟机设计在侧面,实现更高效的油烟吸净率火星人集成灶4戴上助听器后,以后会越戴越聋吗?长期佩戴助听器不会越戴越聋!反而有了声音传递,大脑会灵活反应。佩戴助听器可以使患者的听能力进步,分辨率提高,随着佩戴时间的加长,患者逐渐习惯助听器,会不断提高听声音的能力。助听器会耳道式助听器有什么缺点?您好,耳道式助听器有什么缺点?耳道式助听器是塞在耳朵里面的,做的比较小功率受限制不能做大塞在耳朵里面的容易引发中耳炎患者的中耳炎,耵聍容易堵住出声口,希望我的回答能够帮助到您。你好为什么说双耳佩戴助听器比单耳更好?1。首先,双耳聆听有助于声源定位,就是对发声物体位置的判断。如果双耳听觉障碍患者而言,如果只对一侧助听,无论来自哪个方向的声音,大多会被听力水平好的一侧识别,这样是无法判断声源的方造车企业们不务正业?L5自动驾驶或最早落地机器人文丨光锥智能,作者刘鉴最近的造车企业们都齐刷刷开始了不务正业。9月7日,小鹏汽车生态企业鹏行智能发布首款智能机器马。而再早之前,先是风风火火百亿造车的小米在8月10日推出了机器狗铁