字符串

原文地址: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+10000U+10FFFF之间的字符,长度为32位(即4个字节),而且前两个字节在0xD8000xDBFF,后两个字节在U+DC000xDFFF之间。举例来说,码点U+1D306对应的字符为𝌆,它写成UTF-16就是0xD834 0xDF06
由于历史原因,JavaScript对于UTF-16的支持是不完整的,只支持2个字节的字符,不支持4个字节的字符。所以𝌆会被认为是2个字符。

"𝌆".length // 2

总结一下,对于码点在U+10000U+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字符串结果有差异

posted @ 2018-11-08 13:46  上升的泡泡  阅读(234)  评论(0)    收藏  举报