JSON 设计得真的反人类,为什么不能像 PHP 数组那样简洁明了?

2022-03-16 11:29:35 +08:00
 kisshere
我到现在都还没搞明白什么时候该用大括号,什么时候该用中括号,另外,我还是没搞明白 key 到底要不要加引号???加不加引号是否影响各种浏览器兼容性?为什么不像 php7 那样直接全部用中括号,统一格式,简洁明了。这为本来就复杂的前端更加雪上加霜
15475 次点击
所在节点    程序员
134 条回复
summerLast
2022-03-16 15:10:15 +08:00
@lancelock 哈哈哈,这就是楼主为啥混乱了,数组 字典 明明是一个写法啊
FrankHB
2022-03-16 15:14:25 +08:00
@raptor 可能你学得语言还是不够多;你的说法显然不对:C++ 自带的数组和“字典”(std::unordered_map) 都用 [] 操作符访问元素。

严格来讲,理解偏差完全就不该是 PHP 的锅;问题来自数组(array) 这个概念本身。

array 这玩意儿作为数据结构在早年( 1950 年代)就极其模糊,但硬要说一般的外延,就是所谓的关联数组(associative array) :一个 key 对应到作为数组元素的 value 的映射。
用类 ALGOL 语言的习惯来讲,就是能用 [] 的里面塞 key 的东西,所谓 subscritable 。
至于这个 key 是个整数,来使 [] 里面放 key 取得元素能有明确 O(1) 时间复杂度的随机访问,那是实现细节。用连续存储的线性表实现叫向量(vector) 。
特别地,向量一般具有确定的静态空间上界。不具有上界限制的线性表叫串(string) 。(虽然严格来讲,数学上的串不一定在乎复杂度要求,不过不少算法实际上隐含了要求。)
其它实现可以有不同的计算复杂度性质。
例如二叉搜索树(BST) 可以实现平均 O(log n) 的元素访问,同时在插入和删除元素上比向量更优化。这种索引结构在 C++ 中叫 map ,会跟数学上的映射(map) 产生歧义;之后的一些其它语言改叫字典(dictionary) 。
而散列表(hash table) 能实现平摊(amortized) O(1) 的访问和增删操作。
另外还有 Illffe vector 等特定于实现而不常被应用直接使用的数据结构。

向量因为早年机器实现的开销较小的关系曾经流行过,例如 B 语言自带支持。然而自从抄了 B 的 C 把向量硬叫做数组以后,到处都乱了。
C 的流行影响了很多语言,导致这些语言设计中的词汇表混乱——该叫向量的不叫向量而叫数组,别的就顺带乾坤大挪移了。典型的像 C++ ,vector 被用于原本叫做 string 的数据结构上,而 string 则用作特指混了 char_traits 这种二道贩子实现细节私货的特定实现。
以 C 为中心在另一方面也是无耻的;考虑 1957 年就开工的 APL ,(虽然代码模样不咋地)人家混饭吃的核心、不知比你 vector 屌多少倍的 array 就这样被偷换概念了,好意思不?

所以 PHP 这种设计反而是文艺复兴,恢复了 array 历史上应有的本来面目。

题外话:
1.其实向量的 O(1)也就是形式上的。所以广泛使用向量实现数组的语言嘛……
像 C 都没保证下标访问的复杂度,所以实际上也没禁止实现使用树或者散列表实现内建数组。
C++倒是隐含了随机访问迭代器 O(1)访问要求,考虑到和内建指针以及数组的关系,实现基本别无选择。但这也不是正经的限制。
更要命的是一旦放在主存上,主流环境根本无法严格实现。
典型的宿主(hosted) 实现,不保证实时性,自然不直接提供这种物理上保证 O(1)的例程——比如程序跑一半可能切出去调度了。
即便不考虑那么流氓的情况,现代 CPU 上的缺页中断里可以允许用户编码明显不 O(1)的非平凡程序,现实也很可能一个程序跑一半换页了结果一个访问突然卡上几百万倍;或者可能有更倒霉的,比如正好放 swap 的机械硬盘有坏道但宿主系统装作系统完整可用的情况——实际上也根本没保证可终止,更别说 O(1)了。
2.如果忽略修改之类的副作用而只允许构造和访问元素,一元函数(更确切地,映射)和 subscritable 形式的数组同构,都可以用 → 类型构造器表达的类型为其定型(typing) 。所以纯函数式语言不强调数组,是根本不需要。
FrankHB
2022-03-16 15:18:22 +08:00
@FrankHB 淦,合并回复的修改好像被吃了……
C++ 自带的数组和“字典”(std::unordered_map) 都能用 {} 初始化,而都用 [] 操作符访问元素。
guanhui07
2022-03-16 15:21:51 +08:00
PHP 在编程社区风评不好,和你这样的发言脱不了干系
kooze
2022-03-16 15:26:02 +08:00
难怪之前 phper 我要数组的时候,他给我:
{
"0": {...},
"1": {...},
"2": {...}
}
Felldeadbird
2022-03-16 15:28:10 +08:00
我猜 楼主应该是想表达 PHP 数组 定义爽。例如一个深层的多维数组 $a['b']['c']['d']['e'].... = 1;

换到 JSON 下,就要 { "a": { "c" : { "d" : { "e" { .... : 1 } } } } }
markgor
2022-03-16 15:31:59 +08:00
@nitmali #79 为什么非要认为 Array == Object ?
jessun1990
2022-03-16 15:44:36 +08:00
@luodaoyi 我这里反而不喜欢,主要是缩进不能弄错,编辑文件有点麻烦。我觉得 toml 可能更好些。
peterjose
2022-03-16 15:47:16 +08:00
有个东西叫标准....
nitmali
2022-03-16 16:21:47 +08:00
@markgor 你这样比较有啥意义,你看看 typeof(new Array())
nitmali
2022-03-16 16:24:51 +08:00
@markgor 看看原型链就知道 一切都是对象
kunkunzhang
2022-03-16 16:32:38 +08:00
不是前端还是 php 的问题,是你的问题。。。。
MrYELiex
2022-03-16 16:36:05 +08:00
@nitmali 这么说显得你前端基础很差....Array 确实是继承 Object 但是 js 实现上本身有连续数组和非连续数组的概念 引擎实现上也会有对应的优化 不然就全部当对象去初始化变量好了 反正 a[1]也一样能用
nitmali
2022-03-16 16:38:46 +08:00
@MrYELiex 我只是说 “那对于 js 来说 确实数组也是对象”,没啥问题
JaguarJack
2022-03-16 16:40:36 +08:00
楼上的喷楼主就完事了!为什么要喷 PHP ?够睿智的。
zthxxx
2022-03-16 17:14:27 +08:00
@fkdtz #69
@FrankHB #82

JS 里除了 TypedArray 以外的普通 Array 在实现上也是 Object ,元素存储也是 kv 索引
asuraa
2022-03-16 17:21:58 +08:00
@jessun1990 toml 更好 哈哈 这个我也喜欢
brazz
2022-03-16 17:22:15 +08:00
为本来就黑的 php 雪上加霜
dongfang
2022-03-16 17:34:43 +08:00
PHP 程序员连数据结构的最基础的知识都不懂吗?
大一新生也知道什么是数组,什么是 map 吧???
keepeye
2022-03-16 17:36:34 +08:00
我怀疑你是来骗铜币的,但是我没有证据

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/840707

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX