在步骤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
答案 0 :(得分:3)
为什么需要调用ArraySpeciesCreate来创建原始数组的副本?
它不创建原始数组的副本(更多信息如下)。
Array.prototype.splice
是否直接在原始数组中运行??
是
splice
做了两件事:
它会修改您调用它的数组,并
它会创建一个 new 数组,其中包含您删除的所有条目
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
属性来构建新数组。