引子: 很多时候,当我要字符串截取时,我会想到substr和substring的方法,但是具体要怎么传参数时,我总是记不住。哪个应该传个字符串长度,哪个又应该传个开始和结尾的下标,如果我不去查查这两个函数,我始终不敢去使用它们。所以我总是觉得,这个两个方法名起的真是蹩脚。然而事实是这样的吗?

看来是时候扒一扒这两个方法的历史了。

1 基因追本溯源

在编程语言的历史长河中,曾经出现过很多编程语言。然而大浪淘沙,铅华洗尽之后,很多早已折戟沉沙,有些却依旧光彩夺目。那么stubstr与substring的DNA究竟来自何处?

1950与1960年代

  • 1954 - FORTRAN
  • 1958 - LISP
  • 1959 - COBOL
  • 1964 - BASIC
  • 1970 - Pascal

1967-1978:确立了基础范式

  • 1972 - C语言
  • 1975 - Scheme
  • 1978 - SQL (起先只是一种查询语言,扩充之后也具备了程序结构)

1980年代:增强、模块、性能

  • 1983 - C++ (就像有类别的C)
  • 1988 - Tcl

1990年代:互联网时代

  • 1991 - Python
  • 1991 - Visual Basic
  • 1993 - Ruby
  • 1995 - Java
  • 1995 - Delphi (Object Pascal)
  • 1995 - JavaScript
  • 1995 - PHP
  • 2009 - Go
  • 2014 - Swift (编程语言)

1.1 在C++中首次出现substr()

在c语言中,并没有出现substr或者substring方法。然而在1983,substr()方法已经出现在C++语言中了。然而这时候还没有出现substring, 所以可以见得:substr是stustring的老大哥

string substr (size_t pos = 0, size_t len = npos) const;

从C++的方法定义中可以看到, substr的参数是开始下标,以及字符串长度。

  std::string str="We think in generalities, but we live in details.";
std::string str2 = str.substr (3,5); // "think"

1.2 在Java中首次出现substring()

距离substr()方法出现已经有了将近十年之隔,此间涌现一批后起之秀,如: Python, Ruby, VB之类,然而他们之中并没有stustring的基因,在Java的String类中,我们看到两个方法。从这两个方法之中我们可以看到:substring方法基本原型的参数是开始和结束的下标。

String substring(int beginIndex) // 返回一个新的字符串,它是此字符串的一个子字符串。

String substring(int beginIndex, int endIndex)
// 返回一个新字符串,它是此字符串的一个子字符串。

1.3 JavaScript的历史继承

1995年,网景公司招募了Brendan Eich,目的是将Scheme编程语言嵌入到Netscape Navigator中。在开始之前,Netscape Communications与Sun Microsystems公司合作,在Netscape Navigator中引入了更多的静态编程语言Java,以便与微软竞争用户采用Web技术和平台。网景公司决定,他们想创建的脚本语言将补充Java,并且应该有一个类似的语法,排除采用Perl,Python,TCL或Scheme等其他语言。为了捍卫对竞争性提案的JavaScript的想法,公司需要一个原型。 1995年5月,Eich在10天内写完。

上帝用七天时间创造万物, Brendan Eich用10天时间创造了一门语言。或许用创造并不合适,因为JavaScript是站在了Perl,Python,TCL或Scheme等其他巨人的肩膀上而产生的。

JavaScript并不像C那样出身名门,在贝尔实验室精心打造,但是JavaScript在往后的自然选择中,并没有因此萧条,反而借助于C,C++, Java, Perl,Python,TCL, Scheme优秀基因,进化出更加强大强大的生命力。

因此可以想象,在10天之内,当Brendan Eich写到String的substr和substring方法时,或许他并没困惑着两个方法的参数应该如何设置,因为在C++和Java的实现中,已经有了类似的定义。 如果你了解历史,你就不会困惑现在。

2 所以,substr和substring究竟有什么不同?

如下图所示:substr和substring都接受两个参数,他们的第一个参数的含义是相同的,不同的是第二个参数。substr的第二个参数是到达结束点的距离,substring是结束的位置。

3 参考文献

如有不正确的地方,欢迎指正。

