Объединить в javascript для доступа к переменной, предопределенной глобально?

Допустим, у меня есть переменные var s0 = "Hello",var s1 = "Bye", и у меня есть

for(var i = 0; i < 1; i++) {console.info("s"+i);}

Как мне получить доступ к этим строкам (s0 и s1) для печати?

Вам никогда не нужны неизвестные имена переменных. Вместо этого используйте объект: const strings = {s0: "Hello", s1: "Bye"}; console.info(strings["s" + i]); или массив.

Sebastian Simon 15.05.2018 01:27
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
35
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Для переменных глобального уровня:

for(var i = 0; i < 1; i++) {console.info(window["s"+i]);}

Для локальных переменных:

for(var i = 0; i < 1; i++) {console.info(eval("s"+i));}

Будьте осторожны с использованием eval и осознайте эти риски.

Kurt 15.05.2018 01:28

@Kurt, вопрос не в том, как это сделать наиболее безопасным способом.

Karen Grigoryan 15.05.2018 01:29

Я прошу прощения. Я пропустил часть вашего ответа "переменные глобального уровня", поэтому я удалил это из своего комментария.

Kurt 15.05.2018 01:30

@Kurt: Здесь нет никакого риска, так как пользовательский ввод не обрабатывается eval

Felix Kling 15.05.2018 01:31
eval никогда не является ответом, мы не должны поощрять использование eval без каких-либо объяснений, OP должен знать о последствиях для безопасности.
Marcos Casagrande 15.05.2018 01:31

@MarcosCasagrande: «eval никогда не поможет», Я не согласен. Если в качестве входных данных используется JavaScript, то eval (или что-то подобное) - это именно то, что вам нужно. Однако, к сожалению, он также используется, когда есть лучшие альтернативы. Это также не всегда угроза безопасности. Это очень сильно зависит от вводимых данных.

Felix Kling 15.05.2018 01:34

@FelixKling eval почти никогда не ответ звучит лучше? Но, если вы спросите меня, это определенно не лучший ответ на этот вопрос. Рекомендуемым подходом должно быть использование объекта window для глобально определенных переменных или использование объекта для локальной области видимости.

Marcos Casagrande 15.05.2018 01:37

@MarcosCasagrande: Да, согласен, eval здесь не лучшее решение.

Felix Kling 15.05.2018 01:38

@MarcosCasagrande Eval - это конструкция генерации кода наравне с конструктором Function, все они имеют свои варианты использования. В eval нет ничего особо опасного, что должно было бы препятствовать его использованию, точно так же, как атаки «злоумышленник посередине» не мешают вам работать с json в вашем коде. Обычно настоящая проблема кроется глубже. Внедрение кода, как описано ранее, возможно только в том случае, если вы работаете с пользовательским вводом и не выполняете никакой очистки, что уже является проблемой, и избавление от eval вас не спасет.

Karen Grigoryan 15.05.2018 01:48
eval действительно медленный, его не следует использовать для этого, ваш ответ плохой, поскольку вы говорите кому-то, кто знает меньше вас, использовать его без дополнительных объяснений.
Marcos Casagrande 15.05.2018 01:52

@MarcosCasagrande, и вопрос по-прежнему не в том, какой способ хранения строк рекомендуется для дальнейшей динамической оценки. Ясно, что с учетом этого, как я могу это оценить. В этом случае eval - наиболее логичный ответ для неглобального кода.

Karen Grigoryan 15.05.2018 01:52

Самый логичный и лучший ответ - использовать объект для неглобального кода.

Marcos Casagrande 15.05.2018 01:53

@MarcosCasagrande имеет значение контекст, я не делаю суждений об уровне знаний OP, я основываю свой ответ на вопросе, в котором четко указано предварительное условие. И я даю решение, исходя из этого условия, которое абсолютно технически подходит. Сейчас спорный вопрос, хорошо это или плохо. Я думаю, что использование eval для целей генерации кода вполне допустимо, поскольку оно использовалось вечно и до сих пор используется в самых сложных частях разработки программного обеспечения, таких как инструменты разработчика. Не было идеи дать самый эффективный / краткий или даже вопрос о том, как лучше всего структурировать код.

Karen Grigoryan 15.05.2018 02:02

@MarcosCasagrande относительно медленного, это не аргумент, map медленнее, чем for(), поэтому следует ли не рекомендовать использование map? Нет. Потому что это зависит от конкретного случая, чего вы хотите достичь и настроить. Если у вас есть горячий цикл с 1000 000 циклов, то, конечно, не используйте eval для генерации vars en-mass, но во всех остальных случаях в чем проблема? Я не говорю, что вы должны использовать только это, я просто говорю, что это вариант, и его не следует слепо расстраивать.

Karen Grigoryan 15.05.2018 02:06

Вы можете использовать функцию eval для выполнения кода, который вы создаете динамически, как строку:

for(var i=0; i<=1; i++) { eval("console.info(s" + i + ")"); }
Ответ принят как подходящий

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

s = ["Hello", "Bye"];
for(var i = 0; i < 1; i++) {console.info(s[i]);}

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


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

s0 = "Hello"
s1 = "Bye"

for(var i = 0; i < 1; i++) {console.info(window["s"+i]);}

По сути, вы получаете доступ к переменным в окне через window["s0"]. Оператор "s" + i превращается либо в "s0", либо в "s1", потому что, опять же, javascript странный, и добавление числа в строку приводит к строке.

Не делай этого никогда. Придерживайтесь оригинального метода, описанного выше

Другие вопросы по теме