Могу ли я присвоить переменным значение undefined или передать undefined в качестве аргумента?
-
19-09-2019 - |
Вопрос
Я немного запутался в JavaScript undefined
и null
ценности.
Что делает if (!testvar)
на самом деле делаешь?Проверяет ли это на undefined
и null
или просто undefined
?
Как только переменная определена, могу ли я очистить ее обратно до undefined
(следовательно, удаляем переменную)?
Могу я пройти undefined
в качестве параметра?Например.:
function test(var1, var2, var3) {
}
test("value1", undefined, "value2");
Решение
Меня немного смущает Javascript undefined & null.
Пусть вас не смущает null
.Обычно это имеет смысл и ведет себя аналогично концепциям других скриптовых языков для внеполосных объектов ‘null’, ‘nil’ или ‘None’.
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
.Опять же, на самом деле вам никогда не нужно будет полагаться на это.Жуткий
typeof
оператор возвращает'undefined'
когда его операндом является простая переменная, которая не существует, вместо того, чтобы выдавать ошибку, как это обычно происходило бы, если бы вы попытались сослаться на нее.(Вы также можете присвоить ему простую переменную, заключенную в круглые скобки, но нет полное выражение, включающее несуществующую переменную.) От этого тоже мало толку.Это самый спорный вопрос.Когда вы обращаетесь к свойству объекта, который не существует, вы не сразу получаете сообщение об ошибке, как в любом другом языке.Вместо этого вы получаете
undefined
объект.(И затем, когда вы пытаетесь использовать этоundefined
возражаю, что позже в скрипте все пойдет не так странным образом, отследить который гораздо сложнее, чем если бы JavaScript просто выдал ошибку сразу.)Это часто используется для проверки наличия свойств:
if (o.prop!==undefined) // or often as truthiness test, if (o.prop) ...do something...
Однако, поскольку вы можете назначить
undefined
как и любая другая ценность:o.prop= undefined;
на самом деле это не определяет, существует ли свойство надежно.Лучше использовать
in
operator, которого не было в оригинальной версии JavaScript Netscape, но теперь он доступен везде:if ('prop' in o) ...
Подводя итог, undefined
это специфичный для JavaScript беспорядок, который всех сбивает с толку.Помимо необязательных аргументов функции, где JS не имеет другого более элегантного механизма, undefined
этого следует избегать.Это никогда не должно было быть частью языка; null
это отлично сработало бы для (2) и (3), а (4) - это ошибка, которая существует только потому, что в начале JavaScript не имел исключений.
что делает
if (!testvar)
на самом деле делаешь?Проверяет ли он на undefined и null или просто undefined?
Такой тест на ‘правдивость’ проверяет false
, undefined
, null
, 0
, NaN
и пустые строки.Но в данном случае, да, это действительно так undefined
это связано с.ИМО, это должно быть более четко сказано об этом и сказать if (testvar!==undefined)
.
как только переменная определена, могу ли я очистить ее обратно до значения undefined (следовательно, удалив переменную).
Вы, конечно, можете назначить undefined
к нему, но это не приведет к удалению переменной.Только тот delete object.property
оператор действительно что-то удаляет.
delete
на самом деле предназначен для свойств, а не для переменных как таковых.Браузеры позволят вам обойтись без прямых delete variable
, но это не очень хорошая идея и не будет работать в строгом режиме ECMAScript пятой версии.Если вы хотите освободить ссылку на что-то, чтобы это можно было собрать из мусора, было бы более обычным сказать variable= null
.
могу ли я передать undefined в качестве параметра?
ДА.
Другие советы
Вы не можете (не должны?) определять что-либо как неопределенное, поскольку переменная больше не будет неопределенной – вы просто определенный это к чему-то.
Вы не можете (не должны?) пройти undefined
к функции.Если вы хотите передать пустое значение, используйте null
вместо этого.
Заявление if(!testvar)
проверяет наличие логических значений true / false, в данном конкретном случае проверяется, является ли testvar
оценивает до false
.По определению, null
и undefined
не следует оценивать ни как true
или false
, но JavaScript оценивает null
как false
, и выдает ошибку, если вы пытаетесь вычислить неопределенную переменную.
Чтобы правильно протестировать undefined
или null
, используйте эти:
if(typeof(testvar) === "undefined") { ... }
if(testvar === null) { ... }
Основное различие заключается в том, что undefined
и null
представляют собой разные понятия.
Если бы только null
был доступен, вы не смогли бы определить, является ли null
было ли намеренно установлено значение или это значение еще не было установлено, если только вы не использовали громоздкий перехват ошибок:например
var a;
a == null; // This is true
a == undefined; // This is true;
a === undefined; // This is true;
Однако, если вы намеренно установили значение равным null
, строгое равенство с undefined
терпит неудачу, тем самым позволяя вам различать null
и undefined
ценности:
var b = null;
b == null; // This is true
b == undefined; // This is true;
b === undefined; // This is false;
Ознакомьтесь со ссылкой здесь, вместо того чтобы полагаться на людей, пренебрежительно говорящих всякую чушь вроде "Таким образом, undefined - это специфичный для JavaScript беспорядок, который всех сбивает с толку".Просто потому, что вы в замешательстве, это не значит, что это беспорядок.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined
Такое поведение также не характерно для JavaScript, и оно дополняет обобщенную концепцию, согласно которой логическим результатом может быть true
, false
, неизвестный (null
), никакой ценности (undefined
), или что-то пошло не так (error
).
Лучший способ проверить наличие нулевых значений - это
if ( testVar !== null )
{
// do action here
}
и для неопределенных
if ( testVar !== undefined )
{
// do action here
}
Вы можете присвоить переменной значение undefined .
testVar = undefined;
//typeof(testVar) will be equal to undefined.
ДА, вы можете, потому что undefined - это определенный как неопределенный.
console.log(
/*global.*/undefined === window['undefined'] &&
/*global.*/undefined === (function(){})() &&
window['undefined'] === (function(){})()
) //true
ваше дело:
test("value1", undefined, "value2")
вы также можете Создать ваша собственная неопределенная переменная:
Object.defineProperty(this, 'u', {value : undefined});
console.log(u); //undefined
Чтобы ответить на ваш первый вопрос, оператор not (!
) преобразует все, что ему задано, в логическое значение.Итак null
, 0
, false
, NaN
и ""
(пустая строка) будет выглядеть как false.
JavaScript, как установить переменной значение undefined в командной строке:
Установите для переменной значение undefined в js
терминал командной строки javascript, который поставляется вместе с Java в Ubuntu 12.10.
el@defiant ~ $ js
js> typeof boo
"undefined"
js> boo
typein:2: ReferenceError: boo is not defined
js> boo=5
5
js> typeof boo
"number"
js> delete(boo)
true
js> typeof boo
"undefined"
js> boo
typein:7: ReferenceError: boo is not defined
Если вы задаете переменной значение undefined в javascript:
Положи это в myjs.html:
<html>
<body>
<script type="text/JavaScript">
document.write("aliens: " + aliens);
document.write("typeof aliens: " + (typeof aliens));
var aliens = "scramble the nimitz";
document.write("found some aliens: " + (typeof aliens));
document.write("not sayings its aliens but... " + aliens);
aliens = undefined;
document.write("aliens deleted");
document.write("typeof aliens: " + (typeof aliens));
document.write("you sure they are gone? " + aliens);
</script>
</body>
</html>
Он печатает это:
aliens: undefined
typeof aliens: undefined
found some aliens: string
not sayings its aliens but... scramble the nimitz
aliens deleted
typeof aliens: undefined
you sure they are gone? undefined
ВНИМАНИЕ!Устанавливая вашей переменной значение undefined, вы устанавливаете вашей переменной значение другой переменной.Если какой-нибудь подлый человек сбежит undefined = 'rm -rf /';
затем всякий раз, когда вы устанавливаете для своей переменной значение undefined, вы будете получать это значение.
Возможно, вам интересно, как я могу вывести неопределенное значение aliens в начале и заставить его все еще выполняться.Это из-за поднятия javascript: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html
Попробуй это:
// found on UglifyJS
variable = void 0;
Для if (something)
и if (!something)
обычно используется для проверки, определено ли что-либо или не определено.Например:
if (document.getElementById)
Идентификатор преобразуется в логическое значение, так что undefined
интерпретируется как false
.Конечно, существуют и другие значения (например, 0 и "), которые также интерпретируются как false
, но либо идентификатор не должен разумно иметь такое значение, либо вы довольны тем, что рассматриваете такое значение так же, как undefined.
Javascript имеет delete
оператор, который может быть использован для удаления элемента объекта.В зависимости от области видимости переменной (т. е.если он глобальный или нет), вы можете удалить его, чтобы сделать его неопределенным.
Там нет никакого undefined
ключевое слово, которое вы можете использовать как неопределенный литерал.Вы можете опустить параметры в вызове функции, чтобы сделать их неопределенными, но это может быть использовано только путем отправки меньшего количества параметров в функцию, вы не можете опустить параметр в середине.
Просто ради интереса, вот довольно безопасный способ присвоить переменной значение "неназначенный".Чтобы это привело к коллизии, потребовалось бы, чтобы кто-то добавил в прототип для объекта точно такое же имя, как случайно сгенерированная строка.Я уверен, что генератор случайных строк можно было бы улучшить, но я просто взял один из этого вопроса: Генерировать случайную строку / символы в JavaScript
Это работает путем создания нового объекта и попытки получить доступ к его свойству со случайно сгенерированным именем, которое, как мы предполагаем, не будет существовать и, следовательно, будет иметь значение undefined .
function GenerateRandomString() {
var text = "";
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for (var i = 0; i < 50; i++)
text += possible.charAt(Math.floor(Math.random() * possible.length));
return text;
}
var myVar = {}[GenerateRandomString()];