js处理字符串和数字

字符串

字符串在自然世界中充当着非常重要的角色,所有的自然语言(比如汉语、英语等)都由多个字符组成,比如经典的 “Hello World” 这句话则由 11 个字符组成:H,e,l,l,o,,W,o,r,l,d。

创建字符串

在 JavaScript 中创建一个字符串跟其他语言并没有较大的区别,可以分别使用 ‘、” 和 ` 作为边界标识。

1
2
3
const str1 = 'string 1'
const str2 = "string 2"
const str3 = `string 3`

虽然 ` 同样可以以与 '" 一样的使用方式使用,但也可以有更高级的用法。

1
2
const target = 'World'
const word = `Hello ${target}` //=> Hello World

同时 ` 也可以用于创建一个“多行字符串”,即字符串内容中包含多行文本。

1
2
3
4
5
6
7
8
const str = `
Hello
World
`

//=>
// Hello
// World

分割字符串

一般来说人们都会使用词频统计作为数据科学的 “Hello World”,简单来说就是对一段英语内容中的单词进行频次(出现次数)统计。我们在进行词频统计之前,我们首先需要对源内容进行预处理。首先我们要了解的是,我们可以看到这段内容中有小写字母、大写字母以及标点符号(包括逗号、句号、括号、双引号、斜杠和冒号)。

而从语言角度,HELLO、hello 和 Hello 都是一样的,所以我们需要先完成以下预处理任务:

  1. 去除文本中的标点符号、数字
  2. 将所有大写字母转换为小写字母 假设原文为 “Hey dude, how is it going?”,则需要首先转换为 “hey dude how is it going”。

去除文本中的标点符号
在做任何需求之前,都需要先对需求的上下文进行多方位理解,比如去除标点符号、数字这个需求在全英语的语境下可以说是约等于只保留英文字母。这样我们就可以从文本中直接筛选出英文字母和空格即可,这里可以使用 ASCII 码进行甄别。大写字母的 ASCII 码范围为 65 到 90,即 A 到 Z,而小写字母则为 97 到 122,空格的 ASCII 码为 32,换行符的 ASCII 码为 10。在 JavaScript 可以用 string.charCodeAt() 方法获取字符的 ASCII 码。

1
2
3
4
5
6
7
8
9
10
11
const originalText = 'Hey dude, how is it going?'
let wordOnlyText = ''
for (let i = 0; i < originalText.length; ++i) {
const letter = originalText[i]
const asciiCode = letter.charCodeAt()

if ((asciiCode >= 65 && asciiCode <= 90) || (asciiCode >= 97 && asciiCode <= 122) || asciiCode === 32) {
wordOnlyText += letter
}
}
console.log(wordOnlyText) //=> "Hey dude how is it going"

将所有大写字母转换为小写字母
上面我们用到了 string.charCodeAt() 方法来获取字符的 ASCII 码,那么自然也有对应的方法用于将 ASCII 码转换为对应字符 String.fromCharCode(code)。

而从字母的 ASCII 码范围可以看到,将大写字母的 ASCII 码数值加上 32 便是其对应小写字母的 ASCII 码数值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
let lowerCaseText = ''

for (let i = 0; i < wordOnlyText.length; ++i) {
const letter = wordOnlyText[i]
const asciiCode = letter.charCodeAt()

if (asciiCode >= 65 && asciiCode <= 90) {
lowerCaseText += String.fromCharCode(asciiCode + 32)
} else {
lowerCaseText += letter
}
}

console.log(lowerCaseText) //=> "hey dude how is it going"

JavaScript 内置将文本中的大写字母转换为小写字母的 API —— string.toLowerCase()。

完成了文本的预处理之后,就可以将文本数据进行分割了。而最主要用到的方法便是 string.split(separator)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const originalText = `
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
`

let wordOnlyText = ''

for (let i = 0; i < originalText.length; ++i) {
const letter = originalText[i]
const asciiCode = letter.charCodeAt()

if ((asciiCode >= 65 && asciiCode <= 90) || (asciiCode >= 97 && asciiCode <= 122) || asciiCode === 32) {
wordOnlyText += letter
}
}

const lowerCaseText = wordOnlyText.toLowerCase()

/*---------------------------------------------------------------------*/

const words = lowerCaseText.split(' ')

console.log(words.length) //=> 163

组装字符串

字符串之间的连接可以直接使用 + 运算符完成。若当数据量比较大时,需要将多个数据量“嵌入”到一个文本模板中。一般情况下,开发工程师会选择一个较为顺手的模板引擎来实现这个功能,但在这里我们一切从简,使用 JavaScript 中的字符串模板特性 ` 来完成这个需求。

数字

除了自然语言以外,当我们需要准确地表达世界上任何事物时,我们还需要有数字的帮助。

四则运算

四则运算是所有数学运算的基础。

1
2
3
4
5
6
7
const a = 3
const b = 4

a + b //=> 7
b - a //=> 1
a * b //=> 12
a / b //=> 0.75

幂运算

幂运算,又称指数运算,是数学中非常重要的一种运算方式,具体定义便是同一个数值的多次自乘结果。有了幂运算才有后面更为深入的对数运算、导数运算、方差运算等等。在 JavaScript 中,使用 Math.pow(base, exponent) 来进行幂运算,其中 base 为底数即上式中的 n,而 exponent 则为指数即右上角的 3。

1
2
3
4
5
6
7
8
9
10
const V1 = 3 * 3 * 3
console.log(V1) //=> 27

const V2 = Math.pow(3, 3)
console.log(V2) //=> 27

const calcCubeVolume = function(sideLength) {
return Math.pow(sideLength, 3)
}
console.log(calcCubeVolume(3)) //=> 27

对数运算

数学中这就涉及了对数运算,比如求“27 是 3 的多少次方”则为

而在数学中有一个神奇的数值自然对数,关于这个数值的传奇故事你可以搜索到非常多的文章甚至视频。在 JavaScript 中的 Math.log(x) 函数只接受一个参数,而这个函数的直接作用便是计算以自然对数 为底 的对数。

那么就很奇怪了,我们要如何在 JavaScript 中计算并非以为底的对数结果呢?这得先回到数学推导上来。对数中有一个经典公式为换底公式,定义如下:

具体推导可以参考维基百科页面 · 对数。那么代入我们前面公式中就可以用这样的方式解决了。

换成使用 JavaScript 实现便是:

1
2
3
4
5
function getBaseLog(base, x) {
return Math.log(x) / Math.log(base)
}

console.log(getBaseLog(2, 1024)) //=> 10
-------------本文结束感谢您的阅读-------------