PDA

Просмотр полной версии : как происходит нестрогое сравнение?


AlDev
20.07.2005, 06:46
Как всё-таки происходит нестрогое сравнение?
с помощью valueOf или toString?

если что-то из вышеперечисленного, то как объяснить вот это?

trace(this.start_date);
trace(this.end_date);
trace(this.start_date.valueOf()==this.end_date.valueOf());
trace(this.start_date.toString()==this.end_date.toString());
trace(this.start_date==this.end_date);


выводится соответственно:

Wed Feb 1 00:00:00 GMT+0800 2006
Wed Feb 1 00:00:00 GMT+0800 2006
true
true
false

this.start_date - Date
this.end_date - Date
т.е. и при valueOf, и при toString значения одинаковые, однако когда произвожу сравнение start_date и end_date напрямую, выводится false.
Причем методы valueOf и toString у класса Date есть.

iNils
20.07.2005, 11:45
Вот почитай об сравнении (http://www.flasher.ru/forum/showthread.php?t=65846&page=3&pp=10)

PS. Взял твой пример и в последнем случаи у меня было true. И в mx и mx 20004

AlDev
20.07.2005, 12:19
я в FAME сижу...

var start_dat:Date = new Date(2005,1,1,0,0);
var end_dat:Date = new Date(2005,1,1,0,0);
trace(start_dat==end_dat);

выдаётся:

false

собственно valueOf у start_dat и end_dat одинаковы...
UTC у этих дат одинаковы. Как они вообще сравниваются?? и почему собственно false выдаётся?

iNils
20.07.2005, 12:29
Ошибся я. False там, забыл значения date определеить :)

А вообще забавно:
if (this.start_date > this.end_date) {
trace (1);
} else if (this.start_date < this.end_date) {
trace (2);
} else if (this.start_date == this.end_date){
trace (0);
} else {
trace ("???");
}

AlDev
20.07.2005, 12:42
эт что получается, они ни больше, ни меньше, ни равны??
эт вообще как?

AlDev
20.07.2005, 12:45
в продолжении:

trace (start_dat>=end_dat);
trace (start_dat<=end_dat);

выдаётся true

iNils
20.07.2005, 12:55
Date.prototype.valueOf = function () {
trace ("---");
};
this.end_date = new Date ();
this.start_date = new Date ();
trace (this.start_date == this.end_date);
if (this.start_date > this.end_date) {
trace (1);
} else if (this.start_date < this.end_date) {
trace (2);
} else if (this.start_date == this.end_date) {
trace (0);
} else {
trace ("???");
}

AlDev
20.07.2005, 13:03
при >= и <= тож вызывается valueOf.
тогда собственно говоря, возвращаемся к вопросу, как сравниваются даты.

iNils
20.07.2005, 13:22
Я думаю так. Тут происходит не сравнение дат, а сравнение объектов.
Если псоле определения дат вставить строчку this.end_date=this.start_date, то при сравнение, будет true.

AlDev
20.07.2005, 13:28
да, но сравнение объектов нестрогое разве не через valueOf идёт?

Смольный (Smolniy)
20.07.2005, 13:49
Вообще говоря, valueOf возвращает количество миллисекунд, прошедших с 1.1.1970, поэтому сравнение происходит просто по числу.
В этом плане показателен пример:
d = new Date ();
trace (d)
n = d*1
trace (n)
trace (d.getTime())
trace (d.valueOf())
=========
Wed Jul 20 12:48:33 GMT+0400 2005
1121849313937
1121849313937
1121849313937
Если выполнять +, то он имеет преимущественно стринговое действие, поэтому
d = new Date ();
trace (d)
n = d+0
trace (n)
trace (d.getTime())
trace (d.valueOf())
=========
Wed Jul 20 12:47:53 GMT+0400 2005
Wed Jul 20 12:47:53 GMT+0400 20050
1121849273671
1121849273671

Теперь о примере. Если даты разные, то
e = new Date ();
s = new Date (1999, 3, 3);
trace (s.getTime());
trace (e.getTime());
trace (s == e);
if (s > e) {
trace (1);
} else if (s < e) {
trace (2);
} else if (s == e) {
trace (0);
} else {
trace ("???");
}
============
923083200000
1121849203562
false
2
а если они одинаковые, то видимо Flash сравнивает объекты, что не имеет с его точки зрения смысла, поэтому сравнение не срабатывает.
В конце концов, ведь
a = new String("мама мыла раму");
b = new Object;
if (a > b) {
trace (1);
} else if (a < b) {
trace (2);
} else if (a == b) {
trace (0);
} else {
trace ("???");
}
===================
???


Вообще же дела чуднЫе, как впрочем зачастую в Flash.

AlDev
20.07.2005, 14:10
все эти чУдные дела полностью наследуются от Object. Так-что Date как-таковой тут не причём:

Object.prototype.valueOf = function()
{
trace ('valueOff called');
}
var obj_1:Object = new Object();
var obj_2:Object = new Object();
trace ('res='+(obj_1>obj_2));

iNils
20.07.2005, 14:14
У Date valueOf не наследуется от Object.valueOf
Он равен Date.getTime

AlDev
20.07.2005, 14:20
я имел ввиду, что сравнение на <> происходит через valueOff, а сравнение == не имеет смысла. Так-же, как и в Object