Я могу установить переменные на неопределенный или передачу, неопределенную как аргумент?

Я немного смущен JavaScript undefined и null значения.

Что делает if (!testvar) на самом деле? Это тестирует на undefined и null или просто undefined?

После того как переменная определяется, может я очищать его назад к undefined (поэтому удаление переменной)?

Я могу передать undefined в качестве параметра? Например:

function test(var1, var2, var3) {

}

test("value1", undefined, "value2");
296
задан Sebastian Simon 25 September 2016 в 15:11
поделиться

5 ответов

Я немного запутался в Javascript undefined & null.

Не путайте с нулем . Обычно это имеет смысл и ведет себя аналогично другим скриптовым языкам, которые используют внеполосные объекты 'null', 'nil' или 'None'.

неопределенный, с другой стороны, является странной причудой JavaScript. Это однокнопочный объект, который представляет внеполосные значения, по сути, второй подобно-нормальный null. Получается:

  1. Когда вы вызываете функцию с меньшим количеством аргументов, чем список аргументов в списках операторов function, необработанные аргументы устанавливаются в значение undefined. Вы можете проверить это, например, с помощью функции:

    dosomething(arg1, arg2) {
     если (arg2===не определено)
     arg2= DEFAULT_VALUE_FOR_ARG2;
     ...
    }
    

    С помощью этого метода нельзя определить разницу между dosomething(1) и dosomething(1, неопределенное); arg2 будет одинаковым значением в обоих случаях. Если вам нужно определить разницу, вы можете посмотреть на arguments.length, но делать необязательные аргументы, как правило, не очень удобочитаемые.

  2. Когда функция не имеет возвращаемого значения ;, она возвращает неопределенное . Обычно нет необходимости использовать такой возвращаемый результат.

  3. Когда вы объявляете переменную, имея в блоке оператор var a, но еще не назначили ей значение, она является неопределенной . Опять же, на самом деле, не стоит полагаться на это.

  4. Зловещий оператор typeof возвращает 'undefined', когда его операнд является простой переменной, которой не существует, вместо того, чтобы бросать ошибку, как это обычно бывает, если бы вы попытались на нее сослаться. (Можно также передать простую переменную, заключенную в круглые скобки, но не, а полное выражение, включающее несуществующую переменную). Для этого мало пользы, тоже.

  5. Это спорный вопрос. Когда вы получаете доступ к свойству объекта, которого не существует, вы не сразу получаете ошибку, как в любом другом языке. Вместо этого вы получаете неопределенный объект. (А потом, когда вы пытаетесь использовать этот объект undefined позже в скрипте, он пойдет не так, как надо, что его гораздо сложнее отследить, чем если бы JavaScript сразу же выбросил ошибку)

    Это часто используется для проверки существования свойств:

    if (o.prop!==undefined) // или часто в качестве теста на правдивость, если (o.prop)
     ...сделай что-нибудь...
    

    Однако, потому что вы можете присвоить неопределенное , как и любое другое значение:

    o.prop= неопределенное;
    

    которое на самом деле не определяет, является ли свойство надежным. Лучше использовать оператор в, которого не было в оригинальной версии JavaScript в Netscape, но который теперь доступен везде:

    if ('prop' in o)
     ...
    

Резюмируя, неопределенное - это специфический для JavaScript беспорядок, который сбивает с толку всех. Кроме необязательных аргументов функции, где JS не имеет более элегантного механизма, следует избегать неопределенного. Это никогда не должно было быть частью языка; null сработал бы просто отлично для (2) и (3), и (4) является ошибкой, которая существует только потому, что в начале JavaScript не имел исключений.

что делает , если (!testvar) на самом деле? Проверяет ли он на неопределенность и ничтожность или просто неопределенность?

Такой тест на "правдивость" проверяет на наличие false, undefined, null, 0, NaN и пустых строк. Но в данном случае, да, это действительно неопределенный. IMO, она должна быть более откровенной и сказать if (testvar!==undefined).

как только переменная определена, я могу очистить ее обратно на неопределенную (следовательно, удалить переменную).

К ней, конечно, можно приписать undefined, но это не удалит переменную. Только оператор delete object.property действительно удаляет вещи.

delete действительно предназначен для свойств, а не для переменных как таковых. Браузеры позволят вам уйти от прямого удаления переменной, но это плохая идея и не будет работать в строгом режиме пятой редакции ECMAScript. Если вы хотите освободить ссылку на что-то, чтобы можно было собрать мусор, то более обычным будет сказать переменная=нуль.

могу ли я передать неопределенный в качестве параметра?

Да.

501
ответ дан 23 November 2019 в 01:32
поделиться

Вы не можете (не должны?) определить что-либо как неопределенное, так как переменная больше не будет неопределенной - вы просто определили ее к чему-то.

Вы не можете (не должны?) передать undefined в функцию. Если вы хотите передать пустое значение, используйте вместо него null.

В выражении if(!testvar) проверяется наличие булевых значений true/false, именно в этом выражении проверяется, оценивается ли testvar как false. По определению, null и undefined не должны оцениваться ни как true, ни как false, но JavaScript оценивает null как false и дает ошибку при попытке вычислить неопределенную переменную.

Для правильной проверки undefined или null используйте следующие:

if(typeof(testvar) === "undefined") { ... }

if(testvar === null) { ... }
16
ответ дан 23 November 2019 в 01:32
поделиться

Чтобы ответить на Ваш первый вопрос, не оператор (! ) будет принуждать к получению булевого значения. Таким образом, null, 0, false, NaN и "" (пустая строка) окажутся ложными.

5
ответ дан 23 November 2019 в 01:32
поделиться

Для if (something) и if (! Something) обычно используются для проверки, определено ли что-то или нет. Например:

if (document.getElementById)

Идентификатор преобразуется в логическое значение, поэтому undefined интерпретируется как false . Конечно, есть и другие значения (например, 0 и ''), которые также интерпретируются как false , но либо идентификатор не должен иметь такое значение, либо вы довольны обработкой такого значения как undefined .

В Javascript есть оператор delete , который можно использовать для удаления члена объекта. В зависимости от области видимости переменной (т.е. глобальной она или нет) вы можете удалить ее, чтобы она стала неопределенной.

Не существует ключевого слова undefined , которое можно было бы использовать как неопределенный литерал. Вы можете опустить параметры в вызове функции, чтобы сделать их неопределенными, но это можно использовать только путем отправки меньшего количества параметров функции, вы не можете пропустить параметр в середине.

0
ответ дан 23 November 2019 в 01:32
поделиться

Лучший способ проверки на нулевые значения -

if ( testVar !== null )
{
    // do action here
}

и на неопределенные

if ( testVar !== undefined )
{
    // do action here
}

Вы можете присвоить переменной тип undefined.

testVar = undefined;
//typeof(testVar) will be equal to undefined.
11
ответ дан 23 November 2019 в 01:32
поделиться
Другие вопросы по тегам:

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