2013-09-18 5 views
0

Я не коснулся Javascript через некоторое время, и теперь у меня проблемы с основными массивами.Проблема с базовым Javascript

params=new Array(); 
params['return']='json'; 
alert(params.length); 

Это всегда возвращает 0, когда я ожидал 1. Что случилось с этим?

+4

только числовые индексы будут влиять на '.length' из Массив. Вы используете 'params', как если бы это был простой« объект », а объекты не имеют автоматической' .length'. Чтобы подсчитать их, вы можете сделать 'Object.keys (params) .length' – user2736012

+0

Массивы не являются ассоциативными в JS ... – Krzysiek

ответ

2

Массивы используют численные индексы. Когда вы используете строку «index», она просто добавляет новое свойство к объекту массива, но новое значение не находится в массиве.

Таким образом, массив по-прежнему пуст, но вы можете получить доступ к своему значению, как вы могли, с помощью любого другого объекта.

Ваш код эквивалентен

var params = {}; //new object (not array) 
params['return']='json'; //new property added to object 
0

массивов Javascript не занимают ключевые пары значений, как объекты делают, поэтому длина не увеличивается при присвоении значения. Однако они являются объектами, поэтому вы можете присвоить значения его свойствам (в этом случае это свойство return).
Вы, вероятно, хотите PARAMS быть простой объект: params = {}

Вы должны рассчитывать свойства, как это, например:

function dictionarySize(dict){ 
    var size = 0; 
    for (key in dict){ 
     // In practice you'd probably want to filter using hasOwnProperty 
     size++; 
    } 
    return size 
} 
alert(dictionarySize(params)); 

Или, используя библиотеку как underscore.js:

_.size(params); 

Object.keys также является вариантом, хотя он не будет работать в IE8 и старше.

Если не требуется ключевое значение пары используют params.push:

params=new Array(); 
params.push('json') 
alert(params.length); // 1 
1

Несколько вещей:

Вы забыли var:

var params = new Array(); 

Но массив имеет числовое индексы, поэтому params['return'] на самом деле не является членом массива, а объекта, который представляет массив, поэтому он не влияет на длину.

Вы можете использовать объект, но объекты не имеют длины:

var params = {}; 
params['return'] = 'json'; 

Чтобы получить длину, хотя вы можете рассчитывать ключи в этом объекте и получить длину результирующего массива:

var len = Object.keys(params).length; 
0

Вы можете создать массив, толкать вещи на него, и присвоить свойство значений него так:

var params=[]; 
params.push('firstly'); 
params[0]="jonson"; 
params['return']="fredy" 
params.newone="json"; 
params.push('Carl'); 

сейчас, если вы:

console.log(params.length,params); 

результатом этого является:

2 [ "Jonson", "Карл", возвращение: "Фреди", NewOne: "JSON"]

SO, вы видите «во-первых» был заменен на «Jonson» в [0] - так «толкнул» значение addresed численными [0]

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