Function.prototypeが適用されます&コール(.apply.call())的

その役割は、この点の機能を変更します

function.call(thisArg、ARG1、ARG2、...)
func.apply(thisArg、[argsArray])


次のコードは、結果と理由生成言う:質問への最初
の参照のstackoverflowを

let myArray = Array.apply(null, {length: 10}).map(Number.call, Number);
myArray //[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

分析:

上記式は、2つの部分に分割されます。

Array.apply(null, {length: 10}) //[undefined X 10],10个undefined的数组

.map(Number.call, Number)

我々はすべて知っているように、

Array(10) //[,,,,,,,,,]
Array.prototype.slice.call({length: 3, 0:1, 1:2, 2:3}) //[1, 2, 3]

クラスの配列の使用については、多くがあります

for (var i=0; i<arr.length; i++) {
  console.log(arr[i]) // logs 1 .. 2 .. 3
}
Array.prototype.forEach.call({length: 3, 0: 1, 1: 2, 2: 3}, function(x) {
  console.log(x) // 1  2  3
})

MDN:
開始からのECMAScript第5版、(第2パラメータを適用)は、オブジェクトの配列の任意の種類限り、長さのために使用することができる
性質及び範囲(0 ...長-1)の特性の整数です。{「長さ」:2、例えばのNodeListは、現在、自身のまたは類似の定義を使用することができ
、「EAT」:「0」」1' 『バナナであった』}オブジェクトの形で。

ここで使用される、唯一のクラス長の配列に伝達され、アレイ10の未定義の組成となる適用

そして、第二部を分析

.map(Number.call, Number)

最初のマップは、そのコールバックコールバック関数で、デフォルトパラメーターは、三回のコールバック関数を渡すために、第二のパラメータはこの時点内部コールバックを変更する機能であります

マップ・アレイ-MDNの
配列要素、要素インデックス、元の配列自体:コールバック関数が自動的に3つのパラメータを渡されます。
arr.map new_array = VAR(関数コールバック(currentValueは[インデックス[配列]]){
戻りエレメントnew_arrayため//
} [、thisArg]
マップ法元の配列の各要素を順次コールバック一度呼び出される与えます機能。新しいアレイを形成するために結合(未定義を含む)実行後の各コールバックの戻り値

上記変更することができますFunction.prototype.callにNumber.call同等:

.map(function() {
    return Function.prototype.call.apply(this,arguments)
},Number)

そして、それを変更(このうち2番目のパラメータ番号を交換します):

.map(function() {
    return Number.call(arguments[0],arguments[1],arguments[2])
})

プラス最初の部分:

[undefined,undefined,...].map(function() {
    return Number.call(arguments[0],arguments[1],arguments[2])
})

この時点で、[0]が定義されていない引数は、あなたが知っています:

Number.call(undefined,1) //1  => Number(1)

数()のみつのパラメータ、すなわち引数を受け付けるので、[2]は無視されます

[undefined,undefined,...].map(function() {
    return Number(arguments[1]) //这里的第二个参数是数组索引(0,1,2,3.....)
})

最後に、[0,1,2,3,4,5,6,7,8,9]の自然な結果が出てきました!

あなたはおなじみの十分なjsの方法ではない、これらはもはや問題であれば!


再び機能の平らな配列は、
出典機能:あなたは本当にそれが(B)をES6理解しています

function flatten(arr) {
    while(arr.some(res => Array.isArray(res))) {
        arr = Function.apply.call([].concat, [], arr)
    }
    return arr
}
flatten([1,[2,[4,5]]]) //[1, 2, 4, 5]

分析の彼らの最初の波が推奨されます。

分析:

ARR-一部-MDNの
arr.some(コールバック(元素〔、インデックス[配列])、thisArg])
このメソッドは、少なくとも1つの条件が満たさコールバック、真戻るすなわち存在内部に存在するかどうかを確認するために反復アクションであり、そうでなければバックfalseに
MDN連結-ARR-
VAR = new_array old_array.concat(VALUE1 [、値2 [、... [、値N]]])を
合わせ2+配列を、元の配列、新しい配列戻りを変更することなく

キー部分の抽出

// 如果arr成员中存在数组,就一直执行while内部代码块
while(arr.some(res => Array.isArray(res))) {
   arr = Function.apply.call([].concat, [], arr)
}

ためARR = Function.apply.call([]。連結方式 、[]、ARR)を簡略化すること

arr = [].concat.apply([], arr)
//为了便于理解再变一下
arr = Array.prototype.concat.apply([],arr)
//在变一下,结合上面实例
arr = [].cancat(arr[0],arr[1]) // arr[0]代表的是1+个arr的非数组类型成员,
//arr[1]则代表的是1+个arr的数组类型成员

メンバーARR配列がある場合、連結を継続していきます、
小さなデモンストレーションを行います。

Array.prototype.concat.apply([],[1,[2,[3,4]]]) //[1, 2, Array(2)]
var step1 = Array.prototype.concat.apply([],[1,[2,[3,4]]])
step1 //[1, 2, [3, 4]]
var step2 = Array.prototype.concat.apply([],s1) 
step2 // [1, 2, 3, 4]

以下の2つのプロパティを使用することです

//1
[].concat(1,[1,2]) // [1,1,2]
//2
function f(){ this.name = 'xx'; }
f.apply(thisArg,arr) => f(arr[0],arr[1],...) { thisArg.name = 'xx'};

間違った場所は、あなたが私たちの教育を受けてきたものを教えてください見て理解

スキットルズが好きですか?私はキリンを持って、あなたはあなたを絞ることができます!

公開された15元の記事 ウォンの賞賛3 ビュー3436

おすすめ

転載: blog.csdn.net/qq_39370934/article/details/103633484