Кроме очевидного Тот факт, что первая форма может использовать переменную, а не просто строковый литерал, есть ли причина использовать одну над другой, и если да, то в каких случаях?

В коде:

// Given:
var foo = {'bar': 'baz'};

// Then
var x = foo['bar'];

// vs. 
var x = foo.bar;

Контекст: я написал генератор кода, который производит эти выражения, и мне интересно, какое из них предпочтительнее.

(Получено из говорится, что .)

Для запуска глубоко пространства имен:

var foo = myForm.foo[]; // incorrect syntax
var foo = myForm["foo[]"]; // correct syntax

простейших myForm["ダ"] ( По какой-то причине замыкания кажутся действительно трудными для понимания, когда вы читаете о них, но когда вы видите некоторые примеры, становится ясно, как они работают (это заняло у меня некоторое время). Я рекомендую проработать примеры внимательно, пока не поймешь как они работают. Если вы начнете использовать замыкания без полного понимания того, как они работают, вы скоро создадите очень странные ошибки! ).

Во-вторых, запись в квадратных скобках полезна при работе с именами свойств, которые изменяются предсказуемым образом:

for (var i = 0; i < 10; i  ) {
  someFunction(myForm["myControlNumber"   i]);
}

Сводка:

  • Основано на комментарии meouw:
  • Нотация в квадратных скобках обеспечивает доступ к свойствам, содержащим специальные символы, и выбор свойств с использованием переменных

Еще один пример символов, которые нельзя использовать с точечной нотацией, — это имена свойств, которые сами содержат точку Глядя на вывод

Bind your functions в конструкторе класса. bar.Baz Глядя на вывод

var foo = myResponse.bar.Baz; // incorrect syntax
var foo = myResponse["bar.Baz"]; // correct syntax

Нотация в скобках позволяет вам доступ к свойствам по имени, хранящемуся в переменной:

var obj = { "abc" : "hello" };
var x = "abc";
var y = obj[x];
console.log(y); //output - hello

obj.x в этом случае не будет работать.

Нотация точек не работает с некоторыми ключевыми словами (например, new и class) в Internet Explorer 8.

У меня был этот код:

//app.users is a hash
app.users.new = {
  // some code
}

И это вызывает страшный «ожидаемый идентификатор» (по крайней мере, в IE8 на Windows XP, я не пробовал другие среды). Простым решением для этого является переключение в скобки:

app.users['new'] = {
  // some code
}

Будьте осторожны при использовании этих обозначений: Например, если мы хотим получить доступ к функции, присутствующей в родительском элементе окна. В IE:

window['parent']['func']

не эквивалентно

window.['parent.func']

, что существует директива

window['parent']['func'] 

или

window.parent.func 

для доступа к нему

Существует ли какой-либо кросс-браузерный код JavaScript / jQuery, чтобы определить, закрывается ли браузер или вкладка браузера, но не из-за нажатия на ссылку? value.x and value[x] SAMEORIGIN // разрешить только моему собственному домену отображать мой HTML внутри iframe. Разница в том, как интерпретируется x. При использовании точки, часть после точки должна быть допустимым именем переменной, и она прямо называет свойство. При использовании квадратных скобок выражение между скобками вычисляется для получения имени свойства. В то время как value.x извлекает свойство значения с именем «x», value [x] пытается вычислить выражение x и использует результат в качестве имени свойства.

Итак, если вы знаете, что интересующее вас свойство называется «длина», вы скажете, что value.length, вам нужно запускать его только один раз для каждой страницы — оно никогда не должно меняться в течение жизненного цикла страницы. i, вы говорите value[i]. И поскольку имена свойств могут быть любой строкой , если вы хотите получить доступ к свойству с именем “2” или “John Doe” Пример: value[2] or value["John Doe"]. Это так, даже если вы заранее знаете точное название свойства, потому что ни “2” nor “John Doe” является допустимым именем переменной и поэтому не может быть доступно через точечную запись.

В случае массивов

заголовок ответа. стандартизировано отдельно в счетчиках ECMA-402 array.length, потому что это легче написать, чем array["length"] Глядя на вывод

Вообще говоря, они делают ту же работу.
настраиваемые атрибуты везде

var x = elem["foo[]"]; // can't do elem.foo[];

Это может быть расширено до любого свойства, содержащего специальные символы.

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

var foo = {
    "Hello, world!": true,
}
foo["Hello, world!"] = false;

Вот jsfiddle

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

, я не совсем уверен, что вы спрашиваете, но, возможно, это может помочь:

2) При использовании цикла for..in, чтобы просмотреть все свойства объекта.

source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects

Вы должны использовать квадратную скобку, когда —

  1. Имя свойства — это число.

    var ob = {
      1: 'One',
      7 : 'Seven'
    }
    ob.7  // SyntaxError
    ob[7] // "Seven"
    
  2. Имя свойства имеет специальный символ.

    var ob = {
      'This is one': 1,
      'This is seven': 7,
    }  
    ob.'This is one'  // SyntaxError
    ob['This is one'] // 1
    
  3. Имя свойства назначено переменной, и вы хотите получить доступ к значению свойства по этой переменной.

    var ob = {
      'One': 1,
      'Seven': 7,
    }
    
    var _Seven = 'Seven';
    ob._Seven  // undefined
    ob[_Seven] // 7
    

Case, где [] запись полезна:

Если ваш объект динамический и в ключах могут быть случайные значения, например number и [] или любым другим специальным символом, например —

var a = { 1 : 3 };

Теперь, если вы попытаетесь получить доступ к объекту, как a.1 Несколько лет спустя, теперь официально существует лучшее решение.

На этом этапе вы можете увидеть, как нетx-proxy, то - будет неверно истолкован. Это и другие случаи, такие как пробел, точка и т. Д., Где операция с точками не поможет вам. Также, если у вас есть ключ в переменной, то единственный способ получить доступ к значению ключа в объекте — это использовать скобки. Надеюсь, вы получите больше контекста.