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

StackOverflow https://stackoverflow.com/questions/2235622

  •  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.Это всплывает:

  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 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).

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

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

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()];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top