2013-11-12 4 views
0
var place = "mundo"["Hola", "Ciao"]; 

Почему это возвращает неопределенный? Просто потому, что это мусор?Почему эта переменная не указана?

+0

"Мундо" является строка .. ' "Мундо"[0]' будет работает – rab

+1

Может быть, это попытка JSON как 'вар место = { "Мундо": [ «hola», «ciao»]}; ' –

ответ

3

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

// returns "m" in Chrome 
"mundo"[0] 

// returns undefined 
"mundo"[9] 

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

// does a property lookup and returns "function toString{[native code]} 
"mundo"["toString"] 

// returns undefined - no propery named foo 
"mundo"["foo"] 

Так, так как нет никакой собственности на строку, которая напоминает что-нибудь в ["Hola", "Ciao"], вы получите undefined. Технически браузер фактически ищет свойство "Ciao", когда вы его даете, и потому что этого свойства не существует, вы получаете undefined.


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

var str = new String("mundo"); 
str["Ciao"] = "Hello"; 
alert(str["Hola", "Ciao"]); // alerts "Hello" 

Работа демо этого: http://jsfiddle.net/jfriend00/e6R8a/


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

+0

+1 для коррекции поведения индекса строки. Обратите внимание, что OP знает, что «это мусор». – Boaz

+0

Добавил jsFiddle демо к моему ответу, что показывает, что происходит. – jfriend00

5

Совершенно верно JS, хотя он не делает то, что вы ожидаете.

place Инициализированно 'Ciao' Недвижимость String('mundo'). Поскольку он не существует, он инициализируется undefined.

Хитрость:

"Hola","Ciao" использует оператор запятой, оценивает "Hola", оценивает "Ciao" и возвращает "Ciao"

[...] в этом случае доступ

"mundo"[]"mundo" свойство преобразуется в Объект String для доступа к нему.

Доказательство:

var place = "mundo"["Hola", "toString"]; 
console.log(place) // function toString() { [native code] } 
Смежные вопросы