18.字符串

优质
小牛编辑
124浏览
2023-12-01

原文: http://exploringjs.com/impatient-js/ch_strings.html

字符串是 JavaScript 中的原始值和不可变的。也就是说,与字符串相关的操作总是会生成新的字符串,并且永远不会更改

18.1。普通字符串字面值

纯字符串字面值由单引号或双引号分隔:

const str1 = 'abc';
const str2 = "abc";
assert.equal(str1, str2);

单引号更常用,因为它更容易用双引号提及 HTML。

下一章涵盖 _ 模板字面值 _,它们为您提供:

  • 字符串插值
  • 多行
  • 原始字符串字面值(反斜杠没有特殊含义)

18.1.1。逃离

反斜杠可让您创建特殊字符:

  • Unix 换行符:'\n'
  • Windows 换行符:'\r\n'
  • 标签:'\t'
  • 反斜杠:'\\'

反斜杠还允许您使用该字面值内的字符串字面值的分隔符:

'She said: "Let\'s go!"'
"She said: \"Let's go!\""

18.2。访问字符和代码点

18.2.1。访问 JavaScript 角色

JavaScript 没有字符的额外数据类型 - 字符总是作为字符串传输。

const str = 'abc';

// Reading a character at a given index
assert.equal(str[1], 'b');

// Counting the characters in a string:
assert.equal(str.length, 3);

18.2.2。通过for-of访问 Unicode 代码点并进行传播

通过for-of或扩展(...)迭代字符串访问 Unicode 代码点。每个代码点由 1-2 个 JavaScript 字符表示。有关详细信息,请参阅本章中有关原子的部分。

这是通过for-of迭代字符串的代码点的方法:

for (const ch of 'abc') {
  console.log(ch);
}
// Output:
// 'a'
// 'b'
// 'c'

这就是你通过传播将字符串转换为代码点数组的方法:

assert.deepEqual([...'abc'], ['a', 'b', 'c']);

18.3。通过+进行字符串连接

如果至少有一个操作数是字符串,则加号运算符(+)将任何非字符串转换为字符串并连接结果:

assert.equal(3 + ' times ' + 4, '3 times 4');

如果要逐个组合字符串,则赋值运算符+=非常有用:

let str = ''; // must be `let`!
str += 'Say it';
str += ' one more';
str += ' time';

assert.equal(str, 'Say it one more time');

顺便说一句,这种组合字符串的方式非常有效,因为大多数 JavaScript 引擎都在内部优化它。

练习:连接字符串

exercises/strings/concat_string_array_test.js

18.4。转换为字符串

这是将值x转换为字符串的三种方法:

  • String(x)
  • ''+x
  • x.toString()(对undefinednull不起作用)

建议:使用描述性和安全性String()

例子:

assert.equal(String(undefined), 'undefined');
assert.equal(String(null), 'null');

assert.equal(String(false), 'false');
assert.equal(String(true), 'true');

assert.equal(String(123.45), '123.45');

布尔值的陷阱:如果通过String()将布尔值转换为字符串,则无法通过Boolean()将其转换回来。

> String(false)
'false'
> Boolean('false')
true

18.4.1。字符串化对象

普通对象具有一个不太有用的默认表示:

> String({a: 1})
'[object Object]'

数组有更好的字符串表示,但它仍然隐藏了很多信息:

> String(['a', 'b'])
'a,b'
> String(['a', ['b']])
'a,b'

> String([1, 2])
'1,2'
> String(['1', '2'])
'1,2'

> String([true])
'true'
> String(['true'])
'true'
> String(true)
'true'

字符串化函数返回其源代码:

> String(function f() {return 4})
'function f() {return 4}'

18.4.2。自定义对象的字符串化

您可以通过实现方法toString()来覆盖字符串化对象的内置方式:

const obj = {
  toString() {
    return 'hello';
  }
};

assert.equal(String(obj), 'hello');

18.4.3。字符串化值的另一种方法

JSON 数据格式是 JavaScript 值的文本表示。因此,JSON.stringify()也可用于字符串化数据:

> JSON.stringify({a: 1})
'{"a":1}'
> JSON.stringify(['a', ['b']])
'["a",["b"]]'

需要注意的是,JSON 仅支持null,布尔值,数字,字符串,数组和对象(它总是将它们视为由对象字面值创建)。

提示:第三个参数允许您打开多行输出并指定缩进量。例如:

console.log(JSON.stringify({first: 'Jane', last: 'Doe'}, null, 2));

该语句产生以下输出。

{
  "first": "Jane",
  "last": "Doe"
}

18.5。比较字符串

可以通过以下运算符比较字符串:

< <= > >=

需要考虑一个重要的警告:这些运算符基于 JavaScript 字符的数值进行比较。这意味着 JavaScript 用于字符串的顺序与字典和调用簿中使用的顺序不同:

> 'A' < 'B' // ok
true
> 'a' < 'B' // not ok
false
> 'ä' < 'b' // not ok
false

正确比较文本超出了本书的范围。它通过支持 ECMAScript 国际化 APIIntl)。

18.6。文本原子:JavaScript 字符,代码点,字形集群

快速回顾关于 Unicode 的章节:

  • 代码点:Unicode 字符,范围为​​21 位。
  • UTF-16 代码单元:JavaScript 字符,范围为​​16 位。代码点编码为 1-2 个 UTF-16 代码单元。
  • 字形簇:_ 字素 _ 是书面符号,显示在屏幕或纸上。 _ 字形簇 _ 是编码字素的 1 个或多个代码点的序列。

要在 JavaScript 字符串中表示代码点,请使用一个或两个 JavaScript 字符。通过.length计算字符时可以看到:

// 3 Unicode code points, 3 JavaScript characters:
assert.equal('abc'.length, 3);

// 1 Unicode code point, 2 JavaScript characters:
assert.equal('