Мне пришлось написать процедуру, которая увеличивает значение переменной на 1, если ее тип равен, number
и присваивает переменной 0, если нет, где переменная изначально null
или undefined
.
Первая реализация была v >= 0 ? v += 1 : v = 0
связана с тем, что я думал, что что-то, кроме числа, сделает арифметическое выражение ложным, но это было неверно, поскольку null >= 0
оно оценивается как истинное. Затем я узнал, что null
ведет себя как 0, и все следующие выражения оцениваются как истинные.
null >= 0 && null <= 0
!(null < 0 || null > 0)
null + 1 === 1
1 / null === Infinity
Math.pow(42, null) === 1
Конечно, null
не 0. null == 0
оценивается как ложь. Это делает кажущееся тавтологическим выражение (v >= 0 && v <= 0) === (v == 0)
ложным.
Почему null
похоже на 0, хотя на самом деле это не 0?
javascript
null
comparison
equality
К. Ли
источник
источник
null
либоundefined
:c = -~c // Results in 1 for null/undefined; increments if already a number
undefined
- значение переменной для переменных, которые не были инициализированы.null
с другой стороны, это пустое значение объекта, и его не следует смешивать с числами.null
не следует сочетать с числами, поэтому null не должен вести себя как числа.Ответы:
Кажется, ваш настоящий вопрос:
Зачем:
null >= 0; // true
Но:
null == 0; // false
Что действительно происходит, так это то, что оператор « Больше или равно» (
>=
) выполняет приведение типа (ToPrimitive
) с типом подсказкиNumber
, фактически все операторы отношения имеют такое поведение.null
особым образом обрабатывается оператором равенства (==
). В кратком, это только принуждает кundefined
:null == null; // true null == undefined; // true
Значение таких как
false
,''
,'0'
, и[]
подлежат числовой тип принуждения, все они принуждают к нулю.Вы можете увидеть внутренние детали этого процесса в алгоритме сравнения абстрактного равенства и алгоритме абстрактного реляционного сравнения .
В итоге:
Реляционное сравнение: если оба значения не относятся к типу String,
ToNumber
вызывается для обоих. Это то же самое, что добавление+
впереди, которое для null приводит к0
.Сравнение равенства: вызывает только
ToNumber
строки, числа и логические значения.источник
null is treated in a special way by the Equals Operator (==). In a brief, it only coerces to undefined:
- и что? Вы можете объяснить, почемуnull >= 0
? :)+
впереди, которое для null приводит к0
. Equality вызывает ToNumber только для строк, чисел и логических значений.Я хотел бы расширить вопрос, чтобы еще больше улучшить видимость проблемы:
null >= 0; //true null <= 0; //true null == 0; //false null > 0; //false null < 0; //false
Это просто бессмысленно. Эти вещи, как и человеческие языки, нужно выучивать наизусть.
источник
В JavaScript есть как строгие сравнения, так и сравнения с преобразованием типов.
null >= 0;
верно, но(null==0)||(null>0)
неверноnull <= 0;
верно, но(null==0)||(null<0)
неверно"" >= 0
также верноДля реляционных абстрактных сравнений (<=,> =) операнды сначала преобразуются в примитивы, а затем в тот же тип перед сравнением.
typeof null returns "object"
Когда тип - объект, javascript пытается преобразовать объект в строку (т.е. null), предпринимаются следующие шаги ( ECMAScript 2015 ):
PreferredType
не прошел, пустьhint
будет «по умолчанию».PreferredType
этоhint
строка, пустьhint
будет «строка».PreferredType
- этоhint
номер, пустьhint
будет «номер».exoticToPrim
будетGetMethod(input, @@toPrimitive)
.ReturnIfAbrupt(exoticToPrim)
.exoticToPrim
не определено, тоа) Пусть будет результат
Call(exoticToPrim, input, «hint»)
.б)
ReturnIfAbrupt(result)
.c) Если
Type(result)
не Object, вернуть результат.г) Вызвать исключение TypeError.
hint
"по умолчанию", пустьhint
будет "номер".OrdinaryToPrimitive(input,hint)
.Допустимые значения подсказки: «по умолчанию», «число» и «строка». Объекты Date уникальны среди встроенных объектов ECMAScript в том смысле, что они рассматривают "default" как эквивалент "string". Все другие встроенные объекты ECMAScript рассматривают «по умолчанию» как эквивалент «числа» . ( ECMAScript 20.3.4.45 )
Думаю,
null
конвертирует в 0.источник
У меня такая же проблема !!. В настоящее время мое единственное решение - отделиться.
var a = null; var b = undefined; if (a===0||a>0){ } //return false !work! if (b===0||b>0){ } //return false !work! //but if (a>=0){ } //return true !
источник
if (a!=null && a>=0)
. Это проясняет причину, по которой нельзя просто>=
действовать сам по себе: «a может иметь значение null (или undefined, что также равно '== null')».console.log( null > 0 ); // (1) false console.log( null == 0 ); // (2) false console.log( null >= 0 ); // (3) true
Математически это странно. Последний результат гласит, что «null больше или равно нулю», поэтому в одном из приведенных выше сравнений он должен быть истинным, но оба они ложны.
Причина в том, что проверка на равенство
==
и сравнения> < >= <=
работают по-разному. Сравнения преобразуют null в число, обрабатывая его как0
. Вот почему (3)null >= 0
есть,true
а (1)null > 0
естьfalse
.С другой стороны, проверка равенства
==
дляundefined
иnull
определяется таким образом, что без каких-либо преобразований они равны друг другу и не равны ничему другому. Вот почему (2)null == 0
естьfalse
.источник