纠纷奇闻社交美文家庭
投稿投诉
家庭城市
爱好生活
创业男女
能力餐饮
美文职业
心理周易
母婴奇趣
两性技能
社交传统
新闻范文
工作个人
思考社会
作文职场
家居中考
兴趣安全
解密魅力
奇闻笑话
写作笔记
阅读企业
饮食时事
纠纷案例
初中历史
说说童话
乐趣治疗

你不知道的JSON。stringify

1月5日 夜如影投稿
  JSON。stringify是我们经常用到的的一个方法,它主要作用是将JavaScript值和对象转换为字符串。如:JSON。stringify({foo:bar});{foo:bar}JSON。stringify(123);123
  但是JS的许多地方都有问题,这个函数也不例外。我们可能会想象一个叫做stringify的函数总是返回一个字符串。。。。。。但它并没有!
  例如,如果你尝试stringifyundefined,它返回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(functionfoo(){});undefinedJSON。stringify((){});undefinedfunctionbar(){}bar。someProperty123;JSON。stringify(bar);undefined尝试序列化symbol也会返回undefined。JSON。stringify(Symbol(computerswereamistake));undefined在浏览器中,试图序列化被废弃的document。all也会返回undefined。undefined
  这只影响到浏览器,因为document。all在其他环境中是不可用的,比如Node。带有toJSON函数的对象将被运行,而不是试图正常地序列化它们。但是如果toJSON返回上面的一个值,试图在顶层序列化它将导致JSON。stringify返回undefined。JSON。stringify({toJSON:()undefined});undefinedJSON。stringify({ignored:true,toJSON:()undefined});undefinedJSON。stringify({toJSON:()Symbol(heya)});undefined你可以传递第二个参数,称为replacer,它可以改变序列化的逻辑。如果这个函数为顶层返回上述值之一,JSON。stringify将返回undefined。JSON。stringify({ignored:true},()undefined);undefinedJSON。stringify(〔ignored〕,()Symbol(hello));undefined
  需要注意的是,其中的许多东西实际上只影响到顶层的序列化。例如,JSON。stringify({foo:undefined}),返回字符串{},这并不令人惊讶。
  我还想提一下,TypeScript的类型定义在这里是不正确的。例如,下面的代码类型的校验可以通过:constresult:stringJSON。stringify(undefined);
  在第2部分中,我们将讨论如何更新TypeScript的定义以确保其正确性。
  JSON。stringify也可能遇到问题,导致它抛出一个错误。在正常情况下,有四种情况会发生:循环引用会导致抛出一个类型错误。constb{a};a。JSON。stringify(a);TypeError:cyclicobjectvalue
  注意,这些错误消息在不同浏览器可能提示是不样的,例如,Firefox的错误信息与Chrome的不同。BigInts不能用JSON。stringify进行序列化,这些也会导致一个TypeError。JSON。stringify(12345678987654321n);TypeError:BigIntvaluecantbeserializedinJSONJSON。stringify({foo:456n});TypeError:BigIntvaluecantbeserializedinJSON带有toJSON函数的对象将被运行。如果这些函数抛出错误,它将冒泡到调用者。constobj{foo:ignored,toJSON(){thrownewError(Ohno!);},};JSON。stringify(obj);Error:Ohno!你可以传递第二个参数,称为replacer。如果这个函数抛出一个错误,它将冒泡。JSON。stringify({},(){thrownewError(Uhoh!);});Error:Uhoh!
  现在我们已经看到了JSON。stringify不返回字符串的情况,接下来,我们来看看如何避免这些问题。如何避免这些问题
  没有关于如何解决这些缺陷的通用方法,所以这里只介绍一些常见的情况。处理循环引用
  根据个人经验,JSON。stringify在传递循环引用时最容易出错。如果这对你来说是一个常见的问题,我推荐jsonstringifysafe包,它能很好地处理这种情况。conststringifySaferequire(jsonstringifysafe);consta{};constb{a};a。JSON。stringify(a);TypeError:cyclicobjectvaluestringifySafe(a);{b:{a:〔Circular〕}}封装
  你可能想用你自己的自定义函数来封装JSON。stringify。你可以决定你想要它做什么。错误应该冒出来吗?如果JSON。stringify返回undefined,应该怎么做?
  例如,SignalDesktop有一个名为reallyJsonStringify的函数,它总是返回一个用于调试的字符串。就像这样functionreallyJsonStringify(value){try{resultJSON。stringify(value);}catch(err){Iftheresanyerror,treatitlikeundefined。}if(typeofresultstring){Itsastring,soweregood。}else{Convertittoastring。returnObject。prototype。toString。call(value);}}关于TypeScript类型的说明
  如果你已经在用TypeScript,可能会惊讶地发现,TypeScript对JSON。stringify的官方定义在这里并不正确。它们实际上看起来像这样:Note:这里面简化过interfaceJSON{。。。stringify(value:any):}
  不幸的是,这是一个长期存在的问题,没有一个完美的解决方案。
  你可以尝试修补JSON。stringify的类型,但每个解决方案都有一定的缺点。我建议用自定义类型定义自己的包装器并。例如,SignalDesktop的reallyJsonStringify的模板:functionreallyJsonStringify(value:unknown):string{。。。总结JSON。stringify有时会返回undefined,而不是一个字符串JSON。stringify有时会抛出一个错误我们可以通过用不同的方式包装函数来解决这个问题
  希望这篇文章能让你对JSON。stringify有更全面的了解。
  我是刷碗智,励志退休后要回家摆地摊的人,我们下期见。
  作者:BlackLivesMatter译者:前端小智来源:devinduct原文:https:evanhahn。comwhenstringifydoesntreturnastring
投诉 评论 转载

央行银保监会证监会等多部门联合发声,鼓励发展供应链金融3月22日,国务院新闻办举办新闻发布会,邀请中国人民银行副行长陈雨露,中国银保监会副主席周亮,中国证监会副主席李超,国家外汇局副局长宣昌能,就应对国际疫情影响、维护金融市场稳定……最新职场新人择业报告发布,年轻人为什么如此青睐字节跳动?近日,职场社交平台脉脉发布《互联网新人职业选择报告2021》,对于工作13年的互联网人才在就业选择上的现状进行了梳理和分析。2021年被看作是00后本科毕业生的求职元年,……赢在人缘好人脉,就是人际关系,体现的是你的人缘,是你在这个社会的人际网络。人脉不是有多少人在你面前吹捧你,奉承你,而是有多少人在你背后称颂和点赞。人脉不是在你辉煌……华为MateX2代抢费达千元?小米OPPO苹果不淡定了折叠屏手机在酒类产品中,飞天茅台绝对是最难抢的,在京东和天猫、苏宁等电商平台1499元的平价茅台一经放出,绝对是秒没!一个茅台酒纸箱都炒到500元,被许多爱酒人士称为理财产品。……iPhone13又没有大改动?库克表示你还太年轻多方透露的消息称,今年苹果在9月份会推出全新的iPhone13系列,但是根据以往经验,这次的升级恐怕不会太大,但是外观相较上一代的iPhone可能有较大的变化。最近外国媒体放出……作为苹果迷你选哪一款苹果AppleCar概念车量产呢?苹果也要造车了有媒体报道称,关键供应链厂商已证实,苹果计划在明年9月发布首款AppleCar!这比原先规划至少提前了两年时间,甚至AppleCar原型车已经在美国加州上路……小米在印度被要求补税8800万美元背后恐怕是政治原因印度财政部1月5日在一份声明中称,已经向小米印度公司发出三份述因通知,向该公司追缴65。3亿卢比(约合8800万美元)税款。印度财政部称,小米印度公司向高通和小米移动软件……传祺影豹苏神限量版,以速之名,限量983台,售价13。18万说起中国速度,苏炳添苏神一定是大家耳熟能详的,在东京奥运会上创亚洲百米赛纪录,在第十四届全运会,苏炳添又勇夺百米赛金牌,并且取得9。83s的极好成绩。传祺影豹作为发布之后就靠速……你不知道的JSON。stringifyJSON。stringify是我们经常用到的的一个方法,它主要作用是将JavaScript值和对象转换为字符串。如:JSON。stringify({foo:bar});{foo……大质量恒星能不能吞噬一颗小质量黑洞?黑洞,无论从能量上讲,还是引力上讲都是超强的。之所以称之为黑洞,就从侧面上说明有多恐怖了!听起来就不寒而栗了!吞噬恒星,不在话下!恒星和黑洞是两种性质不同的天体,从目前人……弯道超车成功?中国新能源汽车销量占全球一半上半年卖120万辆日前,乘用车市场信息联席会秘书长崔东树表示,2021年前7个月,全球新能源乘用车销量为284万辆,中国销量占比48。其中,7月占比达到53,超过全球销量的一半。全球销量具……Filecoin的价值体现,非传统模式的意义我们去评价一个人或者一个事物有没有什么价值,那么肯定会先知道或者了解这个人和事物。就像当初淘宝电商刚出来的时候,很多个人和企业觉得在网络中太过于虚拟,买东西没有现实生活中的眼见……
手机圈冷知识处理器市场份额最大的不是高通苹果,而是TA移动工作的高手,龙尚科技智能模组赋能工业平板电脑日本拟加倍补助推广电动汽车,最高补助约4。5万元宝马iX旗舰纯电SUV国内卖85万元,虽未交付却已然落后特斯英国将实行新法,要求新建筑安装电动汽车充电站盘点时速超过90公里的3款电动车,能让通行更高效,你喜欢哪款福特汽车和Rivian宣布放弃共同开发电动汽车的计划中国移动安徽公司推出我为群众办实事八项服务举措2022款宋ProDMi将于11月30日开启预订匮电油耗4。比亚迪元Plus发布最大续航510公里,明年1月1日开启预售磷酸铁锂版特斯拉Model3冬季夏季续航能耗测试损耗约21细分内容复购优先OPPO的全渠道布局殊途同归?
等待和期盼的心情短语生活知识科普土豆减肥可以吃吗春夜金针菇怎么吃减肥金针菇减肥的吃法被俘造句用被俘造句大全oppo查手机号码定位系统(咋样查定位)表面变黏的黄瓜有毒吗个方法帮你零基础快速完成的项目骊歌行傅音结局是什么?复仇成功了吗?夏天怎样盘发简单时尚欧美精致花苞盘发情境创设在中学英语教学中的运用怎么查一开始的微信聊天记录(找回微信删掉的聊天记录)

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找美丽时装彩妆资讯历史明星乐活安卓数码常识驾车健康苹果问答网络发型电视车载室内电影游戏科学音乐整形