Я использую JSLint, чтобы пройти через JavaScript, и он возвращает много предложений о замене ==
(два знака равенства) на ===
(три знака равенства) при выполнении таких вещей, как сравнение idSele_UNVEHtype.value.length == 0
внутри if
оператора.
Есть ли выигрыш в производительности для замены ==
на ===
?
Любое улучшение производительности будет приветствоваться, поскольку существует много операторов сравнения.
Если преобразование типов не происходит, будет ли выигрыш в производительности ==
?
=== vs ==
, но по PHP, можете прочитать здесь: stackoverflow.com/questions/2401478/why-is-faster-than-in-php/…===
это намного быстрее, чем==
. jsperf.com/comparison-of-comparisons===
over==
. На самом деле, тест не показывает большой разницы между обоими в современных браузерах. Лично я обычно использую==
везде, если мне действительно не нужно строгое равенство.===
and==
: youtube.com/… Если он не играет, он в 15:20Ответы:
Оператор строгого равенства (
===
) ведет себя идентично оператору абстрактного равенства (==
), за исключением того, что преобразование типов не выполняется, и типы должны быть одинаковыми, чтобы считаться равными.Ссылка: Учебник по Javascript: Операторы сравнения
==
Оператор сравнения равенства после выполнения любых необходимых преобразований типов .===
Оператор не делать преобразование, так что, если два значения не одного типа===
будет просто вернутьсяfalse
. Оба одинаково быстры.Процитирую превосходный JavaScript Дугласа Крокфорда : Хорошие части ,
Обновить:
Точка хорошо воспитана @Casebash в комментариях и в @Phillipe Laybaert в ответ объектов относительно. Для объектов
==
и===
действовать последовательно друг с другом (за исключением специального случая).Особый случай - когда вы сравниваете примитив с объектом, который оценивает тот же примитив, из-за его
toString
илиvalueOf
метода. Например, рассмотрим сравнение строкового примитива со строковым объектом, созданным с помощьюString
конструктора.Здесь
==
оператор проверяет значения двух объектов и возвращает ихtrue
, но===
видит, что они не одного типа, и возвращаетfalse
. Какой из них правильный? Это действительно зависит от того, что вы пытаетесь сравнить. Мой совет - полностью обойти вопрос и просто не использоватьString
конструктор для создания строковых объектов из строковых литералов.Ссылка
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
источник
Использование
==
оператора ( Равенство )Использование
===
оператора ( личность )Это связано с тем, что оператор равенства
==
выполняет приведение типов , что означает, что интерпретатор неявно пытается преобразовать значения перед сравнением.С другой стороны, оператор тождества
===
не выполняет приведение типов и, следовательно, не преобразует значения при сравнении и поэтому работает быстрее (как в соответствии с этим тестом JS ), поскольку пропускает один шаг.источник
==
«абстрактное равенство» и===
«строгое равенство». Разумеется, называть==
любое равенство имхо ужасно, поскольку оно не транзитивно, но зачем спорить? Я беру больше проблем с «идентичностью», хотя; Я думаю, что этот термин довольно вводит в заблуждение, хотя он «работает». А если серьезно, кто придумал термин «идентичность»? Я ищу стандарт и не смог его найти.Интересное наглядное представление сравнения равенства между
==
и===
.Источник: http://dorey.github.io/JavaScript-Equality-Table/
var1 === var2
var1 == var2
источник
x == null
чтобы проверить,x
является лиnull
илиundefined
.==
против===
. Прописные и строчные буквы в любом случае неравны и будут возвращатьсяfalse
как с операторами, так==
и с===
операторами. Кроме того , ключевые словаtrue
,false
,undefined
,null
,Infinity
существуют в JS только в одном случае, и не могут быть использованы в верхних или смешанных случаях.В ответах здесь я ничего не читал о том, что значит равный . Некоторые скажут, что это
===
означает « равный» и «того же типа» , но это не совсем так. Фактически это означает, что оба операнда ссылаются на один и тот же объект или, в случае типов значений, имеют одинаковое значение .Итак, давайте возьмем следующий код:
Тут то же самое:
Или даже:
Такое поведение не всегда очевидно. В этой истории есть нечто большее, чем быть равными и быть однотипными.
Правило таково:
Для типов значений (чисел):
a === b
возвращает true, еслиa
иb
имеют одинаковое значение, и имеют одинаковый типДля ссылочных типов:
a === b
возвращает true еслиa
иb
ссылается на точно такой же объектДля строк:
a === b
возвращает true, еслиa
иb
являются строками, и содержат одинаковые символыСтруны: особый случай ...
Строки не являются типами значений, но в Javascript они ведут себя как типы значений, поэтому они будут «равны», когда символы в строке одинаковы и имеют одинаковую длину (как объяснено в третьем правиле)
Теперь становится интересно:
Но как насчет этого?
Я думал, что строки ведут себя как типы значений? Ну, это зависит от того, кого вы спрашиваете ... В этом случае a и b не одного типа.
a
имеет типObject
, аb
имеет типstring
. Просто помните, что создание строкового объекта с помощьюString
конструктора создает что-то типа,Object
который большую часть времени ведет себя как строка .источник
new Number() == "0"
, Также в Firefox:(function(){}) == "function () {\n}"
new String("123") !== "123"
. Они разных типов. Простой, но запутанный.String
объекты ведут себя как строки, как и любой другой объект .new String
никогда не должен использоваться, поскольку это не создает настоящие строки. Настоящая строка и может быть сделана со строковыми литералами или вызыватьсяString
как функция безnew
, например:String(0); //"0", Real string, not an object
Позвольте мне добавить этот совет:
Если сомневаетесь, прочитайте спецификацию !
ECMA-262 - это спецификация языка сценариев, для которого JavaScript является диалектом. Конечно, на практике важнее то, как ведут себя наиболее важные браузеры, чем эзотерическое определение того, как что-то должно обрабатываться. Но полезно понять, почему новая строка («а»)! == «а» .
Пожалуйста, позвольте мне объяснить, как прочитать спецификацию, чтобы прояснить этот вопрос. Я вижу, что в этой очень старой теме никто не дал ответа на очень странный эффект. Так что, если вы можете прочитать спецификацию, это очень поможет вам в вашей профессии. Это приобретенный навык. Итак, продолжим.
Поиск в файле PDF для === приводит меня к странице 56 спецификации: 11.9.4. Оператор строгого равенства (===) , и после просмотра спецификации я нахожу:
Интересным является шаг 11. Да, строки обрабатываются как типы значений. Но это не объясняет, почему новая строка («а»)! == «а» . У нас есть браузер, не соответствующий ECMA-262?
Не так быстро!
Давайте проверим типы операндов. Попробуйте сами, обернув их в typeof () . Я обнаружил, что новая строка ("a") является объектом, и используется шаг 1: вернуть false, если типы различаются.
Если вам интересно, почему new String ("a") не возвращает строку, как насчет упражнения по чтению спецификации? Радоваться, веселиться!
Aidiakapi написал это в комментарии ниже:
new всегда возвращает Object, даже для конструкторов String . И увы! Семантика значения для строк (см. Шаг 11) теряется.
И это, наконец, означает: новая строка («а»)! == «а» .
источник
new String('x')
, потому что я никогда не видел ни одного кода в дикой природе, который использует примитивные объекты-обертки, и я не думаю, что есть много веских причин, особенно в наши дни. Вы когда-нибудь сталкивались с кодом, который делает?new String()
.new String()
это меньше всего из ваших забот. Я понимаю проблему в теории, но, опять же, у вас есть примеры из реальной жизни? Для меня это как старая тревога, что кто-то может установитьundefined
другую ценность.В PHP и JavaScript это оператор строгого равенства. Это означает, что он будет сравнивать как тип, так и значения.
источник
var a = {}, b = {};
a == b
возвращает false.var a = {}, b = {};
Хотя и то,a
иb
другое действительно является объектом, но с технической точки зрения они не одинаковы» . Это разные экземпляры. Обратите внимание, что сравнение экземпляров ведет себя иначе, чем сравнение примитивов. Что, вероятно, добавляет к этой путанице. Вы увидите похожее поведение сравнения, если будете использовать версию экземпляра примитивных типов данных. Например,new String('asdf')
илиnew Number(5)
. Пример:new Number(5) == new Number(5)
ложь, хотя они имеют одинаковое значение.Я проверил это в Firefox с Firebug, используя такой код:
а также
Мои результаты (проверены пять раз каждый и усреднены):
Поэтому я бы сказал, что минимальная разница (это более 100000 итераций, помните) ничтожна. Производительность не повод для этого
===
. Напечатайте безопасность (ну, так же безопасно, как в JavaScript), и качество кода.источник
==
не согласны.==
оператора? Помните, что тогда происходит повышение производительности.===
чрезмерного использования,==
но вы ошибаетесь, что их производительность практически одинакова, и вы думаете, что этот тест доказывает, что, как и многие другие люди согласились, для меня это абсолютно абсурдно.В JavaScript это означает то же значение и тип.
Например,
но
источник
=== Оператор называется строгим оператор сравнения, он действительно отличается от == оператора.
Давайте возьмем 2 переменные a и b.
Чтобы "a == b" было оценено как истинное, a и b должны быть одинаковыми .
В случае «a === b» a и b должны иметь одинаковое значение, а также один и тот же тип, чтобы оно имело значение true.
Возьмите следующий пример
В итоге ; использование оператора == может дать значение true в ситуациях, когда вы этого не хотите, поэтому использование оператора === будет безопаснее.
В сценарии использования 90% не имеет значения, какой из них вы используете, но удобно знать разницу, когда вы однажды получите неожиданное поведение.
источник
Почему
==
это так непредсказуемо?Что вы получаете, когда сравниваете пустую строку
""
с нулевым числом0
?true
Да, это верно в соответствии с
==
пустой строкой и нулевым числом одновременно.И это не заканчивается, вот еще один:
Вещи становятся действительно странными с массивами.
Тогда страннее со строками
Становится хуже:
Когда равен не равен?
Позвольте мне сказать это еще раз:
И это просто сумасшедшие вещи, которые вы получаете с примитивами.
Это совершенно новый уровень безумия, когда вы используете
==
объекты.На данный момент ваш, вероятно, интересно ...
Почему это происходит?
Ну, это потому, что в отличие от «тройного равенства» (
===
), который просто проверяет, совпадают ли два значения.==
делает целую кучу других вещей .Он имеет специальную обработку для функций, специальную обработку для нулей, неопределенных, строк, вы называете это.
Это довольно странно.
На самом деле, если вы попытаетесь написать функцию, которая делает то, что
==
делает, она будет выглядеть примерно так:Так что это значит?
Это значит
==
это сложно.Поскольку это сложно, трудно понять, что произойдет, когда вы его используете.
Что означает, что вы можете получить ошибки.
Так что мораль этой истории ...
Сделай свою жизнь менее сложной.
Используйте
===
вместо==
.Конец.
источник
looseEqual
не правы.Function == Function.toString()
верно, ноlooseEqual(Function, Function.toString())
ложно. Не уверен, почему вы отфильтровываете функции в начале.typeof x === "object"
проверяете, является ли это объектом, но `typeof работает только для ненулевых примитивов. Возможно, вас заинтересует мой список правильных способов проверить, является ли значение объектом(function blah() { console.log("test"); }) != {valueOf:function(){return "function blah() { console.log(\"test\"); }";}}
- проверьте этот JS Fiddle, который запускает все тесты: jsfiddle.net/luisperezphd/7k6gcn6g (там 1225 тестовых перестановок)==
делает многое, что делает очень трудным предвидеть результаты, в то время как===
он намного более прост и предсказуем, что является одной из основных причин===
, по которой рекомендуется делать выбор. (Я добавлю примечание к ответу, упомянув вашу точку зрения)===
проверяет одинаковые стороны как по типу, так и по значению .Пример:
Общий пример:
Еще один распространенный пример:
Много раз нетипизированная проверки будет удобно , потому что вы не заботитесь , если значение либо
undefined
,null
,0
или""
источник
'string' !== 'number'
Блок-схема выполнения Javascript для строгого равенства / Сравнение '==='
Блок-схема выполнения Javascript для нестрогого равенства / сравнения '=='
источник
string
стрелка указывает на большую серую коробку, это должно означать, что прерыватель бросает строку в число?string
предполагается, что его следует сравнивать с типомnumber
, так что прерыватель смотрит на то, с чем должна сравниваться строка, и соответственно отбрасывает ее?ToNumber
будет возвращаться, если ему даны разные типы, поэтому, если ему дана строка, он выберет только последний вариант (и преобразует его в число).==
используетсяToNumber
только в случаяхstring == number
илиboolean == anything
выше (и только наstring
/boolean
). Это означает,==
что никогда не будет конвертироватьundefined
илиnull
даже если они находятся в сером поле. (Для любой комбинации одногоundefined
илиnull
обоих оба==
всегда будут возвращатьсяtrue
. Кроме того, не имеет значения, находится ли значение слева или справа,==
(и===
) будет возвращать тот же результат.)JavaScript
===
против==
.источник
Это означает равенство без приведения типов Приведение типов означает, что JavaScript не преобразует автоматически любые другие типы данных в строковые типы данных.
источник
В типичном скрипте не будет разницы в производительности. Более важным может быть тот факт, что тысяча "===" на 1 КБ тяжелее тысячи "==" :) Профилировщики JavaScript могут сказать вам, есть ли разница в производительности в вашем случае.
Но лично я бы сделал то, что предлагает JSLint. Эта рекомендация существует не из-за проблем с производительностью, а из-за того, что приведение типов означает «
('\t\r\n' == 0)
истина».источник
Оператор сравнения == сбивает с толку и его следует избегать.
Если вы должны жить с этим, то помните следующие 3 вещи:
РАВНАЯ ТАБЛИЦА РАВНЫХ ОПЕРАТОРОВ В JAVASCRIPT
** СТРАННЫЙ: обратите внимание, что любые два значения в первом столбце не равны в этом смысле. **
источник
Вряд ли будет какая-либо разница в производительности между двумя операциями при вашем использовании. Преобразование типов не требуется, поскольку оба параметра уже одного типа. Обе операции будут иметь сравнение типов с последующим сравнением значений.
источник
Да! Это имеет значение.
===
Оператор в javascript проверяет значение, а также тип, где==
оператор as просто проверяет значение (выполняет преобразование типа, если требуется) .Вы можете легко проверить это. Вставьте следующий код в файл HTML и откройте его в браузере
Вы получите « ложь » в тревоге. Теперь измените
onPageLoad()
метод, чтобыalert(x == 5);
вы получили истинное значение .источник
===
Оператор проверяет значения, а также типы переменных на равенство.==
Оператор просто проверяет значение переменных на равенство.источник
Это строгий проверочный тест.
Это хорошо, особенно если вы проверяете между 0 и false и null.
Например, если у вас есть:
Затем:
Все возвращает истину, и вы можете не хотеть этого. Предположим, у вас есть функция, которая может возвращать 0-й индекс массива или false при сбое. Если вы проверите «==» false, вы можете получить запутанный результат.
Так что с тем же, что и выше, но строгим тестом:
источник
0 != null
, -1JSLint иногда дает вам нереальные причины для изменения материала.
===
имеет точно такую же производительность, как==
если бы типы уже были одинаковыми.Это быстрее, только когда типы не совпадают, и в этом случае он не пытается конвертировать типы, но напрямую возвращает false.
Итак, IMHO, JSLint может использоваться для написания нового кода, но бесполезной чрезмерной оптимизации следует избегать любой ценой.
Это означает, что нет смысла переходить
==
к===
проверке, например,if (a == 'test')
когда вы знаете, что факт может быть только строкой.Таким образом, изменение большого количества кода тратит время разработчиков и рецензентов и ничего не дает.
источник
Просто
==
означает сравнение между операндами сtype conversion
&
===
означает сравнение между операндами безtype conversion
Преобразование типов в javaScript означает, что javaScript автоматически преобразует любые другие типы данных в строковые типы данных.
Например:
источник
Простой пример
источник
Первые два ответа оба упомянутых == означает равенство и === означает идентичность. К сожалению, это утверждение неверно.
Если оба операнда == являются объектами, то они сравниваются, чтобы увидеть, являются ли они одним и тем же объектом. Если оба операнда указывают на один и тот же объект, оператор равенства возвращает true. В противном случае два не равны.
В приведенном выше коде оба == и === становятся ложными, потому что a и b не являются одинаковыми объектами.
То есть: если оба операнда == являются объектами, == ведет себя так же, как ===, что также означает идентичность. Существенное отличие этих двух операторов заключается в преобразовании типов. == имеет преобразование, прежде чем проверяет равенство, но === нет.
источник
Как правило, я бы обычно использовал
===
вместо==
(и!==
вместо!=
).Причины объяснены в ответах выше, и Дуглас Крокфорд довольно ясно об этом ( JavaScript: Хорошие части ).
Однако есть одно единственное исключение :
== null
это эффективный способ проверить, является ли он пустым или неопределенным:Например, jQuery 1.9.1 использует этот шаблон 43 раза, и по этой причине средство проверки синтаксиса JSHint даже предоставляет возможность
eqnull
расслабления.Из руководства по стилю jQuery :
источник
Проблема в том, что вы можете легко попасть в беду, так как JavaScript имеет много неявных преобразований, означающих ...
Что довольно скоро становится проблемой. Лучший пример того, почему неявное преобразование является «злым», можно взять из этого кода в MFC / C ++, который на самом деле будет компилироваться из-за неявного преобразования из CString в HANDLE, который является указателем typedef типа ...
Который, очевидно, во время выполнения делает очень неопределенные вещи ...
Google для неявных преобразований в C ++ и STL, чтобы получить некоторые аргументы против этого ...
источник
0 == null
ложноИз основной ссылки javascript
источник
Сравнение равенства:
оператор
==
Возвращает true, когда оба операнда равны. Операнды преобразуются в один и тот же тип перед сравнением.
Сравнение равенства и типов:
оператор
===
Возвращает true, если оба операнда имеют одинаковый тип. Как правило, это лучше и безопаснее, если сравнивать таким образом, потому что нет закулисных преобразований типов.
источник
Вот удобная таблица сравнения, которая показывает, какие преобразования происходят, и различия между
==
и===
.В заключении говорится:
http://dorey.github.io/JavaScript-Equality-Table/
источник
null и undefined - это ничто, то есть
Здесь
a
иb
нет ценностей. Принимая во внимание, что 0, false и '' являются значениями. Общим для всех них является то, что все они являются ложными значениями, что означает, что все они удовлетворяют ложным условиям.Итак, 0, false и '' вместе образуют подгруппу. И с другой стороны, null & undefined образуют вторую подгруппу. Проверьте сравнения на изображении ниже. null и undefined будут равны. Три других были бы равны друг другу. Но все они рассматриваются как ложные условия в JavaScript.
Это то же самое, что и любой объект (например, {}, массивы и т. Д.), Непустая строка и логическое значение true - все условия истинности. Но они все не равны.
источник