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

# 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

# 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

# 计算属性

class Foo {
  *[Symbol.iterator]() {
    let i = 0
    yield i++;
    yield i++;
  }
}
console.log(...new Foo())
1
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

# 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
最后更新时间: 2023/2/25 10:03:46