2015-04-10 5 views
3

Непреднамеренны В моем проекте я использовал следующий код, и я был удивлен, увидев, что работает:Доступа к элементу массива внутри JSON объекта

HTML

<span id="output"></span> 

Javascript

var myObject = { 
    'a': '----First---', 
    'b': '----Second---', 
    'c': '----Third----' 
}; 

var myArray = ['a']; 

// First Case 
output.innerHTML = myObject[myArray]; 

var myArray2 = ['b']; 

// Second Case 
output.innerHTML += myObject[myArray2]; 

var myArray3 = ['a', 'b']; 

// Third Case 
output.innerHTML += myObject[myArray3]; 

Выход

----First-------Second---undefined 

Jsbin Ссылка: http://jsbin.com/godilosifu/1/edit?html,js,output

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

Я просто хочу знать, что называется этой концепцией и почему это происходит?

ответ

7

Поскольку имя свойства должно быть строкой, это приведение типа в один с помощью метода toString(). Причина, по которой ваш третий пример не определен, заключается в том, что ['a', 'b'].toString() равно 'a,b', что не является свойством в вашем объекте.

имена свойств

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

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_Accessors

Стоит отметить, что в ECMAScript 6, есть новый тип коллекции под названием Map, что позволяет использовать любой объект в качестве ключа, без принуждения типа.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

+0

Это лучший ответ. – Upio

+0

Спасибо Дренми за подробный ответ. +1 Я тоже принимаю этот ответ. – sachinjain024

3

Когда вы передаете массив объекту в качестве ключа, он вызывает toString() на нем. Это потому, что все ключевые слова в Javascript - это строки.

['a'].toString() is "a" 
myObject['a'] is "----First----" 

См: Keys in Javascript objects can only be strings?

+0

ааа !! Это тип литья. Понимаю.Спасибо за быстрый ответ. Я принимаю – sachinjain024

2

Это авто-кастинг. В Javascript только строки могут быть индексами в свойствах объекта. myObject - это не массив, это объект. Несмотря на то, что вы используете скобки для доступа к своим свойствам, это не то же самое значение, что и скобки, используемые для объекта массива.

Из-за того, что свойства объекта разрешены только для имен по строкам, компилятор автоматически передает ваш массив в строку (по существу называющую ее встроенной функцией toString(), которая для массива объединяет все элементы с запятой).

Итак, когда вы передаете ваш массив свойству аксессора/индекс объекта, он делает это:

myArray1 ==> "a"; 
myArray2 ==> "b"; 
myArray3 ==> "a" + "," + "b" ===> "a,b"; 
+1

Самый ясный ответ мне, спасибо! – renakre

Смежные вопросы