Я немного озадачен Javascript неопределенным и нулевым.
Не смущайтесь null
. Обычно это имеет смысл и ведет себя аналогично концепциям других языков сценариев внеполосных объектов «ноль», «ноль» или «нет».
undefined
с другой стороны, это странная JavaScript-причуда. Это одноэлементный объект, который представляет внеполосные значения, по сути, второй аналогичный, но отличный null
. Это подходит:
Когда вы вызываете функцию с меньшим количеством аргументов, чем в списке аргументов в function
списках операторов, непереданные аргументы устанавливаются в undefined
. Вы можете проверить это, например:
function dosomething(arg1, arg2) {
if (arg2===undefined)
arg2= DEFAULT_VALUE_FOR_ARG2;
...
}
С этим методом вы не можете определить разницу между dosomething(1)
и dosomething(1, undefined)
; arg2
будет одинаковое значение в обоих. Если вам нужно увидеть разницу, на которую вы можете посмотреть arguments.length
, но такие необязательные аргументы обычно не очень читабельны.
Когда функция не имеет return value;
, она возвращается undefined
. Обычно нет необходимости использовать такой результат возврата.
Когда вы объявляете переменную, имея var a
инструкцию в блоке, но еще не присвоили ей значение, это так undefined
. Опять же, вам никогда не нужно полагаться на это.
Оператор spooky typeof
возвращается, 'undefined'
когда его операндом является простая переменная, которая не существует, вместо того, чтобы выдавать ошибку, как это обычно бывает, если вы пытаетесь обратиться к ней. (Вы также можете указать простую переменную, заключенную в скобки, но не полное выражение, включающее несуществующую переменную.) Для этого тоже не слишком много пользы.
Это спорный. Когда вы получаете доступ к свойству объекта, который не существует, вы не сразу получаете ошибку, как в любом другом языке. Вместо этого вы получаете undefined
объект. (И затем, когда вы попытаетесь использовать этот undefined
объект позже в сценарии, он будет работать странным образом, и его будет гораздо сложнее отследить, чем если бы JavaScript только что выдал ошибку сразу.)
Это часто используется для проверки существования свойств:
if (o.prop!==undefined) // or often as truthiness test, if (o.prop)
...do something...
Тем не менее, потому что вы можете назначить, undefined
как и любое другое значение:
o.prop= undefined;
это фактически не обнаруживает, надежно ли там находится имущество. Лучше использовать in
оператор, которого не было в исходной версии JavaScript Netscape, но который теперь доступен везде:
if ('prop' in o)
...
Таким образом, undefined
это специфический для JavaScript беспорядок, который смущает всех. Помимо необязательных аргументов функции, где у JS нет другого более элегантного механизма, undefined
следует избегать. Это никогда не должно было быть частью языка; null
сработало бы просто отлично для (2) и (3), а (4) является ошибкой, которая существует только потому, что в начале JavaScript не имел исключений.
что на if (!testvar)
самом деле делает? Это тест для неопределенных и нулевых или просто неопределенных?
Такой «truthiness» тест проверяет против false
, undefined
, null
, 0
, NaN
и пустые строки. Но в данном случае, да, это действительно undefined
связано с этим. ИМО, надо об этом более четко и сказать if (testvar!==undefined)
.
Как только переменная определена, я могу очистить ее обратно до неопределенной (следовательно, удалив переменную).
Вы, конечно, можете присвоить undefined
ему, но это не удалит переменную. Только delete object.property
оператор действительно удаляет вещи.
delete
действительно предназначен для свойств, а не переменных как таковых. Браузеры позволят вам сойти с рук delete variable
, но это не очень хорошая идея и не будет работать в строгом режиме ECMAScript Fifth Edition. Если вы хотите высвободить ссылку на что-либо, чтобы ее можно было собрать мусором, было бы более привычным сказать variable= null
.
я могу передать неопределенный в качестве параметра?
Да.