Допустим, у меня есть переменные var s0 = "Hello",var s1 = "Bye", и у меня есть
for(var i = 0; i < 1; i++) {console.info("s"+i);}
Как мне получить доступ к этим строкам (s0 и s1) для печати?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Для переменных глобального уровня:
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, вопрос не в том, как это сделать наиболее безопасным способом.
Я прошу прощения. Я пропустил часть вашего ответа "переменные глобального уровня", поэтому я удалил это из своего комментария.
@Kurt: Здесь нет никакого риска, так как пользовательский ввод не обрабатывается eval
eval никогда не является ответом, мы не должны поощрять использование eval без каких-либо объяснений, OP должен знать о последствиях для безопасности.
@MarcosCasagrande: «eval никогда не поможет», Я не согласен. Если в качестве входных данных используется JavaScript, то eval (или что-то подобное) - это именно то, что вам нужно. Однако, к сожалению, он также используется, когда есть лучшие альтернативы. Это также не всегда угроза безопасности. Это очень сильно зависит от вводимых данных.
@FelixKling eval почти никогда не ответ звучит лучше? Но, если вы спросите меня, это определенно не лучший ответ на этот вопрос. Рекомендуемым подходом должно быть использование объекта window для глобально определенных переменных или использование объекта для локальной области видимости.
@MarcosCasagrande: Да, согласен, eval здесь не лучшее решение.
@MarcosCasagrande Eval - это конструкция генерации кода наравне с конструктором Function, все они имеют свои варианты использования. В eval нет ничего особо опасного, что должно было бы препятствовать его использованию, точно так же, как атаки «злоумышленник посередине» не мешают вам работать с json в вашем коде. Обычно настоящая проблема кроется глубже. Внедрение кода, как описано ранее, возможно только в том случае, если вы работаете с пользовательским вводом и не выполняете никакой очистки, что уже является проблемой, и избавление от eval вас не спасет.
eval действительно медленный, его не следует использовать для этого, ваш ответ плохой, поскольку вы говорите кому-то, кто знает меньше вас, использовать его без дополнительных объяснений.
@MarcosCasagrande, и вопрос по-прежнему не в том, какой способ хранения строк рекомендуется для дальнейшей динамической оценки. Ясно, что с учетом этого, как я могу это оценить. В этом случае eval - наиболее логичный ответ для неглобального кода.
Самый логичный и лучший ответ - использовать объект для неглобального кода.
@MarcosCasagrande имеет значение контекст, я не делаю суждений об уровне знаний OP, я основываю свой ответ на вопросе, в котором четко указано предварительное условие. И я даю решение, исходя из этого условия, которое абсолютно технически подходит. Сейчас спорный вопрос, хорошо это или плохо. Я думаю, что использование eval для целей генерации кода вполне допустимо, поскольку оно использовалось вечно и до сих пор используется в самых сложных частях разработки программного обеспечения, таких как инструменты разработчика. Не было идеи дать самый эффективный / краткий или даже вопрос о том, как лучше всего структурировать код.
@MarcosCasagrande относительно медленного, это не аргумент, map медленнее, чем for(), поэтому следует ли не рекомендовать использование map? Нет. Потому что это зависит от конкретного случая, чего вы хотите достичь и настроить. Если у вас есть горячий цикл с 1000 000 циклов, то, конечно, не используйте eval для генерации vars en-mass, но во всех остальных случаях в чем проблема? Я не говорю, что вы должны использовать только это, я просто говорю, что это вариант, и его не следует слепо расстраивать.
Вы можете использовать функцию 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 странный, и добавление числа в строку приводит к строке.
Не делай этого никогда. Придерживайтесь оригинального метода, описанного выше
Вам никогда не нужны неизвестные имена переменных. Вместо этого используйте объект:
const strings = {s0: "Hello", s1: "Bye"}; console.info(strings["s" + i]);или массив.