スペックからして明らか
Array.prototype.filter ( callbackfn [ , thisArg ] )
、
パラメータが指定されている場合は、 の各呼び出しの値thisArg
として使用されます。this
callbackfn
そう:
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 文字の文字列にはインデックス0
と1
独自のプロパティがあります。