Оператор in
возвращает true, если свойство находится в объекте. Это включает в себя поиск по всей цепочке прототипов. Например:
Object.prototype.k = 5;
f = {};
'k' in f; // true
Несмотря на то, что f
является пустым объектом, его прототип (как и все типы в JS) включает в себя объект Object
, который имеет свойство 'k'
.
Хотя вы и не спрашивали, полезная функция для проверки только собственных свойств объекта - .hasOwnProperty()
, поэтому в нашем примере выше:
f.hasOwnProperty('k'); // false, that's more what we would expect
Хотя для массивов вы (обычно) не хотите итерировать по всем свойствам, поскольку эти свойства могут включать в себя иные вещи, кроме значений индекса, поэтому как по соображениям производительности, так и по ожидаемому поведению следует использовать обычный for(var i=0;i<n;i++)
.
Таким образом, если вы используете массивы, перейдите с in_array_orig
, а для объектов, для которых вас интересуют их свойства, используйте in_array_new
(который должен быть соответствующим образом переименован, in_obj
или что-то в этом роде).
Кроме того, [1] == [1]
возвращает false, поскольку два объекта / массива не являются одинаковыми объектами. Действительно, каждое из их свойств и индексов имеет одинаковое значение, хотя они не находятся в одном и том же месте в памяти и, следовательно, не считаются равными. Вы можете легко построить ( или найти в сети ) процедуру глубокого поиска equals()
, чтобы проверить, действительно ли два объекта / массива равны по значению (в отличие от адреса).