深入了解Symbol.species它到底控制了什么

76 阅读1分钟

Symbol.species影响的到底是什么

阅读JavaScript高级程序设计第四版了解到:

1750820826359.png

思维发散

所有的不修改原数组的方法都会受到影响吗

测试

 class MyArray extends Array {
        static get [Symbol.species]() {
          return function () {
            return [1, 2, 3];
          };
        }
      }
      const myArray = new MyArray();
      const sorted = myArray.toSorted();
      const map = myArray.map(() => {});
      console.log(myArray); // MyArray []
      console.log(sorted); // []
      console.log(map); // [1,2,3]

并不是toSorted没有被影响,

调研

toSorted

1750820976918.png 注意到第四行根据读取到的len创建数组,没有发现什么猫腻,对照打开filter

filter

1750821116026.png

发现了猫腻,同样第四行使用的是ArraySpeciesCreate,那么区别应该是这里

ArraySpeciesCreate

1750821224113.png

第五行去读取 %Symbol.species%

%Symbol.species%

1750821309814.png

1750821384595.png

结论

只有直接间接 a. Set C to ? Get(C, %Symbol.species%).才会受影响。