Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Простенькая задачка, а я туплю... :( (https://javascript.ru/forum/misc/60715-prostenkaya-zadachka-ya-tuplyu.html)

Keramet 15.01.2016 22:40

Простенькая задачка, а я туплю... :(
 
var a = new F();
	var b = new F();

	alert(a == b);
	function F() {};


Сделать так, чтобы a == b возвращало true.

Lemme 15.01.2016 22:45

Keramet,
alert({} == {})


проверяй с помощью instanceof
http://learn.javascript.ru/instanceof

Keramet 15.01.2016 23:01

Lemme,
я это понимаю. это типа пример на собеседовании. Дано:
var a = new F();
var b = new F();
alert(a == b);
function F() {};

сделать так, чтобы a == b выдавало true.
Надо код ниже дописать, чтобы a == b. Вот я и хочу понять, такое можно реализовать?
Я думал что-то типа
F.prototype.valueOf  = function() { return 1; }  // ну или, к примеру,  true

дописать. Ведь при операции нестрого равенства происходит преоб-е типов, если один из операндов объект - то он приводится к примитиву с использованием valueOf(). НО что-то не работает :(

Keramet 15.01.2016 23:10

var a = new F();
var b = new F();
function F() {};
F.prototype.valueOf  = function() { return 1; };

	alert(a == 1);     // true
	alert(b == 1);     // true
	alert(b == a);     // false

Неужели не возможно, чтобы alert(b == a) дал true, если и a, и b == 1?

Яростный Меч 15.01.2016 23:18

function F() { return Date; }

Keramet 15.01.2016 23:20

А, я разобрался, вопрос снят - такое сделать нельзя!
Равенство (==)

Keramet 15.01.2016 23:23

Цитата:

Сообщение от Яростный Меч (Сообщение 403921)
function F() { return Date; }

т.е. это дописать ниже или заменить первое объявление функции?

Keramet 15.01.2016 23:26

Яростный Меч,
работает ))

Яростный Меч 15.01.2016 23:28

Заменить точно можно, дописать - вроде тоже

Keramet 15.01.2016 23:30

Яростный Меч,
заменять, я так понял, не надо. Надо именно дописать. Т.е. чтобы b == a надо вернуть какой-то глобальный объект?

Яростный Меч 15.01.2016 23:41

Цитата:

Сообщение от Keramet (Сообщение 403926)
Яростный Меч,
заменять, я так понял, не надо. Надо именно дописать. Т.е. чтобы b == a надо вернуть какой-то глобальный объект?

Глобальный или из текущего скоупа. Тут идея в том, что если функция возвращает обект, то он и будет результатом new

Keramet 16.01.2016 00:23

Цитата:

Сообщение от Яростный Меч (Сообщение 403928)
Глобальный или из текущего скоупа...

С глобальными вроде понятно (Date, Math, ...) А можете привести пример объекта из текущего скоупа (для этого примера)? Что, кроме глоб. объекта, можно вернуть, чтобы a==b?

Decode 16.01.2016 00:36

Цитата:

Сообщение от Keramet (Сообщение 403917)
Lemme,
я это понимаю. это типа пример на собеседовании. Дано:
var a = new F();
var b = new F();
alert(a == b);
function F() {};

сделать так, чтобы a == b выдавало true.
Надо код ниже дописать, чтобы a == b. Вот я и хочу понять, такое можно реализовать?
Я думал что-то типа
F.prototype.valueOf  = function() { return 1; }  // ну или, к примеру,  true

дописать. Ведь при операции нестрого равенства происходит преоб-е типов, если один из операндов объект - то он приводится к примитиву с использованием valueOf(). НО что-то не работает :(

Keramet, два разных объекта при сравнении не могут давать true. В чем заключается твоя задача? Сделать a == b?

var a = +new F(),
    b = +new F();

function F() {
  this.value = 1;
  this.valueOf = function() {
    return this.value;
  };
}

alert(a == b);

tsigel 16.01.2016 01:45

Может быть я не в тему, но у меня отчетливое ощущение того что автор не так понял задачу. Судя по тому что это задача была на собеседовании скорее всего хотели просто получить пример реализации синглтона. Простите если я не прав. Глупо спрашивать на собеседовании хаки и тонкости типа valueOf, обычно стоит задача выяснить владение паттернами и умение их применять, аогоритмирование и прочее. Я не имею в виду что не надо знать про то как работает valueOf и toString, просто механизмы приведения типов в js иногда чудят, но при этом это не мешает людям которые не знают этих тонкостей писать на js хорошо и красиво. Просто не всем приходит в голову сравнивать данные разных типов)

var F = (function () {

  var instance;

  var F = function () {
     if (instance) return instance;
     instance = this;
  };

  return F;
})();

var a = new F();
var b = new F();

alert(a === b);
alert(a == b);

ruslan_mart 16.01.2016 06:27

function F() {
	if(this instanceof F) {
		if(!F.prototype._self) {
			F.prototype._self = this;
		}
		return F.prototype._self;
	}
}

var a = new F;
var b = new F;

alert(a === b);

alert(a instanceof F);

alert(b instanceof F);

caetus 16.01.2016 09:05

var F = function that () {
    var self = this;
    F = function () { return self}
    that.prototype.constructor = F;
    F.prototype = that.prototype;
}


var a = new F();
var b = new F();


alert(a === b)

Яростный Меч 16.01.2016 12:02

Цитата:

Сообщение от Keramet (Сообщение 403930)
С глобальными вроде понятно (Date, Math, ...) А можете привести пример объекта из текущего скоупа (для этого примера)? Что, кроме глоб. объекта, можно вернуть, чтобы a==b?

Да хотя бы саму функцию F


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