Могу ли я установить переменные на неопределенное или передать неопределенное в качестве аргумента?
Я немного запутался в JavaScript undefined
а также null
ценности.
Что значит if (!testvar)
на самом деле делать? Это тест для undefined
а также null
или просто undefined
?
Как только переменная определена, я могу очистить ее undefined
(следовательно, удаляя переменную)?
Могу я пройти undefined
в качестве параметра? Например:
function test(var1, var2, var3) {
}
test("value1", undefined, "value2");
10 ответов
Я немного озадачен 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
, Опять же, вам никогда не нужно полагаться на это.Жуткий
typeof
оператор возвращает'undefined'
когда его операндом является простая переменная, которая не существует, вместо выдачи ошибки, как это обычно бывает, если вы пытаетесь сослаться на нее. (Вы также можете указать простую переменную, заключенную в скобки, но не полное выражение, включающее несуществующую переменную.) Для этого тоже не слишком много пользы.Это спорный. Когда вы получаете доступ к свойству объекта, который не существует, вы не сразу получаете ошибку, как на любом другом языке. Вместо этого вы получаете
undefined
объект. (А потом, когда вы пытаетесь использовать этоundefined
позже объект в скрипте будет работать странным образом, его гораздо сложнее отследить, чем если бы JavaScript только что сразу выдал ошибку.)Это часто используется для проверки существования свойств:
if (o.prop!==undefined) // or often as truthiness test, if (o.prop) ...do something...
Тем не менее, потому что вы можете назначить
undefined
как и любое другое значение:o.prop= undefined;
это фактически не обнаруживает, надежно ли там находится имущество. Лучше использовать
in
оператор, которого не было в оригинальной версии Netscape JavaScript, но который теперь доступен везде:if ('prop' in o) ...
В итоге, undefined
это специфический для JavaScript беспорядок, который смущает всех. Помимо необязательных аргументов функции, где у JS нет другого более элегантного механизма, undefined
необходимо избегать. Это никогда не должно было быть частью языка; null
сработало бы просто отлично для (2) и (3), а (4) является ошибкой, которая существует только потому, что в начале JavaScript не имел исключений.
что значит
if (!testvar)
на самом деле делать? Это тест для неопределенных и нулевых или просто неопределенных?
Такой тест "правдивости" проверяет false
, undefined
, null
, 0
, NaN
и пустые строки. Но в этом случае, да, это действительно undefined
это связано с. ИМО, это должно быть более четко об этом и сказать if (testvar!==undefined)
,
Как только переменная определена, я могу очистить ее до неопределенной (следовательно, удалив переменную).
Вы, конечно, можете назначить undefined
к нему, но это не удалит переменную. Только delete object.property
Оператор действительно удаляет вещи.
delete
действительно предназначен для свойств, а не переменных как таковых. Браузеры позволят вам сойти с рук прямо delete variable
, но это не очень хорошая идея и не будет работать в строгом режиме ECMAScript Fifth Edition. Если вы хотите высвободить ссылку на что-либо, чтобы ее можно было собрать мусором, было бы более привычным сказать variable= null
,
я могу передать неопределенный в качестве параметра?
Да.
Вы не можете (не должны?) Определять что-либо как неопределенное, так как переменная больше не будет неопределенной - вы просто определили это для чего-то.
Вы не можете (не должны?) Пройти 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
}
Вы можете назначить переменную с неопределенным.
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
Чтобы ответить на ваш первый вопрос, не оператор (!
) приведёт все, что указано в логическое значение. Так null
, 0
, false
, NaN
а также ""
(пустая строка) все будет отображаться как ложное.
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 = 'rm -rf /';
тогда всякий раз, когда вы устанавливаете переменную в неопределенное значение, вы получите это значение.
Вам может быть интересно, как я могу вывести инопланетян с неопределенным значением в начале и заставить их все еще работать. Это из-за подъема JavaScript: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html
Для if (something)
а также if (!something)
обычно используется для проверки, если что-то определено или не определено. Например:
if (document.getElementById)
Идентификатор преобразуется в логическое значение, поэтому undefined
интерпретируется как false
, Конечно, есть и другие значения (например, 0 и ''), которые также интерпретируются как false
, но либо у идентификатора не должно быть разумного значения, либо вы довольны тем, что рассматриваете такое значение как неопределенное.
Javascript имеет delete
Оператор, который может быть использован для удаления члена объекта. В зависимости от области действия переменной (т. Е. Глобальной или нет) вы можете удалить ее, чтобы сделать ее неопределенной.
Здесь нет undefined
ключевое слово, которое вы можете использовать как неопределенный литерал. Вы можете опустить параметры в вызове функции, чтобы сделать их неопределенными, но это можно использовать только путем отправки меньшего количества параметров функции, вы не можете опустить параметр в середине.
Просто для забавы, вот довольно безопасный способ присвоения "неназначенной" переменной. Для того чтобы это произошло, потребовалось бы, чтобы кто-то добавил к прототипу Object с тем же именем, что и случайно сгенерированная строка. Я уверен, что генератор случайных строк можно улучшить, но я просто взял один из этого вопроса: генерировать случайные строки / символы в 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()];