2016-03-24 2 views
1

Вы можете использовать значение массива в качестве сравнения

var hits = ["a", "b", "c"]; 
 

 
if (hits !== ["a", "b", "c"]){ 
 
//Do some stuff here 
 
};

Вы можете использовать значение массива в качестве сравнительного? Выше, как представляется, не работает для меня. Мне было интересно, можно ли это сделать, или есть ли другой способ получить доступ к литеральному значению массива для сравнения.

+4

http://stackoverflow.com/questions/7837456/how-to-compare-arrays-in-javascript –

+0

Вы можете легко написать функцию сравнения массива. –

+0

Вы не можете сравнивать такие массивы, потому что массивы - это объекты. И когда вы используете оператор сравнения над объектом, его ссылка будет сравниваться и результат сравнения будет возвращен. –

ответ

0

Вы можете написать этот

if (JSON.stringify(hits) === JSON.stringify(["a", "b", "c"])) { 
5

Операторы равенства (=== и !==) сравнения ссылки, а не значения в случае объектов. Имейте в виду, что в JavaScript Массивы являются объектами. Из-за этого и потому что эти два различных массивов (они выглядят одинаково, они содержат одни и те же ценности, но они не тот же массив) их ссылки отличаются:

Если оба операнда являются объектами, то JavaScript сравнивает внутренние ссылки, которые равны, когда операнды относятся к одному и тому же объекту в памяти.

Подробнее об этом можно узнать на странице MDN.

Примечание:== и != операторы равенства и сравнения объектов по ссылкам, но так как они делают больше, чем просто простое сравнение (и это часто неожиданные), это вообще не рекомендуется использовать их и всегда придерживаться строгих операторов равенства (=== и !==).

Как сравнить массивы тогда?

Существует по крайней мере несколько разных методов. Некоторые люди советуют сравнивать JSON.stringify из обоих массивов, но, хотя это работает для простых случаев, это не очень хорошее решение по производительности. Здесь вы можете найти лучшие методы. https://stackoverflow.com/a/14853974/704894

Если вы используете какую-либо полезную библиотеку, такую ​​как lodash или underscore, эта функция уже есть! См. https://lodash.com/docs#isEqual

+1

, а что насчет '==' и '! ='? не будут ли они сравнивать ссылки? –

+1

Итак, почему '' a '===' a'' возвращает 'true'? – Lewis

+0

@RajaprabhuAravindasamy Да, они будут. Я добавил это к моему ответу. –

0

Вы не можете этого сделать из-за того, как Javascript обрабатывает массивы - это не проверка того, что значения одинаковы, это проверка того, что объект является тем же самым объектом (которого он не является).

+0

Это на самом деле не очень хорошая идея. Что делать, если в массиве есть что-то подобное? '['a, b', 'b', 'c']', а во втором - что-то вроде этого: '['a', 'b, b', 'c']'? Он вернет «true», но это не те же массивы. – Paulooze

+1

Хм, да конечно - я удалю предложенный код – millerbr

Смежные вопросы