Могу ли я установить переменные в undefined или передать undefined в качестве аргумента?

Я немного смущен о значениях JavaScripts undefined и null.

Что делает if (!testvar) на самом деле? Проверяет ли он undefined и null или просто undefined?

Как только переменная определена, я могу ее очистить до undefined (поэтому удаляя переменную)?

Могу ли я передать undefined в качестве параметра? Например:.

function test(var1, var2, var3) {

}

test("value1", undefined, "value2");

Ответы

Ответ 1

Я немного смущен Javascript undefined и null.

Не путайтесь с null. Как правило, это имеет смысл и ведет себя так же, как и другие концепции языков сценариев внеполосных объектов "null", "nil" или "None".

undefined, с другой стороны, это странный JavaScript quirk. Это одноэлементный объект, представляющий внеполосные значения, по существу второй второй, но отличный 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 позже в script, это пойдет не так странным образом, что гораздо труднее отследить, чем если бы 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) на самом деле? Проверяет ли он на undefined и null или просто undefined?

Такой тест правности проверяется на false, undefined, null, 0, NaN и пустые строки. Но в этом случае, да, это действительно undefined, что это касается. ИМО, он должен быть более явным и сказать if (testvar!==undefined).

После определения переменной я могу удалить ее обратно до undefined (поэтому удаляя переменную).

Вы можете назначить ему undefined, но это не приведет к удалению переменной. Только оператор delete object.property действительно удаляет вещи.

delete действительно предназначен для свойств, а не для переменных как таковых. Браузеры позволят вам уйти с прямым delete variable, но это не очень хорошая идея и не будет работать в строгом режиме ECMAScript Fifth Edition. Если вы хотите высвободить ссылку на что-то, чтобы можно было собрать мусор, было бы более обычным сказать variable= null.

Могу ли я передать undefined в качестве параметра?

Да.

Ответ 2

Вы не можете (не должны?) определять что-либо как undefined, поскольку переменная больше не будет undefined – вы просто определили его для чего-то.

Вы не можете (не должны?) передать undefined функции. Если вы хотите передать пустое значение, используйте null вместо этого.

В заявлении if(!testvar) проверяются значения boolean true/false, этот конкретный проверяет, оценивает ли testvar значение false. По определению null и undefined не следует оценивать как true или false, но JavaScript оценивает null как false и дает ошибку, если вы попытаетесь оценить переменную undefined.

Чтобы правильно протестировать undefined или null, используйте следующие команды:

if(typeof(testvar) === "undefined") { ... }

if(testvar === null) { ... }

Ответ 3

Основное отличие состоит в том, что undefined и null представляют разные понятия.

Если доступно только null, вы не сможете определить, было ли умышленно установлено значение null в качестве значения или значение еще не установлено, если вы не использовали громоздкую ошибку: eg

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), no value (undefined), или что-то пошло не так (error).

http://en.wikipedia.org/wiki/Undefined_value

Ответ 4

Лучший способ проверить нулевые значения -

if ( testVar !== null )
{
    // do action here
}

и для undefined

if ( testVar !== undefined )
{
    // do action here
}

Вы можете назначить avariable с помощью undefined.

testVar = undefined;
//typeof(testVar) will be equal to undefined.

Ответ 5

Чтобы ответить на ваш первый вопрос, оператор not (!) будет принуждать все, что он задан, к логическому значению. Таким образом, null, 0, false, NaN и "" (пустая строка) будут отображаться как ложные.

Ответ 6

ДА, вы можете, потому что undefined defined как undefined.

console.log(
   /*global.*/undefined === window['undefined'] &&
   /*global.*/undefined === (function(){})() &&
   window['undefined']  === (function(){})()
) //true

ваш случай:

test("value1", undefined, "value2")

вы также можете создать свою собственную переменную undefined:

Object.defineProperty(this, 'u', {value : undefined});
console.log(u); //undefined

Ответ 7

JavaScript, как установить переменную в undefined в командной строке:

Задайте переменную undefined в терминале командной строки js javascript, который поставляется с Java на Ubuntu 12.10.

[email protected] ~ $ 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, вы получите это значение.

Вам может быть интересно, как я могу вывести значение undefined пришельцев в начале и все еще запустить. Это из-за javascript hoisting: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html

Ответ 8

Для if (something) и if (!something) обычно используется для проверки того, определено или не определено какое-либо событие. Например:

if (document.getElementById)

Идентификатор преобразуется в булево значение, поэтому undefined интерпретируется как false. Конечно, существуют и другие значения (например, 0 и '), которые также интерпретируются как false, но либо идентификатор не должен иметь разумного значения, либо вы довольны тем, что рассматриваете такое значение так же, как undefined.

Javascript имеет оператор delete, который может использоваться для удаления члена объекта. В зависимости от области действия переменной (т.е. Если она глобальна или нет) вы можете удалить ее, чтобы сделать ее undefined.

Нет ключевого слова undefined, которое можно использовать как литерал undefined. Вы можете опустить параметры в вызове функции, чтобы сделать их undefined, но это можно использовать только для отправки меньших параметров функции, вы не можете опустить параметр в середине.

Ответ 9

Просто для удовольствия, здесь достаточно безопасный способ присвоить переменную "неназначенный". Для этого для столкновения потребуется, чтобы кто-то добавил к прототипу объекта с точно таким же именем, что и случайная сгенерированная строка. Я уверен, что генератор случайных строк может быть улучшен, но я просто взял один из этого вопроса: Генерировать случайные строки/символы в 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()];

Ответ 10

Попробуйте следующее:

// found on UglifyJS
variable = void 0;