|
-62 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 407
|
|||||||||||
Eval против JSON.parse11.11.2025, 17:46. Показов 2749. Ответов 78
Метки нет (Все метки)
Сразу скажу, использовал оба метода, переключился на JSON.parse пожалуй больше из соображений более быстрого написания кода на php (хотя и повлияла встреченная где-то фраза, что eval работает медленно).
Но сейчас решил разобраться из чисто теоретического интереса: почему плохо и плохо ли использование eval в таком применении: В php формируется строка типа:
js
0
|
|||||||||||
| 11.11.2025, 17:46 | |
|
Ответы с готовыми решениями:
78
Отловить ошибку в JSON.parse (переварить не JSON) SyntaxError: JSON.parse: unexpected character at line 1 column 2 of the JSON data
|
|
Супер-модератор
3961 / 2124 / 833
Регистрация: 13.03.2010
Сообщений: 6,975
|
||
| 12.11.2025, 10:28 | ||
Сообщение было отмечено 755 как решение
Решениеeval исполняет код, а не парсит данные. Любая подмена ответа (взлом сервера или БД, XSS, HTTP, прокси/расширения/антивирус, CDN, да что угодно) = произвольный JS в браузере.2. С eval вы сами обязаны правильно экранировать строки, в то время как json_encode делает это корректно "из коробки".3. Аргумент "одна операция вместо двух" неверный: и eval, и JSON.parse парсят строку, только eval ещё и исполняет.4. eval априори медленнее любой "альтернативы".5. Правильным решением будет в PHP сделать echo json_encode($arr, JSON_UNESCAPED_UNICODE);, а в JS const m_el = JSON.parse(xhr.responseText); (ну или fetch(...).then(r=>r.json())).
1
|
||
|
2605 / 1509 / 689
Регистрация: 23.08.2015
Сообщений: 3,841
|
|
| 12.11.2025, 11:15 | |
|
0
|
|
|
-62 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 407
|
||||||||||||||||||||||
| 12.11.2025, 11:41 [ТС] | ||||||||||||||||||||||
|
Во-первых, тема создавалась как дискуссионная. В Вашем же ответе не увидел аргументов за или против: • для этого есть JSON (можно и другие форматы) - да, есть. Но и eval c этим справляется. А чем лучше JSON - из ответа не ясно. • п.2. меня также не убедил - по нему выразил ранее свои сомнения. И вот только от gogolik наконец-то прозвучали аргументы против eval. Причем аргументированные. Особенно п.1. Как раз то, что меня изначально и беспокоило. • по п.2 - это делается элементарно. И ошибки легко выявляются при отладке. • по п.3-4. - не совсем так. в php преобразование в строку, которой нет при eval (это и имел виду под первой операцией)
Да, eval выполняет интерпретатор js, поэтому операция будет медленне, чем JSON.parse. Но при нескольких массивов их еще надо разъединить (возможно, я использовал не лучший способ):
И самое на мой взгляд важное: eval работает на стороне клиента, а json_encode на стороне сервера - хотя и в одном и в другом случае не думаю, что время имеет существенное значение. Добавлено через 14 минут Просто отвечаю на вопрос sad67man, чтобы кто-либо не подумал, что спорю или что-то доказываю:
Надеюсь, смог ответить на Ваш вопрос ? Добавлено через 8 минут Да, gogolik, забыл поблагодарить за развернутый ответ и потраченное на него время.
0
|
||||||||||||||||||||||
|
2605 / 1509 / 689
Регистрация: 23.08.2015
Сообщений: 3,841
|
||
| 12.11.2025, 11:43 | ||
|
json_encode как раз защитит от инъекций и при его помощи легче формировать вложенные объекты.
0
|
||
|
Супер-модератор
3961 / 2124 / 833
Регистрация: 13.03.2010
Сообщений: 6,975
|
|
| 12.11.2025, 11:52 | |
|
755, учитесь сразу делать правильно, а не как попало. Вот основной посыл отвечающих.
0
|
|
|
-62 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 407
|
|||
| 12.11.2025, 12:08 [ТС] | |||
|
Чисто теоретически: если например таким образом формировать список брендов (когда-то давно, когда только был знаком с php и формировал справочник брендов, в их названиях обнаружил спецсимволы, которые провоцировали ошибки. Но эту проблему тогда легко решил, если не подводит память другой кодировкой строк. Добавлено через 15 минут Не по теме. И увидел Ваш комментарий к данной теме: "Тотальное нежелание учиться, нежелание слушать ..." и решил его прокомментировать. С чего Вы взяли, что у меня отсутствует нежелание учиться - за эти полтора года понимаю, что очень многое узнал, хотя и можно было бы узнать намного больше. И не только узнал, но и стал чувствовать язык при программировании, хотя еще и очень далек до полного, а это уже дается только при практике. А кроме того, возможно, мне уже поздно учиться, вопреки дедушке Ленину и мое предназначение не в программировании и коммерческом проекте, которым сейчас занят, а в некоммерческом (вспоминается фраза "жизнь пронеслась без явного следа, ..."), который мне поэтому кажется интереснее, но которым пока не могу заняться по некоторым причинам.
0
|
|||
|
3857 / 1744 / 432
Регистрация: 14.03.2022
Сообщений: 4,435
|
||||
| 12.11.2025, 12:27 | ||||
|
755, ты шедевральный индивид.
Благо такие встречаются не часто... Я не хотел вступать в полемику, но тут трудно удержаться. ![]() Камрад voraa привел ранее отличную ассоциацию с ПДД. ![]() Вот примерный макет диалога который тут происходит... Новичок (Н) и профи (П). Н - Как лучше делать "так" или "сяк"? П - Не делай "так"! Нужно делать "сяк". Н - Ты меня не убедил... Далее, что бы тебе не писали, следуют утверждения или частные случаи, что с eval тебе все равно нормально будет работать... ![]() Отсюда, присоединяюсь к вопросу ![]() Там все и написано. Добавлено через 12 минут Оно конечно для 755 не аргумент... ![]() Но на мой взгляд вот эта фраза из учебника уже дает правильный посыл
Вот еще статейка https://habr.com/ru/articles/221937 Но только 755 опят напишет, что это все "не его случай"... И ничего убедительно в том для него нет.
1
|
||||
|
133 / 129 / 20
Регистрация: 05.08.2021
Сообщений: 602
|
|
| 12.11.2025, 14:12 | |
|
Про eval все дружно говорят что в серьезных проектах его лучше не использовать. Через него в код можно ввести что-то вредоносное
1
|
|
|
3857 / 1744 / 432
Регистрация: 14.03.2022
Сообщений: 4,435
|
|
| 12.11.2025, 14:58 | |
|
Zloyalex100, дело даже не в этом... Ответ в моей цитате из учебника.
![]() Т.е. просто считайте что никакого eval - нет.И жизнь ваша от этого никак не изменится.
0
|
|
|
2605 / 1509 / 689
Регистрация: 23.08.2015
Сообщений: 3,841
|
|||||||
| 12.11.2025, 15:06 | |||||||
Вообще я заметил, что именно фулстек-разработчики любят вот так размазывать логику.. часть фронта перекладывать на бэк и наоборот и считают это их преимуществом. Самый ужасный код, с которым мне приходилось сталкиваться как раз был от таких людей.. Что у них творится в голове - одному богу известно.. ну какие-то гениальнейшие загогулины, которые на практике просто невозможно поддерживать.
0
|
|||||||
|
3857 / 1744 / 432
Регистрация: 14.03.2022
Сообщений: 4,435
|
|
| 12.11.2025, 15:41 | |
|
0
|
|
|
425 / 314 / 115
Регистрация: 28.08.2013
Сообщений: 869
|
|
| 13.11.2025, 17:46 | |
|
Использовать eval() крайне не рекомендуется. Потому что eval() парсит строку в код, и его можно выполнить. Что не безопасно.
В JSON-объекте только данные, нет функций, что безопаснее. Более того, если в xmlHttp указать ожидаемый ответ JSON, то браузер вернём объект в xmlHttp.response.
1
|
|
| 14.11.2025, 16:14 | |||||||
|
Добавлено через 2 минуты Ну конечно же, конкретно так мало кто делает, по моим наблюдениям. Скорее так
0
|
|||||||
|
-62 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 407
|
||
| 13.02.2026, 15:16 [ТС] | ||
|
krvsa, не хотел отвлекаться ранее, но сейчас нашлось время для ответа.
• Он кажется невероятно мощным инструментом для создания самомодифицирующихся файлов в формате JSON, в которых помимо данных хранится функциональность. Например, вы можете создать сервер, который «обучается», проверяя, есть ли нужная вам функциональность ('функциональность' в parsedObject), и если нет, то позволяет клиенту добавить этот метод в объект. Это, в свою очередь, позволяет создавать «живые библиотеки», которые развиваются благодаря тому, что вы обучаете их с помощью сообщений, а не редактируете код. Я не считаю eval чем-то плохим, скорее это самая мощная конструкция в JavaScript. Правда оно было высказано давно, если не ошибаюсь, примерно в 2018 году - возможно, с того времени многое изменилось. Данный текст был также скопирован давно, попытался сейчас открыть ссылку - не открылась - поэтому ее не размещаю. Попадались и другие мнения, типа: надо уметь им пользоваться.
0
|
||
|
3857 / 1744 / 432
Регистрация: 14.03.2022
Сообщений: 4,435
|
|
| 13.02.2026, 15:45 | |
|
755, использовать
eval или нет - все равно решать тебе...Ведь физически ты можешь его использовать пока его совсем не запретят. ![]() Я убиваться по нему не стану. ![]() У меня нет "живых библиотек"... И "самообучающихся серверов"... Я даже не знаю что это такое. Самомодифицирующиеся файлы тоже не делаю... Если у тебя все это есть - то можно поверить тому спецу, раз он утверждает, что без eval такого не добиться.
0
|
|
|
232 / 94 / 22
Регистрация: 29.02.2016
Сообщений: 489
|
||
| 13.02.2026, 16:44 | ||
|
0
|
||
|
3857 / 1744 / 432
Регистрация: 14.03.2022
Сообщений: 4,435
|
||
| 13.02.2026, 16:54 | ||
|
Как ты их не отговаривай... - А кто пробовал съесть стадо?! (с)
0
|
||
|
232 / 94 / 22
Регистрация: 29.02.2016
Сообщений: 489
|
||
| 13.02.2026, 16:58 | ||
|
0
|
||
|
-62 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 407
|
||
| 13.02.2026, 21:03 [ТС] | ||
|
stele, в данном случае пример был просто как пример того, что кто-то считает eval даже "самой мощной конструкцией" языка. И вполне возможно, что Вы правы о предназначении: "JSON предназначен для передачи данных, а eval для выполнения произвольного кода". Правда у меня при передаче числовых элементов массива JSON сформировал их в js в символьном формате в отличие от eval. Но, думаю, что просто не разобрался и у JSON есть настройки типа данных - пока не стал с этим разбираться - для 1-й версии достаточно и этого.
Но вот, возможно, получится использовать eval согласно спецификации и, если это получится (причем смешно, думаю использовать eval для защиты сайта и данных от проникновения - то, что большинство относят к его недостаткам) то, в отличие от мнения krvsa: Пока же об этом рано говорить - все только на уровне идеи.
0
|
||
|
1296 / 1282 / 190
Регистрация: 21.01.2024
Сообщений: 5,935
|
||
| 13.02.2026, 21:56 | ||
|
Но его не уберут никогда. Он появился в самом начале развития js. А основной принцип внесения изменений в js - "Старый код должен работать". Поэтому из js ничего не убирают. Просто рекомендуют не использовать. Ваш пример просто кошмарен. Сервер (бэк) и браузер (фронт) должны быть максимально независимы друг от друга. Связь только по данным. И программеру бэка не должно быть никакого дела до того, как называются переменные во фронте. Программер фронта, смотря программу через несколько месяцев/лет не должен гадать откуда там взялась неописанная переменная и лезть в программу на сервере, что бы понять это. У всего должна быть своя культура деятельности. И в программировании тоже. Цель не написать, лишь бы сейчас работала, но нужно еще и думать, как это будет сопровождаться, поддерживаться, развиваться, быть может другими людьми, быть может через несколько лет. Чем проще программа, чем дубовее код, тем лучше. Вам это уже много раз объясняли, но бестолку.
2
|
||
| 13.02.2026, 21:56 | |
|
Код 200 SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
Ошибка "json.parse unexpected character" Не работает JSON.parse, ошибка Unexpected token o Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|