Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   антипод eval (https://javascript.ru/forum/misc/52932-antipod-eval.html)

dimy44 13.01.2015 17:49

антипод eval
 
Поскажите, какая функция в js является антиподом eval. В python это repr. Чтоб я мог, скажем, массив сохранить в файл в строковом представлении, а при надобности гарантированно мог восстановить с помощью eval.

рони 13.01.2015 18:00

dimy44,
http://learn.javascript.ru/json

dimy44 13.01.2015 18:12

Понял, спасибо.

registrant 15.01.2015 21:56

dimy44,
Такое возможно только в говноязыках. В js этого сделать невозможно, в общем случае. это возможно только для "ненастоящих" объектов, которые ты конвенциально, по взаимной договоренности, используешь как таблицу.

VANjs 19.01.2015 17:21

Цитата:

Сообщение от registrant
... Такое возможно только в говноязыках. В js этого сделать невозможно...

ну типа js это супер язык, но как раз в нем, то что именно требуется сделать, а вот и низзя!!!


Логика отдыхает :))))))))))

Aetae 19.01.2015 21:02

Ну ещё можно так:
function foo(){
   bar('парам пам пам')
}

alert(foo.toString())
alert(foo.toSource())

Но в твоём случае нужен именно json.

registrant 20.01.2015 16:23

Цитата:

Сообщение от VANjs
Логика отдыхает

андронный коллайдер -- зачетная штука, но ей нельзя забивать гвозди, какая жалость. Вот она где, логика...

dimy44 20.01.2015 19:53

Цитата:

Сообщение от registrant (Сообщение 351601)
dimy44,
Такое возможно только в говноязыках. В js этого сделать невозможно, в общем случае. это возможно только для "ненастоящих" объектов, которые ты конвенциально, по взаимной договоренности, используешь как таблицу.

Я привел пример из Python. Вы действительно считаете питон говноязыком? Хм...

registrant 20.01.2015 19:57

Цитата:

Сообщение от dimy44
Вы действительно считаете питон говноязыком? Хм...

Да.

kobezzza 20.01.2015 20:05

В современном JS все объекты имеют встроенный метод toSource (это и есть антипод eval), который возвращает исходный код объекта, например,

alert({a: 1, v: 2}.toSource());
alert([1, 2, 3].toSource());
alert(function () {
  alert(121);
}.toSource());


Про JSON уже говорилось, но это частный случай, т.к. (JS != JSON).

Также ещё у объектов есть встроенный метод toString, но результат его работы в большинстве случае отличается от toSource, т.к. данный метод возвращает строковое представление объекта, а не его исходный код, например,

alert({a: 1, v: 2}.toString());
alert([1, 2, 3].toString());
alert(function () {
  alert(121);
}.toString());


Разумеется, эти базовые методы можно переопределять своими.

Цитата:

Я привел пример из Python. Вы действительно считаете питон говноязыком? Хм...
Да это просто тролль, их тут полно на форуме, можешь игнорить его :)

registrant 20.01.2015 20:15

Цитата:

Сообщение от kobezzza
встроенный метод toSource (это и есть антипод eval)

o={a: 1}
a=Object.create(o)
alert(a.a)
alert(eval((a.toSource()).a))
alert(eval(a.toSource()).a)
alert(eval(a.toSource())===a)

dimy44 20.01.2015 20:16

registrant, ясно. Это Ваше мнение, спорить не буду.
kobezzza, спасибо за разъяснения. Я не программист, это хобби, пишу себе на смартфон приложения для себя, вот недавно открыл js, времни мало, постигаю потихоньку тонкости). Сложностей не испытываю, но приходится пересматривать привычные вещи (например прототипы, а не классы, итд)

registrant 20.01.2015 20:26

Цитата:

Сообщение от dimy44
но приходится пересматривать привычные вещи (например прототипы, а не классы, итд)

Не приходится, видимо. Иначе спасибо за эту феерию бреда тут не наблюдалось бы. Хотите классов как в питоне, используйте байнд или замыкания. Чтобы врубиться в прототипы, или классы в стиле смолток/руби, придется включить мозг.

dimy44 20.01.2015 20:33

Давайте закончим споры, я ответ на свой вопрос получил, для этого тему и создавал. Для флуда разве здесь нету курилки etc?

registrant 20.01.2015 20:36

Цитата:

Сообщение от dimy44
я ответ на свой вопрос получил

