既然字符串是一个 char 数组, 为什么语言还要定义 String 的方法,而不是是直接用 Array 的方法?

2017-07-15 21:21:25 +08:00
 xrr2016

如题, 定义 String 的方法是否多此一举,增加了程序员的负担。

4871 次点击
所在节点    程序员
44 条回复
choury
2017-07-15 21:26:29 +08:00
你说的是 C 语言?然后再定义一堆,strlen strste strcmp strcap 等等函数?
aprikyblue
2017-07-15 21:29:25 +08:00
可 C 语言就是拿 char[]做字符串,也没 String 啊……
xrr2016
2017-07-15 21:35:06 +08:00
@choury 在 javascript 里面也是, 既然 Array 有了 slice, splice 等方法,String 还要弄 substr, substring, 让我使用的时候还要纠结一下。
Trim21
2017-07-15 21:39:28 +08:00
在一个 array 中寻找另一个 array....
linpf
2017-07-15 21:47:27 +08:00
可以把 string 理解为 array 的派生。虽然是个 array,但他是一个特殊的 array,有字符串操作方面的特性以及限制。
wwjvtwoex
2017-07-15 21:50:15 +08:00
正则表达式
geelaw
2017-07-15 21:51:43 +08:00
因为并不是所有的 char[] 都是有效的 string。

譬如有的语言 / API 不允许 embedded null character。

再比如多个 char 可能表示的是一个字符( UTF16 的 surrogate pair、UTF8 的 continuation ),数组长度并不总是和字符串长度之间有简单的等式关系。
mooncakejs
2017-07-15 21:57:13 +08:00
@xrr2016 char array 没有编码
Perry
2017-07-15 22:00:19 +08:00
你确定是增加了负担?你想要知道一个 string 的长度没有 strlen 还不是要写一个 for loop ?
0asis
2017-07-15 22:02:05 +08:00
一言以蔽之,抽象。
就好比栈和队列实质上都可以用顺序的 array 存储,为什么还要定义这两个数据结构
xrr2016
2017-07-15 22:02:18 +08:00
@Perry 有 length 属性啊
Perry
2017-07-15 22:02:21 +08:00
slice 的方法要是直接用在 String 只能得到一个 char[] 而不是 String
firemiles
2017-07-15 22:03:40 +08:00
确认楼主没写过多少代码
xieranmaya
2017-07-15 22:21:26 +08:00
为了抽象
ETiV
2017-07-15 22:25:43 +08:00
既然 123 都是一二三
<del>为什么四不写作 亖</del>

一百不写作“一百个横”
changwei
2017-07-15 22:26:56 +08:00
因为要考虑到多字节字符的使用,所以做了一下抽象会更加方便。

比如说汉语,日语,韩语等字符,在不同的编码规则(比如说 unicode )以及编码实现(比如说 utf-8 )下,这些字符串的一个字符其实底层是多个 char 组成的。楼主试试看 php 里面的 strlen 和 mb_strlen 的区别就知道了。php 也是 c 写的,也可以看看 php 里面相关的源码来理解。
misaka19000
2017-07-15 22:29:58 +08:00
哈哈 程序员的负担可比程序的负担重要多了,机器性能那都不是事
xrr2016
2017-07-15 22:40:20 +08:00
@changwei 所以主要是因为有多种编码规则, 那么要是以后编码规则只有 Unicode 了, 就可以去掉 String 了吧.
changwei
2017-07-15 22:50:01 +08:00
@xrr2016 嗯嗯,你就把 string 当做语法糖就好了。
shihira
2017-07-15 22:51:13 +08:00
在多数的解释型语言里,抽象的成本比较高。在 js 当中,Array 是动态类型的 Array,并没有什么 Array of Char,其中每个元素都可以有不同的类型,于是访问每一个元素,解释器底层都要对这个元素识别类型、拆箱,才能开始计算,计算量 /复杂度可谓翻了个倍。但是明确钦定是 String 的时候,数据在内存里就是连续的、裸的字符序列,直接可以开始计算了。

所以,在动态类型语言或者多数的解释型语言里,该用 String 的时候不要用 Array,这很重要。

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

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

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

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

© 2021 V2EX