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

Я немного запутался в 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, Это подходит:

  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 оператор, которого не было в оригинальной версии 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).

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

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

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

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

// found on UglifyJS
variable = void 0;

Для 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()];
Другие вопросы по тегам