JavaScript: для (я в str), вложенные, странные результаты за пределами FF? - PullRequest
2 голосов
/ 12 октября 2010

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

Я создал образцы, чтобы показать проблему, с которой я столкнулся ...

Образец 1

var dataString = "abc";

document.write(" This is a test ... " + "<br/>")
for (i in dataString ) {
    document.write("<br/> +" + dataString[i] + ": ")
    for (k in dataString ) {
        document.write(" ="+dataString[k] +", ");
    }
}
​

Теперь мои результаты в Chrome :

This is a test ... 

+a: 
+b: 

В FireFox : (это результат, который я ожидал)

This is a test ... 

+a: =a, =b, =c, 
+b: =a, =b, =c, 
+c: =a, =b, =c, 

Результаты в IE8 :

This is a test ... 

Может кто-нибудь объяснить мне, что здесь происходит? Я пропустил что-то критическое?

Примечание: Вы можете преобразовывать строки в массивы в разных браузерах, используя "abc".split("") согласно этого примера , просто помните, что это больше не строка, и теперь, если вы выведите ее, она будет выведена как массив a,b,c

Ответы [ 2 ]

3 голосов
/ 12 октября 2010
for (i in dataString ) {
    document.write("<br/> +" + dataString[i] + ": ")

Не является частью стандарта JavaScript (*), что строки должны иметь свои символы, доступные как пронумерованные свойства; это расширение, изначально представленное Mozilla. Следовательно, dataString[i] будет undefined в старых браузерах, включая IE <8. </p>

Для правильного доступа к символу в строке вы должны использовать charAt.

По той же причине for...in над строкой не будет перебирать индексы во всех браузерах.

И даже если бы это было так, использовать его было бы неправильно, потому что for...in предназначен для перечисления свойств в карте Object ({}), не , повторяющейся по последовательностям. for...in не следует использовать на Array или String, поскольку вы получите все члены этого экземпляра, а не только числовые индексы, и нет никакой гарантии, что вы получите их в любом конкретном порядке.

Для Array и String правильный цикл - это цикл for i старой школы. И вы должны использовать var, даже если это глобальная переменная.

document.write(' This is a test ... <br/>');
for (var i= 0; i<dataString.length; i++) {
    document.write('<br/> +'+dataString.charAt(i)+': ');
    for (var k= 0; k<dataString.length; k++) {
        document.write(' ='+dataString.charAt(k)+', ');
    }
}

(*: хорошо ... не в ECMAScript Third Edition. В новом пятом издании говорится, что строки имеют «имена индексов массива», что может быть подтверждением этой функции. Кажется, немного неясно)

1 голос
/ 12 октября 2010

в соответствии с W3C:

Оператор for ... in выполняет циклический просмотр элементов массива или свойств объекта.

Your dataString asstring типа и ничего, полученный результат интерпретируется по-разному в каждом браузере.

  • IE: dataString не является объектом:> «Я не зациклен» (не очевидно,тип данных не совпадает)
  • FF: dataString является ???: «Я повторяю каждый символ, и объединяю его» (очень очевидно)
  • Chrome: dataString представляет собой массив символов: «Я повторяю каждый символ».(не очевидно, потому что строку можно рассматривать как массив символов, но все же ...)

Очевидно, но все еще нормально.

...