получили от меня. Ваша хотелка невозможна в JS в общем случае. Не надо путать объект с хешем.
А спрорить я и не собираюсь.

dimy44 20.01.2015 20:45

registrant, от Вас я получил только информацию, что Python это говноязык. Мне ответил участник в посте #2, я сразу реализовал то что хотел. Думал, тема закрыта.

registrant 20.01.2015 20:48

Цитата:

Сообщение от dimy44
Мне ответил

Да он что-то там ответил. Если Вас интересует не правильный ответ, а первый встретившийся, тогда норм.

И я не буду тратить больше на Вас время.

dimy44 20.01.2015 21:04

Меня это решение устроило. В моем случае это не тот js, о который здесь обсуждают, это фреймворк на андроид, там урезано много, приходится выкручиваться.

kobezzza 20.01.2015 21:20

Цитата:

Сообщение от registrant (Сообщение 352428)
o={a: 1}
a=Object.create(o)
alert(a.a)
alert(eval((a.toSource()).a))
alert(eval(a.toSource()).a)
alert(eval(a.toSource())===a)

(function () {
	var toSource = Object.prototype.toSource;

	Object.defineProperty(Object.prototype, 'toSource', {
		 writable: true,
		 configurable: true,
		 enumerable: false,
		 value: function () {
			var clone = {};
			
			for (var key in this) {
				clone[key] = this[key];
			}
			
			return toSource.call(clone);
		}
	});
})();

var a = {a: 1};
var b = {
	__proto__: a, 
	c: 1,
};

alert(eval(b.toSource()).a);


:D

registrant 20.01.2015 21:47

kobezzza,
(function () {
    var toSource = Object.prototype.toSource;
 
    Object.defineProperty(Object.prototype, 'toSource', {
         writable: true,
         configurable: true,
         enumerable: false,
         value: function () {
            var clone = {};
             
            for (var key in this) {
                clone[key] = this[key];
            }
             
            return toSource.call(clone);
        }
    });
})();
 
var a = {a: 1};
var b = {
    __proto__: a,
    c: 1,
};
 
alert(eval(b.toSource())===b);

Но ты можешь проще выйти из этой ситуации
Object.prototype.toSource=function(){return this}
 
var a = {a: 1};
var b = {
    __proto__: a,
    c: 1,
};
 
alert(eval(b.toSource().a))
alert(eval(b.toSource())===b)

Все правильно работает, пока цирк не уехал.

kobezzza 20.01.2015 21:51

registrant, Ну как бы логично, что объект создаваемый из строки не должен быть равен объекту прародителю, ибо это другой объект, а в JS объекты сравниваются по ссылке.

Разумеется, если нужно, то можно сделать чтобы равнялось, также можно воссоздать дерево прототипов и т.д. JS позволяет всё это сделать, а в ES6 добавили специальный объект Reflect, в котором есть методы для ещё более удобной работы с объектами.

registrant 20.01.2015 21:54

Цитата:

Сообщение от kobezzza
ибо это другой объект

Вот это ключевое слово.

kobezzza 20.01.2015 21:59

Цитата:

Сообщение от registrant (Сообщение 352452)
Вот это ключевое слово.

Дык он и должен быть другим, мы создаём дамп объекта в виде синтаксиса JS, а потом снова натравливаем VM на полученный код и он возвращает новый объект, похожий на прародитель и это абсолютно нормальное поведение, а такая функция может понадобится, если нам по каким либо причинами не подходит JSON (ну например хотим сохранять функции без гемороя с экранированием).

Ну а если очень нужно (только не понятно зачем), чтобы полученный объект был равен исходному, то можно и это сделать, как говорится: было бы желание.

registrant 20.01.2015 22:09

kobezzza,
Я считаю, что это порочная практика, противоречащая идеологии JS в корне. Ты разрушаешь таким образом цепочки делегирования. Течет вся абстракция. Для подобных целей (манипуляций данными) надо использовать структуры данных, которые статичны, в отличии от.

kobezzza 20.01.2015 22:16

Цитата:

Я считаю, что это порочная практика, противоречащая идеологии JS в корне.
Я не говорю, что это хорошо или плохо, а просто показываю что это возможно.

Цитата:

Ты разрушаешь таким образом цепочки делегирования. Течет вся абстракция.
В методе можно учесть это, чтобы, например,

var a = {a: 1};
var b = {__proto__: a, v: 1};

