Странная проблема с JavaScript-объектом - PullRequest
2 голосов
/ 04 января 2011

Вот простой скрипт js-теста

<script>
var testarray = new Array();
testarray['length'] = "1,2,3,4,5";
alert(testarray['length']);
</script>

Если вы запустите его, вы получите следующее сообщение об ошибке:

Для длины массива должно быть назначено конечное положительное число

Есть идеи, в чем причина и как ее преодолеть?

Примечание: если вы измените 'length' на что-то еще, он покажет содержимое объекта без проблем.

Ответы [ 2 ]

10 голосов
/ 04 января 2011

Array.length

Array.length является встроенным свойством объекта Array.

Можно установить толькоэто целочисленное значение:

Значение свойства length равно целое число с положительным знаком и значением меньше 2 от степени 32 (2 32).

Вы можете установить свойство length для усечения массива в любое время.Когда вы расширяете массив, изменяя его свойство length, количество реальных элементов не увеличивается;например, если вы установите длину 3, когда в настоящее время она равна 2, массив все еще содержит только 2 элемента.

Ссылка:


Объекты Javascript

Я предполагаю, что вы хотите Object, а не Array:

var testobj = {};
testobj['length'] = "1,2,3,4,5";
alert(testobj['length']);

Конечно, есть несколько альтернативных вариантов синтаксиса:

Первая строка - это сокращение для:

var testobj = new Object();

И обозначение в квадратных скобках можно заменить на обозначение в виде точки:

testobj.length = "1,2,3,4,5";
alert(testobj.length);

(квадратные скобки и точки также можно смешивать, конечно)

3 голосов
/ 04 января 2011

Просто чтобы добавить к превосходный ответ Шона , в JavaScript вы можете использовать либо пунктирную запись, либо запись в скобках для доступа к свойствам объекта.Итак:

var a = [];          // Same thing as a = new Array();
alert(a.length);     // alerts 0
alert(a['length']);  // ditto
var x = 'len';
alert(a[x + "gth"]); // ditto

и аналогично

var a = [];
a.length = 3;        // That's fine, the array's length is now 3
a['length'] = 4;     // And now it's four
var x = 'len';
a[x + "gth"] = 5;    // And now it's five

Итак, вы пытались установить длину (в строку).Свойство length экземпляров массива является особым, и (как вы обнаружили) должно быть неотрицательным конечным целочисленным значением.


Касательная : На самом деле,Свойство length - это одна из трех особых особенностей массивов (одна из которых на самом деле не такая уж особенная).Различия * между массивом и простым объектом:

  1. У него есть специальный класс имен свойств, которые представляют собой числовые, десятичные строки.Мы склонны называть их «индексами массивов» и записывать их в виде чисел, но это не так.a[0] действительно означает a["0"], что означает "свойство '0' объекта a", так же как a["foo"] означает "свойство 'foo" объекта a.
  2. Специальное свойство length: оно всегда на единицу больше, чем числовое значение свойства с наименьшим десятичным числовым именем строки (например, наибольшим «индексом массива»), или заданным вами значением, в зависимости от того, какое значение больше.

    var a = [];
    a[0] = "foo"; // a.length is automatically set to 1
    a[4] = "bar"; // a.length is automatically set to 5
    a.length = 3; // a.length is now 3, and any properties that have numeric
                  // decimal string names of "3" or higher are deleted, thus:
    alert(a[4]); // "undefined"
    
  3. Экземпляры массива создаются с помощью функции конструктора Array, поэтому они имеют прототип Array.prototype со всеми его полезными полезными функциями.

Вот и все. Они практически не похожи на массивы почти во всех других языках. Они, например, не являются непрерывными блоками памяти (хотя реализация может реализовать их таким образом, если захочет; это, вероятно, будет неэффективно).

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