この状況で.map()は何をしていますか?


95

Chromeコンソールを使用すると、これは私の入力と出力です。

[0].map(Array);

[[0, 0, [0]]]; // output

ここで何が起きてるの?

編集する

これが気になる理由は、

[0].map(String);

戻ります

["0"];

そしてない

["0", "0", "String"]

34
私は彼が幸せを感じるために常にいくつかのJavaScript WTFを必要とするためと思います
npst

12
ああ、それはより少ないwtf-yバリアントです['10', '10', '10'].map(parseInt)
gronostaj

2
別の奇妙な.map()動作:stackoverflow.com/questions/14528397/…一般に、.map()複数の引数を取る関数で使用する場合は注意が必要です。
Barmar

2
ただやる[0].map(console.log)
ベルギ

1
@Jacksonkr:答えてくれてありがとう。私はそれがこのように進んだと思います:私はコメントを書き、JS WTFを見ると言語を頻繁に使用する必要がないことを嬉しく思うことを説明しました。言語が気に入らない場合、なぜJSの質問を見るのかと誰かが尋ねました。npstが応答し、最初の2つのコメントが削除されました。面白いことに、彼のコメントはまだ賛成投票されています。
Eric Duminil 2017

回答:


123

.map()関数が呼び出しているArray()三つの引数、ある配列要素の値と機能を0も、その要素のインデックス、0および配列全体を参照します。

したがって、これは次のようになります。

var a = [0];
var index = 0
Array(a[index], index, a);   // create array with three elements

Array()それまでに返された配列は、.map()作成する配列の最初の要素になるため、[[0, 0, [0]]]結果のネストのレベルが高くなります。

あなたの編集に関するEDIT:あなたが言う[0].map(String);のその結果String()のように同じ3つの引数で呼び出されているString(a[index], index, a)が、String()一方の機能は、すべてが、最初の引数を無視Array()用途はすべての引数を供給。


39

まずArray配列を作成する関数として使用できます。

var arr = Array(1, 2, "Hello");

console.log(arr); // [1, 2, "Hello"]

2番目にmap3つのパラメータをコールバックに渡します。要素、配列からのインデックス、および配列自体です。

したがって、配列には1つの要素が含まれているため、次の行:

[0].map(Array);

以下と同等です。

[Array(0, 0, [0])];     // the element 0 in the original array will be mapped into Array(0, 0, [0])

6

質問を更新した後。他の回答はあなたに地図についての情報を提供します

配列と文字列が異なる理由を回答するには、コンストラクターを参照してください

文字列コンストラクターは1つのパラメーターString(thing)を受け入れ、配列new Array(element0、element1 [、... [、elementN]])を受け入れます


2
これは、すべてのアイテムに対して.map(Number)何かを返すのではなく、すべてのアイテムを数値に変換するのと同じ理由[3, 2, [4, 1, 3]]です。
user4642212 2017

@Xufoxはい答えはコンストラクタにあります:)
Volodymyr Bilyachat '09 / 09/15

4

この電話

[0].map(Array);

次のように書いた場合と同じ結果が得られます。

[0].map(function (value, index, array) {
    return Array(value, index, array);
})

マップ関数は、要素の値、要素のインデックス、配列全体の3つのパラメーターで配列関数を呼び出しています。この呼び出しArrayは、3つの要素を持つ配列を返します:値(数値0)、インデックス(数値0)、配列全体([0])の。

そして、この新しい配列は、元の要素(number 0)を新しい要素(3要素の配列)に

注:次のように、最初のパラメーターのみを使用することに慣れている場合があります。

array.map(function (a) { return a * a; });

または2つだけを使用してインデックスも取得します

array.map(function (item, index) { return "index=" + index + ", value=" + item; });

ただしmap、コールバック関数では無視する3つのパラメーターがまだ提供されていることを覚えておく必要があります。これは、次のようなコードが使用される理由でもあります。

[0].map(String);

戻り値

["0"]

これは、String関数が最初のパラメーターのみを考慮し、渡された他のパラメーターを無視するためです。あなたが呼ぶなら

String(11, "Some", "other", "ignored", "parameters")

あなたはまだ得るでしょう

"11"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.