элемент массива журнала по индексу, возвращающий неопределенный

#javascript

Вопрос:

Я создавал программу, которая записывала каждое нажатие клавиши и помещала ее в массив, и она отлично работает. Проблема в том, что когда я пытаюсь получить доступ к первому элементу массива и зарегистрировать его, он печатается неопределенным. Но весь массив регистрируется нормально.Почему он печатается незапятнанным? Я добавил как консольный журнал массива, так и элемент массива в свой код и прокомментировал их, чтобы указать. Любая помощь будет признательна. Заранее спасибо.

ИЗМЕНИТЬ: оказывается, что не работает, так это доступ к последнему элементу. Я обновил приведенный выше код

 var cacheW = [] var cacheA = [] var cacheD = [] var cacheS = []  // (B1) CAPTURE KEY STROKES window.addEventListener("keydown", function(evt) {  if (evt.key == "w") {  cacheW.push('w');  //console.log("this: "   evt.key)  } else if (evt.key == "a") {  cacheA.push('a');  //console.log("this: "   evt.key)  } else if (evt.key == "d") {  cacheD.push('d');  //console.log("this: "   evt.key)  } else if (evt.key == "s") {  cacheS.push('s');  //console.log("this: "   evt.key)  }  });   window.addEventListener("keyup", function(evt) {  if (evt.key == "w") {  cacheW.push("!w");  //console.log("this: "   evt.key   " removed")  } else if (evt.key == "a") {  cacheA.push("!a");  //console.log("this: "   evt.key   " removed")  } else if (evt.key == "d") {  cacheD.push("!d");  //console.log("this: "   evt.key   " removed")  } else if (evt.key == "s") {  cacheS.push("!s");  //console.log("this: "   evt.key   " removed")  }  });  //works setInterval(function() {  console.log(cacheW) //logs an array  }, 50)  //doesn't work setInterval(function() {  console.log(cacheW[-1]) //logs undefined, should have logged the last element }, 50) 

Комментарии:

1. его значение не определено , потому cacheW[0] что индекс 0 не существует в массиве

2. @AlexYu, но я только что зарегистрировал весь массив выше, и он явно имеет длину gt; 1, поэтому индекс 0 должен существовать

3. @серьезно [] — это пустой массив. Он имеет длину 0, а не 1. Как только вы нажмете клавишу хотя бы один раз, обе ваши интервальные функции напечатают массив и первый элемент соответственно

4. @knittl оказывается, что не работает доступ к последнему элементу. Я обновил приведенный выше код

5. cacheW[-1] не делает того, что ты думаешь. Javascript отличается от Python.

Ответ №1:

Элементы массива доступа Javascript по их индексу. -1 является недопустимым индексом. Чтобы получить доступ к последнему элементу, используйте arr[arr.length - 1] .

Другие языки, такие как python, предлагают синтаксический сахар для доступа к элементам из конца массива. В JavaScript нет такого синтаксического сахара. Самое близкое , что вы можете получить,-это написать arr.slice(-1)[0] , но это создаст временный массив из одного элемента, а затем получит доступ к первому элементу этого массива.

На самом деле -1 это свойство, а не действительный индекс. Имена свойств сначала строятся, а затем добавляются к объекту (каждый массив является объектом).:

 a = []; a[-1] = 42; console.log(a); // [], array itself is still empty console.log(a[-1]); // 42, property -1 on the object has value assigned console.log(a['-1']); // 42, object property keys are always converted to string first  

Ответ №2:

Вместо этого:

 //doesn't work setInterval(function() {  console.log(cacheW[0])//logs undefined, should have logged the first element }, 50)  

Этот:

 setInterval(function() {  if (cacheW.length gt; 0) {  console.log(cacheW[0]);  } else {  console.log("lt;emptygt;");  } }, 50);  

Обновить Если вы хотите распечатать последний элемент:

 setInterval(function() {  if (cacheW.length gt; 0) {  console.log(cacheW[cacheW.length-1]);  } else {  console.log("lt;emptygt;");  } }, 50);  

Комментарии:

1. оказывается, то, что не работает, — это доступ к последнему элементу. Я обновил приведенный выше код

2. @серьезно — Как ты думаешь cacheW[-1] , что делает? Подсказка: Javascript-это не Python.

3. относился к этому так, как будто ты прав. Спасибо