2012-07-09 2 views
1

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

typeof x === "object" 
typeof x == "object" // does the same thing 100% of the time and uses one less character 
+1

В общем, вы не должны подсчитывать количество символов в вашем коде, если вы не являетесь Google. –

+0

Поскольку в ответах есть некоторые аргументы: спрашиваете, следует ли использовать третье равно * для этого конкретного условия *, или если вы должны использовать его * вообще *? Потому что для меня этот вопрос читается как последний, но другие считают, что это первый. – KRyan

+0

Я говорю, что вопрос просто заключается в том, следует ли его использовать в этом конкретном состоянии, и если это является признаком не понимания цели оператора. – user1472219

ответ

1

Вы не сравниваете типы объектов. Вы сравниваете строки: буквальный ('object') и который возвращается оператором typeof.

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

+1

он уже знает это - вопрос в том, «есть ли причина не использовать === в этом случае» – hvgotcodes

+1

@hvgotcodes нет причины. Вы можете использовать '===' или '==', когда вам нужно. но вы должны понимать разницу. Также в JS не так много ситуаций, что вы должны использовать '===' вместо '=='. – Serjio

+0

Это становится смешным, люди. Почему 2 downvotes на этом - без каких-либо объяснений вообще?) – raina77ow

3

1 (очень) веская причина: консистенция.

В общий вы должны быть как можно более конкретными. Если вы следуете общему правилу, что вы должны быть как можно более конкретными, вы должны сохранить его как === для согласованности. Плюс, предполагая, что вы следуете общему правилу, если вы сделаете исключение, то последуют больше исключений, и вскоре у вас не будет общего правила.

Я бы принял согласованность и специфичность в связи с необходимостью набрать 1 символ в 100% случаев.

+0

почему нисходящий? – hvgotcodes

+0

Я не спускал вниз (я никогда не занимаю должности, если не для некоторых довольно больших случаев), но я действительно не верю в эту причину.) Например, я часто использую конструкцию 'something! = Null', и не нужно беспокоиться о том, является ли' something' 'null' - или просто' undefined'. Это делает мой код непоследовательным?) – raina77ow

+0

ну, тогда вы должны просто сделать, если '(что-то)' или '!! something';) – hvgotcodes

2

В этой конкретной ситуации единственным преимуществом === является то, что он немного быстрее.

Для получения результатов профилирования см .: http://jsperf.com/equal-performance (в частности, «строка + двойные равные» и «строка + триплекс равен»).

+1

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

+0

потому что он не бросает vars – Serjio

+0

Я не совсем уверен, почему это быстрее. Но, по крайней мере, в некоторых браузерах это (см. Ссылку jsperf). –

-2

== - означает проверку значений vars, но не проверяет их типы (например, «2» == 2 => return true).

=== - означает, что значения проверки и их типов (например, «2» === 2 => вернуться ложным, потому что левый аргумент является строкой, и второй ряд, поэтому вары не делает то же самое)

EDIT : === в целом то же, что и var1 == var2 && var1.contructor == var2.contructor.

+0

Это очень конкретный вопрос о том, когда использовать '===' vs. '==', и вы не отвечаете на него. – cha0site

-2

В-третьих, сравните даже типы данных.

JavaScript typeof возвращает строки, только если проверенная переменная имеет значение null, не возвращает «null», но null.

Если вы сравниваете TYPEOF х с строкой, второй равно возвращает всегда то же самое, такие как третьи.

+1

A) Это неверно ('typeof null' возвращает' 'object" '), B) это не отвечает на вопрос OP. –

+0

Действительно. Вероятно, путают с 'undefined'.) – raina77ow

1

Хорошо, теперь большинство людей сказали вам (справедливо), что использование трех = - лучшая практика. Тем не менее, ваш пример вызывает одну из возможных ошибок при использовании сравнений 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;. Код, подобный этому, никогда не может быть обойден всеми вместе, но должен быть сведен к минимуму.

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

+0

Erm ... вы сравниваете объект и примитив здесь, так почему бы вам удивляться, если '==' и '===' дают разные результаты? – raina77ow

+0

Это была иллюстрация того, как метод '.valueOf' вызывается при использовании' == ', но не при использовании проверок типов и значений. Возможно, я не объяснил это слишком ясно, но давайте узнаем: я не ожидал, что 'inst === 1' вернется. 'inst.valueOf() === 1' будет записывать true, поскольку возвращаемое значение является примитивным –

+0

Почему' valueOf' следует вызывать при использовании _type_ check? Извините, возможно, я неправильно понимаю вас, но я действительно ничего не вижу ... странно в коде, который вы показали. – raina77ow

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