Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Неочевидная работа операторов сравнения(для меня) (https://javascript.ru/forum/misc/24856-neochevidnaya-rabota-operatorov-sravneniya-dlya-menya.html)

Sundro 17.01.2012 01:35

Неочевидная работа операторов сравнения(для меня)
 
Сразу извеняюсь, скорее всего здесь что то очевидное, но я не могу понять уже как два часа отряду.
Есть код
var arr1 = [1,2,3];
var arr2 = [1,2,0,4];
var a = function (arr1,arr2){
if ( (arr1 == arr2)){
return true;
}
return false;
}();
var b = function (arr1,arr2){
if ( arr1 === arr2){
return true;
}
return false;
}() ;
alert( "Проверка на равенство двух разных массивов "+ a + "Проверка на идентичность двух разных массивов " + b )

По идее код должен выдавать что для первого случая что для второго false, так как массивы разные а они сравниваются по ссылке, но этого не происходит. А почему понять не могу. Объясните пожалуйста где у меня закоротило в мозгу=)

B@rmaley.e><e 17.01.2012 02:04

1. Форматируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

2. А Вы посмотрите, что на самом деле сравнивается внутри этих функций.

Gvozd 17.01.2012 02:20

Вы ничего не передаете в функции, а это равносильно тому, что аргументы arr1 и arr2 функций равны undefined, а значит и друг другу

DreamTheater 17.01.2012 04:41

Сравнивание при помощи операторов сравнения будет валидно только для примитивных типов - undefined, null, Boolean, Number, String. Объекты любых других типов являются ссылками, то бишь [1, 2, 3] != [1, 2, 3], потому как это будут две разные ссылки.

Sundro 17.01.2012 12:27

Спасибо, всем, теперь понял ;) Должно быть так
var arr1 = [1,2,3];
 var arr2 = [1,2,0,4];
 var a = function (arr1,arr2){
 if ( (arr1 == arr2)){
 return true;
 }
 return false;
 }(arr1,arr2);
 var b = function (arr1,arr2){
 if ( arr1 === arr2){
 return true;
 }
 return false;
 }(arr1,arr2) ;
 alert( "Проверка на равенство двух разных массивов "+ a + "Проверка на идентичность двух разных массивов " + b )

nerv_ 17.01.2012 17:08

А разве они так могут проверятся? В js массивы (объекты) передаются по ссылке, т.е., если две переменные ссылаются на один и от же массив, то они равны и идентичны. Если Вы хотите проверить наличие одинаковых элементов, то это уже другой разговор.
var x = [1, 2];
var z = x;

alert(x === z); // true
alert(x == z); // true

var z = [1, 2];

alert(x === z); // false
alert(x == z); // false

Sundro 17.01.2012 17:21

Вы правы, у меня изначально была именно такая цель, потом вспомнил что массивы передаются по ссылке, наваял код чтобы убедится( потом и к фленагану залез) ,но он не работал, собственно полез на форум за разъяснениями и выяснил причину. А так да чтобы проверить наличие одинаковых элементов другого способа как перебирать элементы массива и сравнивать, я не вижу =(


Часовой пояс GMT +3, время: 11:41.