Хорошо, теперь большинство людей сказали вам (справедливо), что использование трех =
- лучшая практика. Тем не менее, ваш пример вызывает одну из возможных ошибок при использовании сравнений type of value-of
. Возьмите это, например:
var date1 = new Date();
var date2 = new Date(date1.valueOf());
Это означает, что Дат как date1
и date2
одного и того же типа (объекты, тот же объект даже: Date) и имеют точно такое же значение. Таким образом, логично:
console.log(date1 === date2);//logs FALSE
Почему? Потому что переменные объекта JS являются ссылками.То, что приведенный выше оператор фактически выполняет, - это проверка того, являются ли два места в памяти (оба являются новыми экземплярами) одинаковыми. Не проверяется их содержимое, но их адрес mem. Поэтому
Логика подсказывает, что:
var date1 = new Date();
var date2 = date1;
console.log(date1 === date2);//True
Примечание: JS всегда копирует значения переменных, но в случае объектов, эти переменные являются ссылками, поэтому JS копирует мем адрес, который хранится в date1
к date2
.
Справедливая оценка, проверка двух отдельных экземпляров - проблема, которая встречается с двойными равными знаками. Независимо от типа или значения: два адреса mem никогда не совпадают.
Простым решением многих людей, применяемых для применения, было перезаписать метод прототипа объекта JS valueOf
. Это по-прежнему работает, но вызывает проблемы с типом и проверками значения (тип объекта все еще играет роль, в то время):
function SomeConstructor()
{
this.foo = 'foobar';
this.bar = function()
{
console.log('I am a messy constructor!');
return this.foo;
};
}
var inst = new SomeConstructor();
inst.valueOf = function()
{
return 1;
}
console.log(inst == 1);//logs true
console.log(inst === 1);//logs FALSE
Есть много способов, чтобы обойти эту проблему, я видел человек JSON.stringify
-ный два объекта , и разбор их потом, люди, использующие for...in
, чтобы проверить каждое свойство, ... Хотя все, что нужно сделать, это сохранить возвращаемое значение valueOf()
в дополнительной переменной. Job Done (?) То, что на самом деле нужно делать, это написать лучший код, но я устал и дрейфую. WAY не в теме, где .... вернуться к вопросу:
Что же тогда можно спросить , является причиной для выбора дополнительного знака =
. Ну, я вижу, что консистенция упомянута выше, и предельная скорость.
Но так же, как никто, кажется, не упомянул об этой ловушке, никто не упоминает об стабильности.
Под этим я подразумеваю, что, когда вы пишете код, особенно на мягком, напечатанном языке, вы обнаруживаете, что пишете функции или методы, которые принимают определенное количество аргументов определенного типа.
Следующим шагом, как правило, при отладке, является то, что ваши функции начинаются с строк, таких как argument1 = parseInt(argument1);
и argument1 = argument1 || 0;
. Код, подобный этому, никогда не может быть обойден всеми вместе, но должен быть сведен к минимуму.
Говоря о себе, я стараюсь проверить, какие типы аргументов ожидаются при вызове функции, если я вижу, что функция выполняет тип и проверку значения. Если это не так, я предполагаю, что функция будет анализировать любые данные, которые ему нужны, из любых аргументов, которые я выбираю для передачи.
В основном: более строгий код выглядит более строгим, скорее всего, он будет использоваться.
В общем, вы не должны подсчитывать количество символов в вашем коде, если вы не являетесь Google. –
Поскольку в ответах есть некоторые аргументы: спрашиваете, следует ли использовать третье равно * для этого конкретного условия *, или если вы должны использовать его * вообще *? Потому что для меня этот вопрос читается как последний, но другие считают, что это первый. – KRyan
Я говорю, что вопрос просто заключается в том, следует ли его использовать в этом конкретном состоянии, и если это является признаком не понимания цели оператора. – user1472219