b.toSource()
/*

(function () {
  var stack = [];
  stack.push({a: 1});
  stack.push({__proto__: stack[stack.length - 1], v: 1});
  return stack[stack.length - 1];
})();

*/


И т.д. по аналогии, всё зависит от требований.

Цитата:

Для подобных целей (манипуляций данными) надо использовать структуры данных.
Здесь я согласен, поэтому ТС сразу получил ответ - использовать JSON.

Safort 20.01.2015 22:26

dimy44,
Цитата:

Сложностей не испытываю, но приходится пересматривать привычные вещи (например прототипы, а не классы, итд)
Кто сказал про классы в JS? Они уже есть https://github.com/lukehoban/es6features#classes

Erolast 21.01.2015 11:00

Ты ж сам говорил, что сперва надо с прототипами навозиться :D

dimy44 21.01.2015 12:37

Мне не важно, чтобы восстановленный объект был строго равен прородителю, нужно чтобы он вел себя также, как и прородитель.
А различие в том, что в строковом представлении скажем словаря dct = {1: "1"} в питоне будет '{1: "1"}' (что str(dct), что repr(dct)), и eval(dct) его можно назад в словарь превратить, а в js по-другому.

Safort 21.01.2015 12:44

Цитата:

Сообщение от Erolast (Сообщение 352522)
Ты ж сам говорил, что сперва надо с прототипами навозиться :D

Ахаха, лол:D Что-то я про это забыл)
Да-да, надо сначала хотя бы немного осилить прототипы!

SV0L0CH 21.01.2015 13:15

Цитата:

Сообщение от dimy44 (Сообщение 352538)
Мне не важно, чтобы восстановленный объект был строго равен прородителю, нужно чтобы он вел себя также, как и прородитель.
А различие в том, что в строковом представлении скажем словаря dct = {1: "1"} в питоне будет '{1: "1"}' (что str(dct), что repr(dct)), и eval(dct) его можно назад в словарь превратить, а в js по-другому.

Строгое равенство реально для строк, чисел, логических значений и null. Остальные значения объекты и для их создания из строки нужен вызов конструктора, а в таких случаях строгое равенство невозможно. Разве что можно реализовать конструктор который будет запоминать свои экземпляры и при повторных вызовах с теми же параметрами не создавать новый объект, а выдавать существующий.

registrant 21.01.2015 13:43

Erolast,
Запости тут юзкейс, который бы показывал наглядно, что классы *нужны*. Посоны смотрят на тебя с недоумением.

registrant 21.01.2015 13:46

Цитата:

Сообщение от Safort
Они уже есть

И зачем они есть? Для жаба-быдла спецом?

Erolast 21.01.2015 14:50

Цитата:

Erolast,
Запости тут юзкейс, который бы показывал наглядно, что классы *нужны*. Посоны смотрят на тебя с недоумением.
Чо? Я? А больше тебе ничего не надо?

registrant 21.01.2015 14:59

Не надо, этого достаточно, чтобы засчитать слив пустоболу, который за свои высеры отвечать не в состоянии. Классы нужны, да, ты это продемонстрировал.

registrant 21.01.2015 15:22

Erolast,
Оппа, кирпичами срем? Ну-ну, доставил, хомячек.

Erolast 21.01.2015 15:22

:blink:
Ненормальный. Ты с кого дому-то будешь? А то я того, не говорил ничего о классах.

registrant 21.01.2015 15:25

Erolast,
http://javascript.ru/forum/misc/5293...tml#post352522
а это к чему было сказано? Че там за сарказм?

Erolast 21.01.2015 15:27

К тому, что Safort сам как-то говорил, что до использования классов ES6 нужно сперва механику прототипов хорошенько изучить.

registrant 21.01.2015 15:30

Erolast,
И что, ты с этим не согласен? Кто понял прототипы, тому вонючие классы не нужны, я плюсую предыдущего оратора, но более того, лучше бы классы вообще выпилить, они в любом виде не нужны, даже в изначальном, в виде new.

kobezzza 21.01.2015 15:43

registrant (он же foo, newObject и т.д.) узнал что в JS добавили сахар для классов :D :D

<iframe src="http://coub.com/embed/r3sq?muted=false&autostart=false&originalSize=false&hideTopBar=false&startWithHD=false" allowfullscreen="true" frameborder="0" width="640" height="360"></iframe>


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