次のコードを作成しました http://jsfiddle.net/EbCUx/
var arr = [{a:1,b:2,c:3},{a:3,b:5,c:6}];
var a = arr[0];
alert(arr.indexOf(a));
var b = {a:1,b:2,c:3};
alert(arr.indexOf(b));
なぜ indexOf() は -1 を返すのですか?
次のコードを作成しました http://jsfiddle.net/EbCUx/
var arr = [{a:1,b:2,c:3},{a:3,b:5,c:6}];
var a = arr[0];
alert(arr.indexOf(a));
var b = {a:1,b:2,c:3};
alert(arr.indexOf(b));
なぜ indexOf() は -1 を返すのですか?
内部の値がたまたま同じである 2 つの異なるオブジェクトを比較していますが、同等性の観点から見ると、それらは依然として異なるオブジェクトです。
元のコード:
<script>
var arr = [{a:1,b:2,c:3},{a:3,b:5,c:6}];
var a = arr[0];
alert(arr.indexOf(a));
var b = {a:1,b:2,c:3};
alert(arr.indexOf(b));
</script>
比較で一致を取得する方法を示す更新バージョン。
<script>
var b = {a:1,b:2,c:3};
var arr = [b,{a:3,b:5,c:6}];
var a = arr[0];
alert(arr.indexOf(a));
alert(arr.indexOf(b));
</script>
たまたま同じ値を持つ 2 つの異なるオブジェクトを比較したい場合は、手動で行う必要があります。
MDNから:
indexOf は、厳密な等価性を使用して searchElement を Array の要素と比較します (=== またはトリプルイコール演算子で使用されるのと同じ方法)。
2 つのオブジェクトが厳密に等しいことはないため、indexOf を使用してオブジェクトの配列を検索することはできません。ループする必要があります (配列の要素がオブジェクトの場合は、indexOf を拡張してループします)。