Могу ли я установить переменные в неопределенное или передать неопределенное в качестве аргумента? - PullRequest
286 голосов
/ 10 февраля 2010

Меня немного смущают значения undefined и null в JavaScript.

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

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

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

function test(var1, var2, var3) {

}

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

Ответы [ 10 ]

490 голосов
/ 10 февраля 2010

Я немного озадачен тем, что Javascript не определен & null.

Не смущайтесь насчет null. Как правило, он имеет смысл и ведет себя аналогично концепциям других языков сценариев внеполосных «нулевых», «нулевых» или «нулевых» объектов.

undefined, с другой стороны, это странная причуда JavaScript. Это одноэлементный объект, который представляет внеполосные значения, по сути, второй аналогичный, но отличающийся null. Приходит:

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

    function dosomething(arg1, arg2) {
        if (arg2===undefined)
        arg2= DEFAULT_VALUE_FOR_ARG2;
        ...
    }
    

    С помощью этого метода вы не сможете определить разницу между dosomething(1) и dosomething(1, undefined); arg2 будет одинаковым значением в обоих. Если вам нужно заметить разницу, вы можете посмотреть на arguments.length, но такие необязательные аргументы, как правило, не очень читабельны.

  2. Когда функция не имеет return value;, она возвращает undefined. Обычно нет необходимости использовать такой результат возврата.

  3. Когда вы объявляете переменную с помощью оператора var a в блоке, но еще не присвоили ему значение, это undefined. Опять же, вам никогда не нужно полагаться на это.

  4. Страшный оператор typeof возвращает 'undefined', когда его операндом является простая переменная, которая не существует, вместо того, чтобы выдавать ошибку, как обычно происходит, если вы пытаетесь обратиться к ней. (Вы также можете указать простую переменную, заключенную в скобки, но , а не полное выражение, содержащее несуществующую переменную.) Для этого тоже не слишком много пользы.

  5. Это спорный вопрос. Когда вы получаете доступ к свойству объекта, который не существует, вы не сразу получаете ошибку, как в любом другом языке. Вместо этого вы получаете 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)? Проверяется ли неопределенное и нулевое или просто неопределенное?

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

как только переменная определена, я могу очистить ее до неопределенной (следовательно, удалив переменную).

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

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

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

Да.

16 голосов
/ 10 февраля 2010

Вы не можете (не должны?) Определять что-либо как неопределенное, так как переменная больше не будет неопределенной & ndash; вы просто определили что-то.

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

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

Чтобы правильно проверить undefined или null, используйте эти:

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

if(testvar === null) { ... }
12 голосов
/ 05 октября 2014

Основное различие заключается в том, что 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).

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

11 голосов
/ 10 февраля 2010

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

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

и для неопределенного

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

Вы можете назначить переменную с неопределенным значением.

testVar = undefined;
//typeof(testVar) will be equal to undefined.
6 голосов
/ 18 апреля 2014

ДА, вы можете, , потому что 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
5 голосов
/ 10 февраля 2010

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

2 голосов
/ 22 сентября 2017

Попробуйте это:

// found on UglifyJS
variable = void 0;
2 голосов
/ 08 января 2014

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 /';, то всякий раз, когда вы устанавливаете переменную в значение undefined, вы получите это значение.

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

0 голосов
/ 01 сентября 2014

Просто для забавы, вот довольно безопасный способ присвоения «неназначенной» переменной. Для этого для столкновения потребуется, чтобы кто-то добавил к прототипу 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()];
0 голосов
/ 10 февраля 2010

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

if (document.getElementById)

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

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

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

...