引用值(或对象)是某个特定引用类型的实例,引用类型就是把数据和功能组织在一起的结构,引用类型虽然有点像类,但是和类不是一个概念
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d2478bfc19f14500ab3dbdf1b805a1ea~tplv-k3u1fbpfcp-zoom-in-crop-mark:3024:0:0:0.image)
Date
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b27ec62ab3484ca5afc9f0b60376ef25~tplv-k3u1fbpfcp-zoom-in-crop-mark:3024:0:0:0.image)
RegExp 正则
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e4923bf440c94ff8a64853df3f763cf8~tplv-k3u1fbpfcp-zoom-in-crop-mark:3024:0:0:0.image)
// 匹配字符串中的所有 "at";
const p1 = /at/g;
log(p1.test("that")); // true;
// 匹配第一个不区分大小写的 "bat" or "cat"
const p2 = /[bc]at/i;
log(p2.test("BAT")); // true;
log(p2.test("baT")); // true;
// 匹配所有包含 "at" 的三个字符组,忽略大小写
const p3 = /.at/gi;
log(p3.test("nat3")); // true
log(p3.test("at3")); // false
原始值和包装类型
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/858f0720c74c457ab5648de07c6cdf27~tplv-k3u1fbpfcp-zoom-in-crop-mark:3024:0:0:0.image)
扩展 Unicode 增补平面的问题
/**
* 字符在 Unicode 增补字符平面时.length, charAt(index)等方法就会出现问题,
* 因为 16 位只能唯一表示 Math.pow(2,16) = 65536 个字符
*/
const msg = "ab😊de";
log(msg.length); // 6 不是预期的5,因为 😊 占了不是基于 16位码元完成的
log(msg.charAt(1)); // log: "b",预期一样
log(msg.charAt(2)); // log: "�" 预期不一样
log(msg.charAt(3)); // log: "�" 预期不一样
log(msg.charAt(4)); // log "d" 预期一样
log(String.fromCharCode(97, 98, 55357, 56842, 100, 101)); // 该方法正常
str.normalize(NFx) 实现字符串的标准化 解决一些 bug
// 不同的编码对应同一个字符(如下的 几个 编码都对应 "Å",但是他们却互不相等)
const a1 = String.fromCharCode(0x00c5),
a2 = String.fromCharCode(0x212b),
a3 = String.fromCharCode(0x0041, 0x030a);
log(a1, a2, a3); // Å Å Å
// 但是他们互不相等,因为编码方式不同
log(a1 == a2 || a1 == a3 || a2 == a3); // false
/**
* 同一个字符可以有不同的编码方式,但是因为编码不同导致出现相同的字符却不相等
* 为了解决这个 bug: Unicode 提供了 4 中规范化形式: NFD、NFKD、NFC、NFKC
* 可以选择同一种规范话形式可以让比较仓做符返回正确的结果
*/
const normalizeNFD = (str) => str.normalize("NFD");
log(
normalizeNFD(a1) === normalizeNFD(a2) ||
normalizeNFD(a1) === normalizeNFD(a3) ||
normalizeNFD(a2) === normalizeNFD(a2)
); // true
Array
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/49c804d5b22d4157aee7324a7601f4d9~tplv-k3u1fbpfcp-zoom-in-crop-mark:3024:0:0:0.image)
数组的创建值 Array.from(iterator) / Array.of(...arguments)
// *************** Array.from(iter, mapFn, this) ****************
/**
* 首先看 ts 声明 Array.from(iterable: Iterable | ArrayLike, mapfn: (v: T, k: number) => U, thisArg?: any): U[];
* from 接受一个可迭代对象或者是类数组,还接受一个 map 方法,还有一个 this 指向
*/
// 可迭代对象 (字符串也是可迭代对象、因为可以使用 for...of 循环
log(Array.from("abcd")); // log: [ 'a', 'b', 'c', 'd' ]
// map,set 都是迭代对象
const map = new Map();
map.set("key1", 1);
map.set("key2", 2);
map.set("key3", 3);
log(Array.from(map)); // log: [ [ 'key1', 1 ], [ 'key2', 2 ], [ 'key3', 3 ] ]
// 自定义可迭代对象
const iter = {
*[Symbol.iterator]() {
yield 1;
yield 2;
yield 3;
yield 4;
},
};
log(Array.from(iter, (v, k) => `${k}:${v}`)); // log: [ '0:1', '1:2', '2:3', '3:4' ]
// *************** Array.of(...items: any[]) ****************
log(Array.of(1, "2", { 3: 3 }, 4)); // log: [ 1, '2', { '3': 3 }, 4 ] 把一组参数 转化为数组
数组的转化方法
const person1 = {
toLocaleString() {
return "person1-toLocaleString";
},
toString() {
return "person1-toString";
},
};
const person2 = {
toLocaleString() {
return "person2-tLS";
},
toString() {
return "person2-tS";
},
};
const { log } = console
const people = [person1, person2];
log(people.toString()); // "person1-toString,person2-tS"
log(people.toLocaleString()); //"person1-toLocaleString,person2-tLS"
const colors = ["red", "purple", "green"];
log(colors.join(" ### ")); // log: red ### purple ### green
log(colors.join(" - ")); // log: red - purple - green
|