Javascript! == не дает такие же результаты, как обратное к === - PullRequest
2 голосов
/ 03 января 2012

Я загрузил изображение цветового круга на холст, и у меня есть список значений оттенков в массиве. Я зацикливаю каждый пиксель на холсте и удаляю пиксели, которые соответствуют одинаковым значениям оттенка.

Код для этого:

var element = document.getElementById("wheel-canvas");
var c = element.getContext("2d");   
var image = c.getImageData(0, 0, 375, 375);
var imageData = image.data;
paletteList = this.collection.pluck('hsv');
for (var i = 0, n = imageData.length; i < n; i += 4) {
    var hsv = this.model.convertRGBToHSV(imageData[i], imageData[i+1], imageData[i+2]);
    var hue = hsv[0];
    var sat = hsv[1];
    var val = hsv[2];
    $.each(paletteList, function(index, value) {
    if (hue === value[0])   
    {
        imageData[i] = '0';
        imageData[i+1] = '0';
        imageData[i+2] = '0';
    }
    });

}

   c.putImageData(image, 0, 0);

enter image description here

Теперь я хочу, чтобы все пиксели, которые не соответствуют оттенкам, стали черными. Я делаю изменение кода:

if (hue !== value[0])   

и я получаю следующий результат:

enter image description here

Почему это не похоже на инверсию первого круга?

Спасибо!

Ответы [ 5 ]

5 голосов
/ 03 января 2012

Ваша логика для определения того, какие пиксели установить на черный, неверна.

Обратите внимание, что в цикле each оттенок каждого пикселя не будет равен некоторым оттенкам в списке палитр, поэтомуиз них будет установлено черное.

что вы действительно хотите сделать для каждого пикселя, это определить, является ли его оттенок в списке поддонов или нет.

var matched = false;
$.each(paletteList, function(index, value) {
    if (hue === value[0]) {
        matched = true;    
        return false;
    }
}
if (!matched) {
    imageData[i] = '0';
    imageData[i+1] = '0';
    imageData[i+2] = '0';
}
2 голосов
/ 03 января 2012

Существует разница между равенством и идентичностью .

Равенство (==,! =)

  • Если типы двух выражений различны, попытайтесь преобразовать их в строку, число или логическое значение.
  • NaN не равно чему-либо, включая себя самого.
  • Отрицательный ноль равен положительному нулю.
  • ноль равно как нулевому, так и неопределенному.
  • Значения считаются равными, если они являются одинаковыми строками, численно эквивалентные числа, один и тот же объект, идентичные логические значения или (если различные типы) они могут быть приведены в одну из этих ситуаций.
  • Любое другое сравнение считается неравным.

Идентичность (===.! ==)

Эти операторы ведут себя идентично операторам равенства, кроме преобразование типов выполнено, и типы должны быть одинаковыми, чтобы считается равным.

Источник. Так что !== не может быть проблемой.

2 голосов
/ 03 января 2012

Вам нужно использовать != для «не равно», поскольку вы хотите только сравнить значения.
Проверьте это: Сравнение Javascript

!== также сравнит идентичность / объекты, которые не совпадают (как упомянул Кис).

0 голосов
/ 03 января 2012

Вы сравниваете строку с целым числом, используя! ==, это всегда будет возвращать false. Проверьте на http://jsfiddle.net/k4EAQ/

Использование! = Javascript не проверяет тип и даст вам то, что вы хотите. Но если вам нравится использовать! ==, вы всегда можете преобразовать переменную в целое число или строку, чтобы быть уверенным, что они соответствуют типу.

Как преобразовать строку в целое число в JavaScript?

0 голосов
/ 03 января 2012

Не удалось найти оператора, на которого вы ссылаетесь. Я предлагаю вам использовать! (A === b)

взгляните на w3school список операторов javascript

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...