为什么在Array.prototype.splice中调用ArraySpeciesCreate?

时间:2016-11-21 06:37:39

标签: javascript ecmascript-6

在步骤12中,ArraySpeciesCreate中提到了Array.prototype.splice的ES6,后者根据原始数组创建了一个新数组。为什么需要调用function utf8_converter($array) { array_walk_recursive($array, function(&$item, $key) { if (!mb_detect_encoding($item, 'utf-8', true)) { $item = utf8_encode($item); } }); return $array; } $data = array("0"=>"hello","1"=>"180.00 10µH"); $data = utf8_converter($data); echo json_encode($data, JSON_PARTIAL_OUTPUT_ON_ERROR); 来创建原始数组的副本? ArraySpeciesCreate是否在原始数组中直接运行,如下所示?

Array.prototype.splice

1 个答案:

答案 0 :(得分:3)

  

为什么需要调用ArraySpeciesCreate来创建原始数组的副本?

创建原始数组的副本(更多信息如下)。

  

Array.prototype.splice是否直接在原始数组中运行??

splice做了两件事:

  1. 它会修改您调用它的数组,并

  2. 它会创建一个 new 数组,其中包含您删除的所有条目

  3. ArraySpeciesCreate因为#2而被使用,所以使用子类数组,你会得到一个子类的实例:

    class CustomArray extends Array {
    }
    
    let main = new CustomArray("a", "b", "c", "d");
    let deleted = main.splice(1, 2);             // Remove and return b and c
    console.log("main", main);                   // ["a", "d"]
    console.log("deleted", deleted);             // ["b", "c"]
    console.log(deleted instanceof CustomArray); // true

    请注意我们从splice返回的数组是CustomArray的实例。这是因为您在问题中标记了ArraySpeciesCreate。来自规范中的ArraySpeciesCreate的说明:

      

    带有参数 originalArray length 的抽象操作ArraySpeciesCreate用于指定使用派生自<的构造函数创建新的Array对象EM> originalArray

    注意到最后一点。基本上,ArraySpeciesCreate使用原始数组的constructor属性来构建新数组。