Symbol 的使用
# Symbol 的使用
# Symbol.hasInstance
作用:自定义
instanceof
class Array1 {
// 自定义 instanceof 里面的内容
static [Symbol.hasInstance](instance) {
console.log(instance,'instance')
return Array.isArray(instance)
}
}
// 使用
console.log([] instanceof Array)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# Symbol.isConcatSpreadable
作用: 用于 Array.prototype.concat()方法的参数时是否展开其数组元素
var alpha = ['a', 'b', 'c'],
numeric = [1, 2, 3];
numeric[Symbol.isConcatSpreadable] = false; // 设置不展开数组元素
var alphaNumeric = alpha.concat(numeric);
console.log(alphaNumeric); // 结果:['a', 'b', 'c', [1, 2, 3] ]
// ======== 展开数组 ==========
numeric[Symbol.isConcatSpreadable] = true; // 设置不展开数组元素
var alphaNumeric = alpha.concat(numeric);
console.log(alphaNumeric); // 结果:['a', 'b', 'c', 1, 2, 3 ]
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# Symbol.iterator
作用: 为对象创建一个默认的迭代器。并且该迭代器可以被for...of循环使用
# 自定义迭代器
const myIterable = {};
myIterable[Symbol.iterator] = function* () {
yield 1;
yield 2;
yield 3;
};
// 对象展开
[...myIterable]; // [1, 2, 3]
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 计算属性
class Foo {
*[Symbol.iterator]() {
let i = 0
yield i++;
yield i++;
}
}
console.log(...new Foo())
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# Symbol.match
指定是否匹配的是正则表达式而不是字符串
// 正常会报错,因为 /bar/是一个正则表达式
"/bar/".startsWith(/bar/)
// 如果想要匹配成功
var reg = /bar/
reg[Symbol.match] = false
"/bar/".startsWith(reg) // true
"/abc/".startsWith(reg) // false
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# Symbol.matchAll
作用:根据字符串生成正则表达式的匹配项
const str = "2016-01-02|2019-03-07";
const numbers = {
*[Symbol.matchAll](str){
for(const n of str.matchAll(/[0-9]+/g)) {
yield n[0]
}
}
}
const arr = Array.from(str.matchAll(numbers))
console.log(arr)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11