追本溯源:substr与substring历史漫话的更多相关文章

  1. javascript 中slice,substr,substring方法的对比

    实际开发过程中,字符串是一种最常用的一种数据类型,而在程序中对字符串的操作也是十分繁琐,javascript中就提供了很多字符串相关的方法,然而由于方法过多,很多方法功能有交叉,参数有雷同,容易使用混 ...

  2. js里slice,substr和substring的区别

    概要: string.slice(start, end)提取一个字符串 string.substring(start, end)提取一个字符串,end不支持负数 string.substr(start ...

  3. 浅析字符串操作方法slice、substr、substring及其IE兼容性

    在截取字符串时常常会用到substr().substring().slice()方法,有时混淆之间的用法,故总结下.   slice() 定义:接受一个或者两个参数,第一个参数指定子字符串的开始位置. ...

  4. Javascript中substr和substring的区别

    由于在项目中有需要对字符串进行截取,然后手残使用了IDE自动提示的substr,没想那么多以为substr和substring没多大区别. 然而并不是,且听我一一道来. 1. substr(index ...

  5. 字符串和数组中split().toString(),join(),splice(),slice(),substr()和substring()

    <!Doctype html> <head> <mate charset="utf-8"> <title>string change ...

  6. JS中substr和substring的用法和区别

    substr 和 substring都是JS 截取字符串函数,两者用法很相近,下面是两者的语法很示例: substr 方法 返回一个从指定位置开始的指定长度的子字符串.stringvar.substr ...

  7. substr和substring的区别

    substr和substring两个都是截取字符串的. 两者有相同点,如果只是写一个参数,两者的作用都是一样的:就是截取字符串当前下标以后直到字符串最后的字符串片段. 例如:`var a=”abcde ...

  8. JavaScript进阶(七)JS截取字符串substr 和 substring方法的区别

    JS截取字符串substr 和 substring方法的区别 substr方法 返回一个从指定位置开始的指定长度的子字符串. stringvar.substr(start [, length ]) 参 ...

  9. js字符串操作之substr与substring

    substr和substring两个都是截取字符串的. 两者有相同点,如果只是写一个参数,两者的作用都是一样的:就是截取字符串当前下标以后直到字符串最后的字符串片段. 例如: `var a=" ...

随机推荐

  1. SQLException: #22001你知道这个错误码吗

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! java.sql.SQLException: #22001 java.sql.SQLException: #22001 a ...

  2. vue统一注册组件

    文件夹下面组件数量较多,如果每一个组件先import然后在 components,虽然灭有问题,但是会导致代码量大,而且不直观 解决办法: 将图元组件进行统一注册 新建一个pixels文件,文件里面的 ...

  3. TypeScript入门五:TypeScript的接口

    TypeScript接口的基本使用 TypeScript函数类型接口 TypeScript可索引类型接口 TypeScript类类型接口 TypeScript接口与继承 一.TypeScript接口的 ...

  4. angularJs同步请求

    今天在写几级联动的时候,因为比如上一个接口请求数据成功返回后,才能根据上一个接口返回的数据请求下一个接口,以此类推:因此有了同步请求的想法. 在前端做同步读取显然不是好的实践做法,同步之后会严重影响前 ...

  5. 【小知识点】input输入框在安卓以及IOS手机中光标及字体不居中解决方法

    问题根本:不要使用line-height垂直居中. 解决方法:可直接定义height,然后高度由上下padding值撑开. input { height: 1rem; padding: 1rem 0; ...

  6. C++ STL 之 multimap案例之员工分组

    #include <iostream> #include <vector> #include <map> #include <string> #incl ...

  7. Python与C/C++相互调用(转)

    原文链接 作者 一.问题 Python模块和C/C++的动态库间相互调用在实际的应用中会有所涉及,在此作一总结. 二.Python调用C/C++ 1.Python调用C动态链接库 Python调用C库 ...

  8. Android SQLiteDatabase的使用

    package com.shawn.test; import android.content.ContentValues; import android.content.Context; import ...

  9. MVP架构的一个小例子

    主角: MVP是一种编程的架构模式,M=Model,负责提供数据:V=View,负责显示数据:P=Presenter,负责处理数据. 应用例子: csharp写的一个qq机器人. 一.Model层 获 ...

  10. 【uoj#94】【集训队互测2015】胡策的统计(集合幂级数)

    题目传送门:http://uoj.ac/problem/94 这是一道集合幂级数的入门题目.我们先考虑求出每个点集的连通生成子图个数,记为$g_S$,再记$h_S$为点集$S$的生成子图个数,容易发现 ...