Ты отличаешься между == и === (сравнения в языке сценариев JavaScript)

Всегда я видел, что в JavaScript есть:

  • ассигнования =
  • сравнения == и ===

Я верю в то, что понимаю, что == он делает что-то похожим, чтобы сравнивать стоимость переменной и === также сравни тип (как equals java).

Кто-то мог бы подтверждать мне эту точку и увеличивать это?. Я javero и не tipado javascript иногда очень нравится мне и другие я это ненавижу.


Каковым состоит правильный способ в javascript в том, чтобы сравнивать undefined, null и другая стандартная настройка?

variable == null
variable === null

¿undefined он используется как цепь текста или как ключевое слово? Который следующие сравнения - правильная для элемента html без value? (например label без контента)

variable == "undefined"
variable === "undefined"
variable == undefined
variable === undefined
96
задан 18.12.2015, 15:41
7 ответов

Операторы === и !== они - операторы строгого сравнения. Это значит, что, если у operandos есть различные типы, они не равны. Например,

1 === "1" // false
1 !== "1"  // true
null === undefined // false

Операторы == и != они - операторы беспутного сравнения. А именно, если у operandos есть различные типы, язык сценариев JavaScript старается конвертировать их для того, чтобы они были сравнимыми. Например,

1 == "1" // true
1 != "1" // false
null == undefined // true

Стой упоминать о том, что оператор == он не является переходным, в отличие от того как ===.

"0" == 0 // true
0 == ""  // true
"0" == ""// false

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

Я не помню все маленькие детали оператора ==, тогда давайте бросать беглый взгляд в спецификацию, точку 11.9.3:

Алгоритм сравнения абстрактного равенства

Сравнение x == и, где x и и это стоимость, возвратись true или false. Это сравнение осуществляется следующего способа:

  1. Если Type (x) и Type (y) - те же самые,
    1. Если Type (x) - Undefined, возвратись true.
    2. Если Type (x) - Null, возвратись true.
    3. Если Type (x) - Number,
      1. Если x - NaN, возвратись false.
      2. Если и это NaN, возвращается false.
      3. Если x - та же стоимость Number, которую и, он возвращает true.
      4. Если x +0 и и - −0, возвратись true.
      5. Если x-0 и и его +0, возвратись true.
      6. Возвратись false.
    4. Если Type (x) - String, возвратись true если x и и это точно та же последовательность символов (с той же длиной и теми же символами в соответствующих положениях). В противоположном случае, возвратись false.
    5. Если Type (x) - Boolean, возвратись true, если x и и оба true или оба false. В противоположном случае, возвратись false.
    6. Возвратись true если x и и они передают тот же объект. В противоположном случае, возвратись false.
  2. Если x он null и и - undefined, возвратись true.
  3. Если x он undefined и и - null, возвратись true.
  4. Если Type (x) - Number и Type (y) - String,
    возвращает результат сравнения x == ToNumber (y).
  5. Если Type (x) - String и Type (y) - Number,
    возврати результат сравнения ToNumber (x) == и.
  6. Если Type (x) - Boolean, возврати результат сравнения ToNumber (x) == и.
  7. Если Type (y) - Boolean, возвращает результат сравнения x == ToNumber (y).
  8. Если Type (x) - String или Number, и Type (y) - Object,
    возвращает результат сравнения x == ToPrimitive (y).
  9. Если Type (x) - Object и Type (y) - String или Number,
    возврати результат сравнения ToPrimitive (x) == и.
  10. Возвратись false.

Этот ответ - перевод моего ответа на тот же вопрос в русском сайте.

82
ответ дан 24.11.2019, 15:08

Различие состоит в том, что == сначала он пробует конвертировать типы перед тем, как сравнивать их. Оператор === не, делает прямое сравнение, хотя он всегда возвращается фальшиво, если типы различные. шрифт (на английском)

ej:

1 == "1" // verdadero    
1 === "1" // falso
'' == 0 // verdadero
'' === 0 // falso

Эти графики может быть смогли помогать тебе отображать различие:

Оператор '=='

introducir la descripción de la imagen aquí

Оператор '==='

introducir la descripción de la imagen aquí

(шрифт изображений)

44
ответ дан 24.11.2019, 15:08

Действительно == сравнивает стоимость, в то время как === сравнивает tambiГ©n тип. Например.

"1" == 1 // true
"1" === 1 // false
null == undefined // true
null === undefined // false

ты Можешь читать детали tГ©cnicos (в inglГ©s) в Equality comparisons and sameness

undefined это размещенное слово и используется без кавычек.

36
ответ дан 24.11.2019, 15:08

Не точно. Верно, что оператор === сравни тип и стоимость, не делая превращений, как сделал бы оператор ==. Однако это одинокое верное для типов стоимости. В типах из-за ссылки то, что он делает, состоит в том, чтобы подтверждать, что это тот же объект, не достаточно, чтобы он был того же типа и стоимости. Так что === он был бы оператором тождества, в отличие от того как ==.

