Почему значение null & lt; 1 true в JavaScript? [Дубликат]

вам нужно добавить класс [System.Serializable] в PlayerItem, например:

using System;
[System.Serializable]
public class PlayerItem   {
    public string playerId;
    public string playerLoc;
    public string playerNick;
}
114
задан C. Lee 21 August 2012 в 08:10
поделиться

4 ответа

Кажется, что ваш реальный вопрос:

Почему:

null >= 0; // true

Но:

null == 0; // false

Что действительно происходит, так это то, что Оператор большего или равного (>=) выполняет принуждение типа ( ToPrimitive ) с типом hint Number, на самом деле все реляционные операторы имеют такое поведение.

null особым образом обрабатывается оператором равенства (==). Вкратце, только принуждает к undefined:

null == null; // true
null == undefined; // true

Значения, такие как false, '', '0' и [], подлежат к числовому типу принуждения, все из них принуждают к нулю.

Вы можете увидеть внутренние детали этого процесса в Алгоритм сравнения абстрактного равенства и . Абстрактное реляционное сравнение Алгоритм .

В резюме:

  • Реляционное сравнение: если оба значения не являются строковыми, то на обоих вызывается ToNumber. Это то же самое, что добавить перед + фронт, который для нулевых когерентностей равен 0.
  • Сравнение равенств: только вызовы ToNumber для строк, чисел и логических элементов.
176
ответ дан Michael Liquori 21 August 2018 в 15:11
поделиться
  • 1
    Привет CMS, в соответствии с вашим объяснением null примитив равен 0, поэтому 0 & gt; = 0 возвращает true и == возвращает false.but в соответствии с алгоритмом ecma. Если Type (x) является Object и Type (y) является либо строкой, либо номером, верните результат сравнения ToPrimitive (x) == y.then в этом он должен вернуть true.please объясните мне – bharath muppa 7 June 2016 в 06:34
  • 2
    мне ответ не отвечает answer - null is treated in a special way by the Equals Operator (==). In a brief, it only coerces to undefined: - и что? Можете ли вы объяснить, почему null >= 0? :) – Andrey Deineko 26 June 2016 в 14:01
  • 3
    @bharathmuppa @ andrey-deineko: Остальная часть ответа CMS находится здесь: Алгоритм абстрактного реляционного сравнения , который объясняет в пункте 3. что, если оба значения не являются строковыми, для них вызывается ToNumber. Это то же самое, что добавить перед + фронт, который для нулевых когерентностей равен 0. Равенство только вызывает ToNumber для строк, чисел и булевых. – Michael Liquori 23 August 2016 в 15:32
  • 4
    Хорошее описание, но мне это не нравится. На любом языке (x == 0 || x & gt; 0) должно быть эквивалентно (x & gt; = 0). javascript - это глупый язык. – John Henckel 29 November 2016 в 17:14
  • 5
    Это просто ошибка в спецификации действительно (потому что математически это неправильно), и нет ничего общего с этим, поскольку миллионы веб-сайтов полагаются на нулевые сравнения ^^ ' – mahieddine 8 August 2018 в 13:43

Я хотел бы расширить вопрос, чтобы еще больше улучшить видимость проблемы:

null >= 0; //true
null <= 0; //true
null == 0; //false
null > 0;  //false
null < 0;  //false

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

10
ответ дан estani 21 August 2018 в 15:11
поделиться
  • 1
    Как описано выше, это можно объяснить только как исключение, так как == обрабатывает значение null, иначе во всех случаях значение null преобразуется в 0 с помощью Number (nulll) – Sourabh Ranka 22 March 2018 в 22:10
0
ответ дан jon 21 August 2018 в 15:11
поделиться

У JavaScript есть как строгие, так и сопоставления типов

null >= 0;, но (null==0)||(null>0) - false

null <= 0; истинно, но (null==0)||(null<0) - false

"" >= 0 также верно

Для реляционных абстрактных сравнений (& lt; =,> =) операнды сначала преобразуются в примитивы, а затем к тому же типу перед сравнением.

typeof null returns "object"

Когда тип - объект javascript пытается стягивать объект (т. е. null), предпринимаются следующие шаги ( ECMAScript 2015 ):

  1. Если PreferredType не был передан, пусть hint будет «по умолчанию».
  2. Иначе, если PreferredType - hint String, пусть hint будет «string».
  3. Else PreferredType - hint Число, пусть hint будет «числом».
  4. Пусть exoticToPrim будет GetMethod(input, @@toPrimitive).
  5. ReturnIfAbrupt(exoticToPrim).
  6. Если exoticToPrim не определено, то a) Пусть результат будет Call(exoticToPrim, input, «hint»). b) ReturnIfAbrupt(result). c) Если Type(result) не является объектом, верните результат. d) Выбросить исключение TypeError.
  7. Если hint является «значением по умолчанию», пусть hint будет «числом».
  8. Возврат OrdinaryToPrimitive(input,hint).

Допустимыми значениями для подсказки являются «по умолчанию», «число» и «строка». Объекты Date уникальны среди встроенных объектов ECMAScript в том смысле, что они рассматривают значение по умолчанию как эквивалентное «string». Все остальные встроенные объекты ECMAScript трактуют «по умолчанию» как эквивалентные «числу». ( ECMAScript 20.3.4.45 )

Итак, я думаю, null преобразуется в 0.

4
ответ дан Panos Kal. 21 August 2018 в 15:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: