likes
comments
collection
share

女粉突发奇问:JSON 的键为什么必须有引号?

作者站长头像
站长
· 阅读数 20

给前端以福利,给编程以复利。大家好,我是大家的林语冰。

00. 写作背景

如题,社区里有女粉猝不及防地提问:为什么 JSON 的键被设计为必须有引号

不得不说,当时我确实有点方了,还有提问的不是面试官。作为应试教育的参与者,我并不擅长这种超纲的抽象问题。所以我只好回了一句“我女朋友找我,晚点再说”(虽然我并没有女朋友),勉强萌混过关。

但是,问题无厘头,不代表无意义。Vite 源码的 pnpm 配置使用了一种 YAML 格式的配置文件,很多工具和语言也支持 YAML。

举个栗子,这是格式化工具 Prettier 官网的示例:

女粉突发奇问:JSON 的键为什么必须有引号?

粉丝请注意,YAML 和 JSON 一龙一猪,键名真的可以没引号!那么,强制要求键名加��号、而且必须是双引号的 JSON 到底在搞什么飞机?

有时候,乍一看是几何题,其实是函数题。我发现只要使用第一性原理深度思考,就能求解女粉的知识盲区。

事实上,为什么 JSON 的键会被引号裹挟,其实更准确的等价问法是:

  • 为什么不能没有引号,比如 JSON?
  • 为什么必须是双引号,比如 "JSON"?
  • 为什么不能是单引号,比如 'JSON'?
  • 为什么不能是反引号,比如 JSON?

01. 为什么不能没有引号?

一句话解释,无引号的 JSON 发明失败了,就像本人的初恋一样悲剧......

根据 JSON 官网,JSON 是一种轻量级数据交换格式。既然是数据交换格式,JSON 的首秀自然是用于数据通信。

“JSON 之父”在地球上测试的第一条 JSON 消息类似如下:

女粉突发奇问:JSON 的键为什么必须有引号?

可以看到,这是一段测试 JSON 数据通信的普通脚本。粉丝请注意,这里 JSON 的键并没有引号,和 JS 对象字面量一模一样。

根据 JSON 官网,JSON 是一个基于 ES3 的子集,所以这种雷同 JS 对象字面量的格式完全合法。不幸的是,就跟其他许多“第一次”一样,JSON 的首秀萎了。那么,上述代码到底有何 bug 呢?

bug 在于,ES3 的保留字策略十分猪头。上述代码中,do 属性是 ES3 的同名保留字之一,而 ES3 规定,禁止保留字作为标识符。换而言之,do 保留字无法作为合法的 JSON 键名,否则运行时就会报错。

于是乎,“JSON 之父”掏出来的解决方案就是给键名加上引号,这样 do 保留字就变成了 "do" 字符串。举一反一,所有和保留字同名的特殊文本也可以作为 JSON 的合法键名。比较专业的措辞是,通过添加引号来让 JSON 文本化。

02. 为什么必须是双引号?

地球人都知道,发射双引号需要同时按下 shit + 引号键,而发射单引号只需要按下引号键就欧了,显然单引号更符合人体工程学,开发体验就跟点赞一样人性化。

比较意外的是,如今的 JSON 却反而采用了双引号......这不科学!

你知道的,JS 和 Java 一龙一猪。在 Java 等编程语言中,双引号表示的是字符串,单引号表示的却是字符。

举个栗子,这是从菜鸟教程拷贝过来的一个 Java 示例(免责声明,因为我只会 JS):

女粉突发奇问:JSON 的键为什么必须有引号?

可以看到,JS 可以不关心 字符 vs 字符串 的区别,而 Java 则会通过不同引号明确区分。

因此,作为全栈通吃的数据交互格式,JSON 的设计必须共情或 PUA 其他编程语言,格式必须尽量符合各种语言的编程直觉。这种设计就是基于 用户思维 —— 双引号可以尽量兼容各种语言的习惯,它大概率是“字符串”。

03. 为什么不能是单引号?

俗话说得好,两手都要抓,两手都要硬。JSON 采用双引号是基于用户思维,但为什么不能像 JS 一样,顺便兼容单引号呢?

举个栗子:

女粉突发奇问:JSON 的键为什么必须有引号?

这是因为,“最小化原则”让“JSON 之父”必须在单/双引号中“零和博弈”,两权相重取其轻。“JS 之父”曾经直言,“JSON 之父”是一位“极简主义者”。显然,JSON 的减法设计既符合“JSON 之父”的品味,也符合“JS 子集”的人设。

女粉突发奇问:JSON 的键为什么必须有引号?

但这不仅仅是设计者的个人偏好,你知道的,JSON 是与编程语言无关的数据交换格式。这意味着,JSON 最好能够跨语言,只支持一种引号的解析器更容易被不同语言实现,JSON 爱好者的学习曲线也更加平滑。

总之,只支持单引号更有利于推广 JSON。事实上,JSON 确实找到了“流量密码”,成为地球上人气爆棚的数据交换格式之一。

04. 为什么不能是反引号?

这可能是像我一样的 JS 爱好者才会深度思考(纠结)的问题,前文提及的用户思维和极简主义其实已经暴露了部分原因。

此外,根据 JSON 官网,JSON 一直都是基于 ES3 的子集。这意味着,JSON 一定是合法的 JS 对象字面量;反之,JS 对象字面量未必是合法的 JSON。

反引号其实是后 ES6 时代的 JS 爱好者才会接触的语法,ES6 为了区分模板字符串专门加入了反引号。在 JS 中,反引号并不像单双引号那么通用。

女粉突发奇问:JSON 的键为什么必须有引号?

可以看到,反引号既不是 JS 字符串的主流风格,也无法用来定义 JS 对象字面量的属性。

因此,作为 ES3 的子集,JSON 当时根本不会考虑反引号,以后也不会考虑。

05. 高潮总结

“JSON 之父”说过,我并没有 发明 JSON,我只是在 JS 的语法中 发现 了 JSON。

女粉突发奇问:JSON 的键为什么必须有引号?

后来,我终于学会了如何去解读其中的含义。哪怕只是一种轻量的数据交换格式,JSON 键的设计也细节满满:

  • 为什么不能没有引号?历史包袱。
  • 为什么必须是双引号?用户思维。
  • 为什么不能是单引号?极简主义。
  • 为什么不能是反引号?历史虚无。

参考文献

  1. JSONwww.json.org/json-en.htm…
  2. GitHubgithub.com/tc39/propos…
  3. Prettierprettier.io/docs/en/con…

粉丝互动

本期话题是:如何评价 JSON 的设计细节?你可以在本文下方自由言论,文明科普。

欢迎持续关注“前端俱乐部”,给前端以福利,给编程以复利。

坚持阅读的小伙伴可以给自己点赞!谢谢大家的点赞,掰掰~

女粉突发奇问:JSON 的键为什么必须有引号?

转载自:https://juejin.cn/post/7392252402495995956
评论
请登录