Например:

var a = { x: 1, y: 2 };
var b = { x: 1, y: 2 };
var c = a;

a === b  // false
a === c  // true

Случай цепей функционировал бы как тип стоимости, если только ты не используешь строитель String, что был бы типом ссылки.

Указывать также на то, что оператор == он не является переходным в каких-то превращениях. Например:

'' == '0'  // false
0 == ''    // true

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

В любом случае ты можешь бросать беглый взгляд в эту страницу, которая решит сомнения относительно обоих операторов. Там ты можешь подтверждать между другими вещами, которые undefined == null но undefined !== null.

25
ответ дан 24.11.2019, 15:08
  • 1
    спасибо guillermo! то, что я только что не понял, потому что a === b false.... – Jordi Castilla 03.12.2015, 12:48
  • 2
    В пример transitividad ему не хватает случая: '0' == 0 // true (и двигать первый случай в и #250; ltimo место) – Alvaro Montoro♦ 03.12.2015, 17:28
  • 3
    @JordiCastilla это происходит, потому что у языка сценариев JavaScript есть два различных способа сравнивать: в случае примитивных (ej: int, string) сравнивается стоимость, в то время как в случае объектов (ej: восходите, array, или объекты, определенные пользователем) то, что сравнивается, является ссылкой и которое подтверждается - что est и # 233; n в том же posici и # 243; n памяти. Поэтому, когда сравнивается a с c, результата true. – Alvaro Montoro♦ 03.12.2015, 17:35
  • 4
    @JordiCastilla a === b false, потому что a и b не указывают на тот же объект..., они указывают на различные объекты, свойства которых дай случайность, которой у них есть та же стоимость – Jcl 03.12.2015, 20:16
  • 5
    Стой упоминать о том, что a == b tambi и # 233; n false. – Peter Olson 04.12.2015, 02:40

Простое добро

== - равенство стоимости и не типа.
=== - равенство стоимости и типа.

 console.log("1 == '1   =>", 1 == '1')  // true
 console.log("1 === '1' =>", 1 === '1') // false, ya que uno es un string.
 console.log("1 === 1   =>", 1 === 1)   // son iguales
10
ответ дан 24.11.2019, 15:08

Уже они ответили тебе правильно на вопрос, но я gustarГ, - чтобы высказывать мнение, в котором она кажется твоей проблемой (я tambiГ©n начался с java и есть некие вещи, которые javascript он облегчает).

у переменной может быть 2 состояния, "undefined" или иметь что-то, null, как в SQl это тип стоимости, а именно, которая, если твоя переменная имеет null, определена и у нее есть что-то, ничто но что-то: P, undefined означает, что твоя переменная не была определена, - любознательный человек этот факт прежде всего, из-за которого null == undefined он отвечает true.

Сейчас, когда ты ищешь элемент с js, и он это не находит (например document.getElementById ("inpt")) Ваша стоимость состоит null, в случае в том, что, если он нашел вопросы из-за Ваш, я оценил, и в случае когда этого не имеет он отвечает тебе "".

Интересная часть состоит в том, что с простым if ты решаешь много.

var una,dos = null,tres =[],cuatro = 1;

if(noexisto) //es undefinided, saca error por que estas preguntando por ella
if( typeof notoy == "undefined") //es la manera correcta de preguntar si una variable no ha sido definida
if(una)//false pero no saca error por que implicitamente tiene un null
if(una == null) //es lo mismo que la anterior
if(dos) //false pero no saca error
if(tres) //true por que contiene un array, vacio pero es algo
if("")//false por que esta vacio
if(cuatro)//tiene algo por tanto es true
7
ответ дан 24.11.2019, 15:08

В случае не transpilar твой код JS (с Вавилоном например) операция "==" быстрее, чем проверка типа с "===" следовательно, если твой код будет являться útilizado часто (это часть архитектуры или какого-то книжного магазина) предпочтительно использовать "==" имея в виду, что ты не будешь перемещать фильтр типа. В оставшейся части случаев (большинство) лучше использовать проверку типов с "===", чтобы предотвращать неожиданные результаты.

2
ответ дан 24.11.2019, 15:08
  • 1
    Я буду вносить немного má s на самом деле на comparació n " ==" и " ===". Это удивительно, но если ты делаешь доказательства результата тройственность comparació n - 10 % má s rá попросила в mayorí в случаев, что двойная порция. Tambié n, в случае сравнивания одного " number" с одним " string" который мы должны преобразовывать в " number" чтобы мочь реализовывать comparació n, процесс растягивается 20 раз. if (+ " 1" === 1) {//Có я говорю } Следовательно, чтобы предотвращать большие проблемы результата, - всегда рекомендуемо использовать " ===" во всех случаях, чтобы вынуждать нас писать лучше có я говорю и уважать типы. – Luis Resco 27.12.2016, 16:23