Использование вокруг переменных JavaScript

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

По какой-то причине они добавляют [квадратные скобки] вокруг переменных, таким образом:

var some_variable = 'to=' + [other_variable]; 

Это работает, но квадратные скобки кажутся совершенно лишними.

Есть ли цель для этого синтаксиса или это технически некорректно, но игнорируется браузером?

Квадратные скобки означают новый массив.

 var ar=new Array("a","b"); var ar=["a","b"]; //Equal to the syntax above 

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

Даже без изменения прототипа Array существуют различия:

 var other_variable; var some_variable = 'to=' + [other_variable]; 

Если other_variable не определено, возвращаемое значение с массивом равно 'to =',

Без массива возвращаемое значение равно 'to = undefined'.

 b = "bar" + ["foo"] 

Это синтаксически правильно, но действительно очень, очень, излишне. Вот как это работает:

 ["foo"] 

JavaScript принимает строку «foo» и преобразует ее в массив с одним элементом «foo»:

 "bar" + ["foo"] 

Когда используется + , а один из операндов – строка, «бар» в этом случае, JavaScript преобразует второй в строку. Поскольку операнд 2 является массивом, Array.toString метод Array.toString , который по умолчанию возвращает все элементы, соединенные запятой. У нас есть один элемент, и результат будет равен этому элементу, т. Е. В этом контексте "foo" эквивалентно ["foo"] .

Если вы переопределите Array.toString вы сможете лучше понять, что происходит:

 alert("bar" + ["foo"]) Array.prototype.toString = function() { return "???"; } alert("bar" + ["foo"]) 

Бьюсь об заклад, кто-то сказал этому человеку:

  • «Сопряжение строк с массивом, это быстрее!»

Имея в виду:

 var some_variable = ['to=', other_variable].join(""); 

Это, по-видимому, быстрее для множества конкатенаций, но совершенно неуместно, так как этот код, вероятно, будет работать только один раз. Premature_optimization = sqrt(all_evil) !

И бедный парень сделал эту другую неактуальную вещь …

Я люблю людей.

Можно построить ситуацию, когда это:

 var some_variable = 'to=' + other_variable; 

и это:

 var some_variable = 'to=' + [other_variable]; 

Дают разные результаты. В частности, если метод Array.prototype.toString() (или, я полагаю, метод Array.prototype.join() ) был изменен со своего значения по умолчанию, все может произойти. Например, дополнительные функции могут быть добавлены в метод Array.prototype.toString() для генерации информации о регистрации, выполнения некоторых поисков или чего-либо на самом деле.

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

Может быть, это ..

Доступ к глобальной переменной с помощью обозначения квадратного кронштейна

Обозначение квадратной скобки требует наличия какой-либо ссылки на объект слева от скобок.

 ["document"] //Array literal, not a Property Accessor! 

– создаст ошибку, если будет предпринята попытка присвоить ему значение, поскольку она будет обрабатываться как литерал массива, если попытка чтения из него будет возвращена массив элементов, содержащий строку в скобках. Глобальные переменные обычно ссылаются только на их один идентификатор. Это, по-видимому, исключает глобальные переменные из возможности ссылки на них, используя строку, содержащую их имя идентификатора или выражение, которое построило или вернуло их имя. Однако глобальные переменные javascript (и глобальные имена функций) являются свойствами глобального объекта. Любой идентификатор, который содержит ссылку на глобальный объект, можно использовать слева от квадратных скобок, чтобы сформировать свойство accessor, которое ссылается на глобальную переменную.

В веб-браузере глобальный объект представляет собой окно (или фрейм), в котором работает скрипт. Каждый объект окна (или фрейма) содержит ряд свойств, по меньшей мере два из которых являются ссылками на окно (глобальный объект). Эти свойства – это «окно» и «я». Эти имена свойств могут использоваться как идентификатор слева от квадратных скобок при обращении к глобальным переменным. Так что задана глобальная переменная, определяемая как: –

 var anyName = 0; 
  • К этой глобальной переменной можно отнести: –

    Окно [ «имя_узел»]

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

Код, выполняемый в глобальном контексте, код в глобальных функциях (кроме конструкторов объектов, вызываемых с ключевым словом new) и встроенный код вне любых функций, также может использовать это ключевое слово для ссылки на глобальный объект. Это ключевое слово относится к объекту в зависимости от контекста выполнения. Для выполнения кода в глобальном контексте это глобальный объект (в веб-браузере, объект окна). В результате вышеупомянутая переменная может упоминаться как [«anyName»], но только в коде, который выполняется в глобальном контексте.

Однако использование этого ключевого слова очень сбивает с толку, особенно в сценариях, которые включают настраиваемые объекты javascript, где методы (и конструкторы) этих объектов будут использовать это, чтобы ссылаться на свои собственные экземпляры объектов.

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

 var myGlobal = this; 
  • Выполненный как встроенный код в начале скрипта, назначит ссылку на глобальный объект (это в этом контексте). С этого момента все глобальные переменные могут ссылаться на квадратную скобку как: –

    myGlobal [ "имя_узел"];

  • И ожидаем, что myGlobal будет ссылаться на глобальный объект из любого контекста выполнения.

  • Преобразование объекта объектного объекта с объективом JavaScript в точку
  • Почему вызов функции в Node.js REPL с) (работа?
  • Объявление массива Javascript: новый массив (), новый массив (3), создает массивы, которые ведут себя по-разному
  • Почему я должен использовать точку с запятой после каждой функции в javascript?
  • Синтаксис «elseif» в JavaScript
  • Преобразуйте строку в точечную нотацию, чтобы получить ссылку на объект
  • В чем разница между точками с запятой в JavaScript и Python?
  • Доступ к свойствам JavaScript: точечная привязка к скобкам?
  • Почему работает 10..toString (), но 10.toString () не работает?
  • Ошибка JavaScript (Uncaught SyntaxError: Неожиданный конец ввода)
  • Знак доллара, за которым следует квадратная скобка в строке шаблона
  • Давайте будем гением компьютера.