Javascript получает значение из массива по индексу, избегая неопределенного, если индекс не существует?

Из http://javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/

В javascript у вас есть функция Объявление:

function foo() {
}

и выражение функции

var foo = function() {
}

Цитата из http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and- Подъем

«Объявления функций и функциональные переменные всегда перемещаются (« поднимаются ») в верхнюю часть их области JavaScript с помощью интерпретатора JavaScript».

Итак, что произошло в вашем первом примере, это объявление функции function a(), которое поднимается вверху области Javascript, создавая таким образом foo, даже если if оценивает значение false

. Думайте о var foo как обычный оператор Javascript, он выполняется только во время выполнения вашего javascript, в отличие от function foo(), поэтому справедливо следующее:

alert(foo());

function foo() {
   return 'gw ganteng';
}

Здесь function foo() анализируется синтаксический анализатор, поместив foo() в текущую область, прежде чем пытаться вызвать alert(foo())

http: // javascriptwe blog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/

При исполнении JavaScript есть контекст (который ECMA 5 разбивается на LexicalEnvironment, VariableEnvironment и ThisBinding) и Process (набор операторов, которые будут вызываться последовательно). Декларации вносят вклад в переменную среду, когда вводится область выполнения. Они отличаются от выражений (например, возврата) и не подчиняются их правилам процесса.

5
задан Zach Taylor 13 July 2018 в 06:21
поделиться

4 ответа

То, что вы видите, в основном является дизайнерским решением. Это работает JavaScript. Например, PHP аналогичен в том смысле, что доступ к не существующему индексу - это предупреждение, а не жесткая ошибка. Есть, вероятно, другие языковые примеры, которые ведут себя таким образом.

Чтобы обойти это:

Обычный способ действительно использует b = a[0] || "default", однако остерегайтесь поведения с ложью, но не неопределенного значения, например:

var myarray = [ 0, null, "" ];

var a = myarray[0] || "default[0]";
var b = myarray[1] || "default[1]";
var c = myarray[2] || "default[2]";
var d = myarray[3] || "default[3]";

console.log(a, b, c, d);

Если вы хотите строго проверить неопределенные значения, если использовать значения фальши, должны быть явными:

    var myarray = [ 0, null, "" ];

    var a = myarray[0] !== undefined ? myarray[0] : "default[0]";
    var b = myarray[1] !== undefined ? myarray[1] : "default[1]";
    var c = myarray[2] !== undefined ? myarray[2] : "default[2]";
    var d = myarray[3] !== undefined ? myarray[3] : "default[3]";

    console.log(a, b, c, d);

1
ответ дан apokryfos 17 August 2018 в 13:33
поделиться

Выполнение JavaScript мало чем отличается от других языков программирования. JavaScript не создает промежуточный код, который создает языки, такие как C, Java (например, байтовый код). Первый этап в Javascript - это этап декларации, в котором переменные определены в соответствующей области. Область по умолчанию - глобальная область. Каждая функция создает свою собственную область в javascript.

var a = 10;

Итак, на первом этапе он определит «a» в глобальной области. Обратите внимание, что он не инициализирует его значением 10. Следующая фаза - это фаза инициализации, где значение 10 присваивается переменной var 'a'. если a не объявлено никаким значением, оно будет инициализировано как 'undefined' .

В конце вы должны помнить, что это именно так, как это делает JavaScript.

1
ответ дан Ashlesh Sortee 17 August 2018 в 13:33
поделиться

Вы можете использовать оператор in operator , который проверяет, существует ли свойство в объекте / массиве с условным (тройным) оператором ?: для значение или какое-то значение по умолчанию.

Этот подход также сохраняет значения falsy .

const b = 0 in aa ? a[0] : <something other than undefined>;
3
ответ дан Nina Scholz 17 August 2018 в 13:33
поделиться

В будущей версии JavaScript (текущая дата 7/16/18) должно быть доступно колличество:

Вместо:

value != null ? value : 'default value';

Или:

value || 'default value'

(Числовое ноль, логическое значение false и пустая строка считаются ложными во втором решении. Очень опасно.)

Теперь мы можем сделать:

value ?? 'default value';

Документы: https://github.com/tc39/proposal-nullish-coalescing

0
ответ дан Zach Taylor 17 August 2018 в 13:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: