Javascript Array.indexOf()的行为

Javascript Array.indexOf()的行为,javascript,Javascript,Array.IndexOf函数对于字符串和对象的行为不同 严格的行为; 反对行为; 功能特性{ 设s1=头盔; 设s2=裤子; 让集合=[]; 催收1; 集合。2; console.infocollection.indexoftrusers; }; 函数对象行为{ 设obj1={item:helmet}; 设obj2={项目:裤子}; 让集合=[]; collection.pushobj1; collection.pushobj2; console.infocollection.indexOf

Array.IndexOf函数对于字符串和对象的行为不同

严格的行为; 反对行为; 功能特性{ 设s1=头盔; 设s2=裤子; 让集合=[]; 催收1; 集合。2; console.infocollection.indexoftrusers; }; 函数对象行为{ 设obj1={item:helmet}; 设obj2={项目:裤子}; 让集合=[]; collection.pushobj1; collection.pushobj2; console.infocollection.indexOf{项目:裤子}; }; 您可以改为使用findIndex并传递一个函数,该函数通过对象的属性来比较对象

严格的行为; 反对行为; 功能特性{ 设s1=头盔; 设s2=裤子; 让集合=[]; 催收1; 集合。2; console.infocollection.indexoftrusers; }; 函数对象行为{ 设obj1={item:helmet}; 设obj2={项目:裤子}; 让集合=[]; collection.pushobj1; collection.pushobj2; console.infocollection.findIndexel=>isIdenticalel,{项目:裤子}; }; 函数是当前的,给定的{ return Object.keysgiven.everykey=>current[key]==given[key];
}这是因为在JS中,对象的相等性由引用值决定。在console.infocollection.indexOf{item:seconds}中;,对象{item:裤子}是一个新对象,其引用与obj2不同。尝试使用console.infocollection.indexOfobj2;你会发现这是同样的行为。问题是引用除了标记为重复的问题之外,您还应该决定如何为自定义indexOf实现比较对象。例如,{项目:裤子}!={item:裤子}这些不是同一个对象,只是具有相同字段的对象,但是JSON.stringify{item:裤子}==JSON.stringify{item:裤子};但是如果你的对象可能包含MethodsHanks,这就行不通了,我明白了。我是否可以定义js在indexOf调用后搜索集合时如何检查相等性,就像您可以在其他编程语言中重写equals方法一样。但是您可以执行array.mapitem=>JSON.stringifyitem.indexOfJSON.stringifyitemToBeFound,或者您可以定义并使用和来代替JSON.stringifyitem来定义和使用可比较的帮助程序。一个解决方案是使用与比较函数一起调用的。对于简单的情况,可以使用JSON.stringify,就像在@YakovL comment中一样。使用日期对象自动计时可能会更麻烦-日期会不同-或者递归结构-JSON会出错-