Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   как происходит нестрогое сравнение? (http://www.flasher.ru/forum/showthread.php?t=66928)

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

Вот почитай об сравнении

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


Часовой пояс GMT +4, время: 08:37.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.