字符串
原文地址:https://wangdoc.com/javascript/
概述
JavaScript不区分单引号和双引号。
'abc'
"abc"
字符串与数组
JavaScript的字符串可以视为字符数组,因此可以使用方括号加索引的方式访问某个位置的字符。
var s = "hello";
s[0] // h
"hello"[0] //h
如果索引超出范围,会返回undefined。
但是,字符串和数字的相似性仅此而已。实际上,无法改变字符串之中的单个字符。
var s = "hello";
delete s[0];
s // "hello"
s[1] = "a";
s // "hello"
s[5] = "!"
s // "hello"
length属性
length属性返回字符串的长度,该属性也是无法改变的,但是给length赋值不会报错。
var s = "hello";
s.length // 5
s.length = 3;
s.length // 5
字符集
JavaScript使用Unicode字符集。JavaScript引擎内部,所有字符都用Unicode表示。我们还需要知道,每个字符在JavaScript内部都是以16位(即2个字节)的UTF-16格式存储。也就是说,JavaScript的单位字符长度固定为16位长度,即2个字节。
但是,UTF-16有两种长度:对于码点在U+0000到U+FFFFU+FFFF之间的字符,长度为16位(即2个字节);对于码点在U+10000到U+10FFFF之间的字符,长度为32位(即4个字节),而且前两个字节在0xD800到0xDBFF,后两个字节在U+DC00到0xDFFF之间。举例来说,码点U+1D306对应的字符为𝌆,它写成UTF-16就是0xD834 0xDF06。
由于历史原因,JavaScript对于UTF-16的支持是不完整的,只支持2个字节的字符,不支持4个字节的字符。所以𝌆会被认为是2个字符。
"𝌆".length // 2
总结一下,对于码点在U+10000到U+10FFFF之间的字符,JavaScript总是认为它们是两个字符(length属性 为2),也就是说JavaScript返回的字符串长度可能是不正确的。
Base64转码
所谓Base64就是一种编码方法,可以将任意值转成09、AZ、a~z、+和/这64个字符组成的可打印字符。使用它的目的不是为了加密,而是为了不出现特殊字符。
JavaScript原生的提供两个Base64相关的方法。
- btoa():任意值转为Base64编码
- atob():Base64编码转为原来的值
var string = "Hello World!";
btoa(string) // "SGVsbG8gV29ybGQh"
atob("SGVsbG8gV29ybGQh") // "Hello World!"
但是,这两个方法不适合非ASCII码的字符,会报错。
btoa("你好") // 报错
要讲非ASCII字符转为Base64编码,必须中间插入一个转码环节,在使用这两个方法。
function base64Encode(str) {
return btoa(encodeURIComponent(str));
}
function base64Decode(str) {
return decodeURIComponent(atob(str));
}
通过base64Encode()和btoa()转换ASCII字符串结果有差异。
浙公网安备 33010602011771号