2

この質問に関連して、これを試してみたかった

var arr = [0,1,2,true,4,{"abc":123},6,7,{"def":456},9,[10]];
arr.filter(Object.hasOwnProperty,"abc");//outputs [0, 1, 2]
arr.filter(Object.hasOwnProperty,"2222222") //[0, 1, 2, 4, 6]

フィルターがこれらの値を返す理由を知っている人はいますか? フィルターの仕様MDN docも、フィルターの 2 番目の引数がどのように使用されるかを明確に示していません。

4

2 に答える 2

7

の 2 番目の引数は、最初の引数として渡される関数に関してArray.prototype.filter設定される値です。this

したがって、コードは次のようになります。

arr.filter(function(v, i, a) {
    return Object.hasOwnProperty.call("222", v, i, a);
});

したがって、基本的"222"に、配列に列挙したプロパティが文字列に含まれているかどうかを確認します。

0そこから、プロパティ、1およびプロパティが見つかった理由が明らかになります。これらは文字列2内の文字のインデックスであり、文字列にはそのようなプロパティがないためです。"222"9{"abc":123}"222"

これは、プロパティも含まれる長い文字列と同じ話であり46単に長いという理由だけで.

いくつかの例:

Object.hasOwnProperty.call("222", 1); // true, because `"222"[1]` is there
Object.hasOwnProperty.call("222", 'foo'); // false, because `"222"['foo']` is not there
于 2016-03-26T08:35:53.110 に答える
3

スペックからして明らか

Array.prototype.filter ( callbackfn [ , thisArg ] )

パラメータが指定されている場合は、 の各呼び出しの値thisArgとして使用されます。thiscallbackfn

そう:

var arr = [0,1,2,true,4,{"abc":123},6,7,{"def":456},9,[10]];
arr.filter(Object.hasOwnProperty,"2222222");

これらの呼び出しに順番に変換します

"2222222".hasOwnProperty(0);             // true     -> 0
"2222222".hasOwnProperty(1);             // true     -> 1
"2222222".hasOwnProperty(2);             // true     -> 2
"2222222".hasOwnProperty(true);          // false    -> 
"2222222".hasOwnProperty(4);             // true     -> 4
"2222222".hasOwnProperty({"abc":123});   // false    -> 
"2222222".hasOwnProperty(6);             // true     -> 6
"2222222".hasOwnProperty(7);             // false    -> 
"2222222".hasOwnProperty({"def":456});   // false    -> 
"2222222".hasOwnProperty(9);             // false    -> 
"2222222".hasOwnProperty([10]);          // false    -> 
                                         // filter() => [0,1,2,4,6]

それが言う行trueは、文字列が配列のようにインデックス付けできるためです。そのため、2 文字の文字列にはインデックス01独自のプロパティがあります。

于 2016-03-26T09:22:08.140 に答える