Загадочное поведение массива javascript - PullRequest
3 голосов
/ 30 июля 2009

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

Рассмотрим следующий код:

    var selectedItems = [];
    selectedItems.push("0ce49e98-a8aa-46ad-bc25-3a49d475e9d3");
    //fyi, selectedItems[selectedItems.length] = "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3"; produced the same result.

В конце selectedItems содержимое выглядит так:

Name              Value                                    Type
-------------     --------------------------------------   ------
selectedItems     {...}                                    Object
   -  [0]         "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3"   String
   -  length      1                                        Long

Но если я просто попытаюсь вызвать split () для той же строки, например:

selectedItems = "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3".split(",")

Теперь содержимое моего предполагаемого массива выглядит следующим образом (отсутствует длина):

Name              Value                                    Type
-------------     --------------------------------------   ------
selectedItems     {...}                                    Object
   -  [0]         "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3"   String

Есть идеи, в чем разница? Что на самом деле здесь происходит?
Заранее спасибо.

ОБНОВЛЕНО : У меня есть ощущение, что на самом деле есть что-то структурно отличающееся в двух результирующих значениях, потому что (atlas) ajax перекрывает значение со свойством length, когда я пытаюсь передать его WebMethod на стороне сервера (нет фактического сообщения об ошибке, но я знаю звонок не получается). Я не уверен.

ОБНОВЛЕНИЕ № 2 Я заметил, что установка targetLocationIdList таким способом приводит к тому, что свойство «length» не отображается в окне Quick Watch:

  var params = 
  {
    jobId : args.get_JobId(), 
    targetLocationIdList : retVal.split(',')
  };

Но эти результаты содержат свойство 'length', отображаемое в окне быстрого просмотра:

  var retValArr = [];
  retValArr = retVal.split(',');

  var params = 
  {
    jobId : args.get_JobId(), 
    targetLocationIdList : retValArr 
  };

Ответы [ 7 ]

3 голосов
/ 30 июля 2009

Нет никакой разницы программно. Если вы запустите свой пример как в окне разработчика Chrome, так и в Firebug, он будет выглядеть как 2nd

 Name              Value               
 Type
 -------------     --------------------------------------   ------ 
 selectedItems     {...}                                    Object
    -  [0]         "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3"   String

Длина является подразумеваемым свойством

EDIT

var retVal = 'test';
var params = 
  {
    jobId : 1, 
    targetLocationIdList : retVal.split(',')
  }; 
console.log(params.targetLocationIdList.length) // prints 1

Приведенный выше код выводит 1 в IE8, Firefox, Chrome (в их средствах разработки или Firebug), поэтому подумайте, что это должно быть проблемой с Visual Studio или с Atlas в том смысле, как он показывает объект.

2 голосов
/ 03 августа 2009

В первом случае вы объявляете selectedItems как массив, а затем присваиваете ему значение.

Во втором случае вы присваиваете ему напрямую из метода split.

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

2 голосов
/ 30 июля 2009

Может ли это быть ошибкой в ​​отладчике? (Или это вызывает проблемы в браузере?)

1 голос
/ 08 августа 2009

Похоже, вы нашли дефект в реализации Microsoft Javascript. Вероятно, Visual Studio и IE используют одну и ту же реализацию, поэтому вы видите ошибку только в этих двух программах, а не в Firefox или Chrome.

В стандарте EMCAScript: http://www.ecma -international.org / публикации / файлы / ECMA-ST / ECMA-262.pdf

15.5.4.14 String.prototype.split (разделитель, предел)
Возвращает объект Array, в который были сохранены подстроки результата преобразования этого объекта в строку.

В определении объекта Array:

15.4 Массив объектов
... Каждый объект Array имеет свойство length, значением которого всегда является неотрицательное целое число менее 2 32 .
0 голосов
/ 08 августа 2009

Вот очень простой тест:

var selectedItems = [];
selectedItems.push("0ce49e98-a8aa-46ad-bc25-3a49d475e9d3");
alert(selectedItems);
selectedItems = "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3".split(",");
alert("boo");
alert(selectedItems.length);

После бу мы проверяем, есть ли еще длина.

Ответ: да. Другими словами, это ошибка Visual Studio, и не более того.

0 голосов
/ 03 августа 2009

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

0 голосов
/ 30 июля 2009

Какой браузер вы используете, и вы уверены, что нет свойства length? Я только что сделал

var arr = "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3".split(",")

в моей консоли Firebug, а arr имеет свойство length, равное 1, как и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...