Я немного запутался в JavaScript undefined
и null
ценностях.
Что на if (!testvar)
самом деле делает? Это проверяет undefined
и null
или просто undefined
?
Как только переменная определена, могу ли я очистить ее undefined
(следовательно, удалив переменную)?
Могу ли я передать undefined
в качестве параметра? Например:
function test(var1, var2, var3) {
}
test("value1", undefined, "value2");
Ответы:
Не смущайтесь
null
. Обычно это имеет смысл и ведет себя аналогично концепциям других языков сценариев внеполосных объектов «ноль», «ноль» или «нет».undefined
с другой стороны, это странная JavaScript-причуда. Это одноэлементный объект, который представляет внеполосные значения, по сути, второй аналогичный, но отличныйnull
. Это подходит:Когда вы вызываете функцию с меньшим количеством аргументов, чем в списке аргументов в
function
списках операторов, непереданные аргументы устанавливаются вundefined
. Вы можете проверить это, например:С этим методом вы не можете определить разницу между
dosomething(1)
иdosomething(1, undefined)
;arg2
будет одинаковое значение в обоих. Если вам нужно увидеть разницу, на которую вы можете посмотретьarguments.length
, но такие необязательные аргументы обычно не очень читабельны.Когда функция не имеет
return value;
, она возвращаетсяundefined
. Обычно нет необходимости использовать такой результат возврата.Когда вы объявляете переменную, имея
var a
инструкцию в блоке, но еще не присвоили ей значение, это такundefined
. Опять же, вам никогда не нужно полагаться на это.Оператор spooky
typeof
возвращается,'undefined'
когда его операндом является простая переменная, которая не существует, вместо того, чтобы выдавать ошибку, как это обычно бывает, если вы пытаетесь обратиться к ней. (Вы также можете указать простую переменную, заключенную в скобки, но не полное выражение, включающее несуществующую переменную.) Для этого тоже не слишком много пользы.Это спорный. Когда вы получаете доступ к свойству объекта, который не существует, вы не сразу получаете ошибку, как в любом другом языке. Вместо этого вы получаете
undefined
объект. (И затем, когда вы попытаетесь использовать этотundefined
объект позже в сценарии, он будет работать странным образом, и его будет гораздо сложнее отследить, чем если бы JavaScript только что выдал ошибку сразу.)Это часто используется для проверки существования свойств:
Тем не менее, потому что вы можете назначить,
undefined
как и любое другое значение:это фактически не обнаруживает, надежно ли там находится имущество. Лучше использовать
in
оператор, которого не было в исходной версии JavaScript Netscape, но который теперь доступен везде:Таким образом,
undefined
это специфический для JavaScript беспорядок, который смущает всех. Помимо необязательных аргументов функции, где у JS нет другого более элегантного механизма,undefined
следует избегать. Это никогда не должно было быть частью языка;null
сработало бы просто отлично для (2) и (3), а (4) является ошибкой, которая существует только потому, что в начале JavaScript не имел исключений.Такой «truthiness» тест проверяет против
false
,undefined
,null
,0
,NaN
и пустые строки. Но в данном случае, да, это действительноundefined
связано с этим. ИМО, надо об этом более четко и сказатьif (testvar!==undefined)
.Вы, конечно, можете присвоить
undefined
ему, но это не удалит переменную. Толькоdelete object.property
оператор действительно удаляет вещи.delete
действительно предназначен для свойств, а не переменных как таковых. Браузеры позволят вам сойти с рукdelete variable
, но это не очень хорошая идея и не будет работать в строгом режиме ECMAScript Fifth Edition. Если вы хотите высвободить ссылку на что-либо, чтобы ее можно было собрать мусором, было бы более привычным сказатьvariable= null
.Да.
источник
undefined
одноэлементный объект? Что вы имеете в виду? Это примитивная ценность, а не объект.typeof foo=='undefined'
; он имеет тенденцию использоваться для (4a) глобального сниффинга, и в этом случае я бы предпочел быть явным и сказать'foo' in window
, или (4b) для проверки самогоundefined
-value, и в этом случае я бы предпочел быть читаемым и сказатьfoo===undefined
. В теории тестированиеtypeof
против'undefined'
может иметь вариант использования, который не могут обеспечить другие конструкции: анализ наличия локальных переменных. Однако в действительности вы почти всегда знаете, какие переменные объявлены локальными.return
оператора возвращаетundefined
, но если функция является конструктором (вызывается сnew
оператором), она возвратит новый объект (значениеthis
внутри конструктора), несмотря на отсутствиеreturn
оператора.console.log((function (){}()));
возвращаетсяundefined
.console.log((new function (){}()));
возвращает объект.Вы не можете (не должны?) Определять что-либо как неопределенное, так как переменная больше не будет неопределенной - вы просто определили это для чего-то.
Вы не можете (не должны?) Переходить
undefined
к функции. Если вы хотите передать пустое значение, используйтеnull
вместо этого.Оператор
if(!testvar)
проверяет логические значения true / false, этот конкретный тест проверяет, является лиtestvar
значениеfalse
. По определению,null
иundefined
не должны быть оценены ни какtrue
илиfalse
, но Равняется JavaScript ,null
какfalse
и выдает ошибку , если попытаться оценить неопределенную переменную.Чтобы правильно проверить
undefined
илиnull
использовать, используйте эти:источник
==
и!=
).var a= undefined
, Вы можете пройтиfn(undefined)
. Если вы хотите найти разницу между неопределенным свойствомp
объектаo
и свойствомp
, которое определено и установлено наundefined
, вы должны использовать'p' in o
оператор.testvar === undefined
а не более сложныеtypeof(testvar) === "undefined"
?typeof
теста для неопределенных переменных: в отличие от этогоnull
,undefined
это просто свойство глобального объекта, которое само может быть переопределено. Он принимает только определенный стиль кодирования и пропущенный знак равенства иundefined
молча изменяется:if (undefined = someVar) {...}
undefined
неизменное свойство глобального объекта, поэтому оно безопаснее, чем было раньше. Тем не менее, все еще возможно определить непостоянную переменную, вызываемуюundefined
внутри функции, поэтому проблема не исчезла полностью.Принципиальное отличие заключается в том, что
undefined
иnull
представляют разные понятия.Если бы только
null
было доступно, вы бы не смогли определить,null
было ли оно преднамеренно установлено в качестве значения или значение еще не было установлено, если вы не использовали громоздкий перехват ошибок: например,Тем не менее, если вы намеренно устанавливаете значение в
null
, строгое равенство сundefined
ошибками, что позволяет вам различатьnull
иundefined
значения:Посмотрите здесь ссылку, вместо того чтобы полагаться на то, что люди пренебрежительно говорят «мусор», например: «В общем, undefined - это беспорядок в JavaScript, который смущает всех». То, что вы растеряны, не означает, что это беспорядок.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined
Такое поведение также не относится к JavaScript и завершает обобщенное понятие , что логический результат может быть
true
,false
неизвестный (null
), нет значения (undefined
), или что - то пошло не так (error
).http://en.wikipedia.org/wiki/Undefined_value
источник
null
равно сработало бы просто отлично.a == null
этоtrue
потому , что типа Javascript принуждения.Лучший способ проверить наличие нулевых значений:
и для неопределенного
Вы можете назначить переменную с неопределенным.
источник
!==
, а не!=
ДА, вы можете, потому что неопределенный определяется как неопределенный.
ваш случай:
Вы также можете создать свою собственную неопределенную переменную:
источник
Чтобы ответить на ваш первый вопрос, оператор not ((
!
) преобразует все, что ему дано, в логическое значение. Таким образомnull
,0
,false
,NaN
и""
(пустая строка) будет все , кажется ложной.источник
undefined
не будет отображаться какfalse
, это вызовет ошибку «не определено».if (undefined) {/* Do stuff*/}
не выдаст ошибку, такundefined
как существует как свойство глобального объекта. Что выдаст ошибку это что-то вродеif (someUndeclaredVariable) {/* Do stuff*/}
JavaScript, как установить переменную неопределенной в командной строке:
Задайте для переменной значение undefined в
js
терминале командной строки javascript, который поставляется с Java в Ubuntu 12.10.Если вы установите переменную в undefined в javascript:
Поместите это в myjs.html:
Это печатает это:
ПРЕДУПРЕЖДЕНИЕ! Когда вы устанавливаете переменную в неопределенное значение, вы устанавливаете переменную в другую переменную. Если работает какой-то подлый человек,
undefined = 'rm -rf /';
то всякий раз, когда вы устанавливаете переменную в значение undefined, вы получите это значение.Вам может быть интересно, как я могу вывести инопланетян с неопределенным значением в начале и заставить их все еще работать. Это из-за подъема JavaScript: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html
источник
Попробуй это:
источник
Для
if (something)
иif (!something)
обычно используется для проверки, если что-то определено или не определено. Например:Идентификатор преобразуется в логическое значение, поэтому
undefined
интерпретируется какfalse
. Конечно, есть и другие значения (например, 0 и ''), которые также интерпретируются какfalse
, но либо у идентификатора не должно быть разумного значения, либо вы довольны обработкой такого значения как неопределенного.В Javascript есть
delete
оператор, который можно использовать для удаления члена объекта. В зависимости от области действия переменной (т. Е. Глобальной или нет) вы можете удалить ее, чтобы сделать ее неопределенной.Нет
undefined
ключевого слова, которое вы можете использовать как неопределенный литерал. Вы можете опустить параметры в вызове функции, чтобы сделать их неопределенными, но это можно использовать, только отправляя в функцию меньше параметров, вы не можете опустить параметр в середине.источник
Просто для забавы, вот довольно безопасный способ присвоения «неназначенной» переменной. Для того, чтобы это произошло, потребовалось бы, чтобы кто-то добавил к прототипу Object с тем же именем, что и случайно сгенерированная строка. Я уверен, что генератор случайных строк можно улучшить, но я просто взял один из этого вопроса: генерировать случайные строки / символы в JavaScript
Это работает, создавая новый объект и пытаясь получить доступ к свойству со случайно сгенерированным именем, которое, как мы предполагаем, не будет существовать и, следовательно, будет иметь значение undefined.
источник