Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Просто на случай, если кто-нибудь еще прибудет сюда, пытаясь выяснить, каким может быть какой-то странный/новый синтаксис, включающий [квадратные скобки] (видимый в чужом Javascript), как я был...

В настоящее время, с ES6, мы также использовали [] слева для деструктурирования массивов, например

const names = ['Luke', 'Eva', 'Phil']; 
const [first] = names;  
console.log(first); // 'Luke' 
const [first, second] = names;  
console.log(first, second); // 'Luke' 'Eva'

Для получения дополнительной информации см. Http://www.deadcoderising.com/2017-03-28-es6-destructuring-an-elegant-way-of-extracting-data-from-arrays-and-objects-in-javascript/ или Google 'es6 destruuring'.

Ответ 3

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

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

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

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

Ответ 4

b = "bar" + ["foo"]

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

["foo"]

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

"bar" + ["foo"]

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

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

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

Ответ 5

Держу пари, кто-то сказал этому человеку:

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

Значение:

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

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

И бедный парень сделал это другое неуместное...

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

Ответ 6

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

var some_variable = 'to=' + other_variable;

и это:

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

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

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

Ответ 7

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

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

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

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

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

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

var anyName = 0;
  • эту глобальную переменную можно называть как: -

    окно [ "имя_узел" ]

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

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

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

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

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

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

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

Ответ 9

Я получаю сообщение об ошибке в Internet Explorer, когда я использовал эти квадратные скобки. Как мне исправить ошибку? @mck89 @Ричард Эверетт