Я немного смущен JavaScript undefined
и null
значения.
Что делает if (!testvar)
на самом деле? Это тестирует на undefined
и null
или просто undefined
?
После того как переменная определяется, может я очищать его назад к undefined
(поэтому удаление переменной)?
Я могу передать undefined
в качестве параметра? Например:
function test(var1, var2, var3) {
}
test("value1", undefined, "value2");
Я немного запутался в Javascript undefined & null.
Не путайте с нулем
. Обычно это имеет смысл и ведет себя аналогично другим скриптовым языкам, которые используют внеполосные объекты 'null', 'nil' или 'None'.
неопределенный
, с другой стороны, является странной причудой JavaScript. Это однокнопочный объект, который представляет внеполосные значения, по сути, второй подобно-нормальный null
. Получается:
Когда вы вызываете функцию с меньшим количеством аргументов, чем список аргументов в списках операторов function
, необработанные аргументы устанавливаются в значение undefined
. Вы можете проверить это, например, с помощью функции:
dosomething(arg1, arg2) {
если (arg2===не определено)
arg2= DEFAULT_VALUE_FOR_ARG2;
...
}
С помощью этого метода нельзя определить разницу между dosomething(1)
и dosomething(1, неопределенное)
; arg2
будет одинаковым значением в обоих случаях. Если вам нужно определить разницу, вы можете посмотреть на arguments.length
, но делать необязательные аргументы, как правило, не очень удобочитаемые.
Когда функция не имеет возвращаемого значения ;
, она возвращает неопределенное
. Обычно нет необходимости использовать такой возвращаемый результат.
Когда вы объявляете переменную, имея в блоке оператор var a
, но еще не назначили ей значение, она является неопределенной
. Опять же, на самом деле, не стоит полагаться на это.
Зловещий оператор typeof
возвращает 'undefined'
, когда его операнд является простой переменной, которой не существует, вместо того, чтобы бросать ошибку, как это обычно бывает, если бы вы попытались на нее сослаться. (Можно также передать простую переменную, заключенную в круглые скобки, но не, а полное выражение, включающее несуществующую переменную). Для этого мало пользы, тоже.
Это спорный вопрос. Когда вы получаете доступ к свойству объекта, которого не существует, вы не сразу получаете ошибку, как в любом другом языке. Вместо этого вы получаете неопределенный
объект. (А потом, когда вы пытаетесь использовать этот объект 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. Если вы хотите освободить ссылку на что-то, чтобы можно было собрать мусор, то более обычным будет сказать переменная=нуль
.
могу ли я передать неопределенный в качестве параметра?
Да.
Вы не можете (не должны?) определить что-либо как неопределенное, так как переменная больше не будет неопределенной - вы просто определили ее к чему-то.
Вы не можете (не должны?) передать undefined
в функцию. Если вы хотите передать пустое значение, используйте вместо него null
.
В выражении if(!testvar)
проверяется наличие булевых значений true/false, именно в этом выражении проверяется, оценивается ли testvar
как false
. По определению, null
и undefined
не должны оцениваться ни как true
, ни как false
, но JavaScript оценивает null
как false
и дает ошибку при попытке вычислить неопределенную переменную.
Для правильной проверки undefined
или null
используйте следующие:
if(typeof(testvar) === "undefined") { ... }
if(testvar === null) { ... }
Чтобы ответить на Ваш первый вопрос, не оператор (!
) будет принуждать к получению булевого значения. Таким образом, null
, 0
, false
, NaN
и ""
(пустая строка) окажутся ложными.
Для if (something)
и if (! Something)
обычно используются для проверки, определено ли что-то или нет. Например:
if (document.getElementById)
Идентификатор преобразуется в логическое значение, поэтому undefined
интерпретируется как false
. Конечно, есть и другие значения (например, 0 и ''), которые также интерпретируются как false
, но либо идентификатор не должен иметь такое значение, либо вы довольны обработкой такого значения как undefined .
В Javascript есть оператор delete
, который можно использовать для удаления члена объекта. В зависимости от области видимости переменной (т.е. глобальной она или нет) вы можете удалить ее, чтобы она стала неопределенной.
Не существует ключевого слова undefined
, которое можно было бы использовать как неопределенный литерал. Вы можете опустить параметры в вызове функции, чтобы сделать их неопределенными, но это можно использовать только путем отправки меньшего количества параметров функции, вы не можете пропустить параметр в середине.
Лучший способ проверки на нулевые значения -
if ( testVar !== null )
{
// do action here
}
и на неопределенные
if ( testVar !== undefined )
{
// do action here
}
Вы можете присвоить переменной тип undefined.
testVar = undefined;
//typeof(testVar) will be equal to undefined.