PDA

Просмотр полной версии : сравнение "undefined" и 0


ambuddy
30.12.2008, 15:49
trace(undefined >= 0); // true
trace(undefined <= 0); // true
trace(undefined > 0); // undefined
trace(undefined > 0); // undefined
trace(undefined == 0); // falseКто-нить может объяснить почему?

iNils
30.12.2008, 17:01
Сверху AS, снизу байткод
trace(undefined > 0); // undefined
//
push UNDEF, 0.00
greaterThan

и
trace(undefined > 0); // undefined
//
push UNDEF, 0.00
greaterThan

В версиях младше 7-го плеера здесь бы возвращался false, но начиная с 7-ки логика изменилось. undefined - это неопределенное значение, поэтому сказать, больше или меньше нельзя, поэтому результат сравнения не определен, поэтому результат undefined.

trace(undefined >= 0); // true
//
push UNDEF, 0.00
lessThan
not
и
trace(undefined <= 0); // true
//
push UNDEF, 0.00
greaterThan
notЕсли сравнить с байткодом выше, то видно, что разница в заключается в отрицании (not) результата полученного от сравнения больше/меньше. То есть not применяется к undefined, который конвертируется предварительно в булево значение, что дает false. А отрицание false это true.

trace(undefined == 0); // false
//
push UNDEF, 0.00
equals
Ну тут и так понятно. Неопределенное значение не равно нулю (определенному значению) :)

ambuddy
30.12.2008, 19:52
Там trace(undefined < 0); // undefined :) Но не бог весть какая разница...
В общем-то, конечно не все ясно :) просто буду теперь иметь в виду.

iNils
30.12.2008, 19:59
Там это где?