Подтвердить что ты не робот

Когда нужно проверить undefined и когда нужно проверить значение null

[Bounty Edit]

Я ищу хорошее объяснение, когда вы должны установить/использовать null или undefined и где вам нужно его проверить. В основном, какие общие практики для этих двух и действительно ли можно рассматривать их отдельно в родовом поддерживаемом кодеде?

Когда я могу безопасно проверить === null, безопасно проверить для === undefined и когда мне нужно проверить оба с помощью == null

Когда вы должны использовать ключевое слово undefined и когда нужно использовать ключевое слово null

У меня есть различные проверки в формате

if (someObj == null) или if (someObj != null), которые проверяют как null, так и undefined. Я хотел бы изменить все это на === undefined или === null, но я не уверен, как гарантировать, что он будет только когда-либо одним из двух, но не обоих.

Где вы должны использовать проверки для null и где следует использовать проверки для undefined

Конкретный пример:

var List = []; // ordered list contains data at odd indexes.

var getObject = function(id) {
    for (var i = 0; i < List.length; i++) {
        if (List[i] == null) continue;
        if (id === List[i].getId()) {
            return List[i];
        }
    }
    return null;
}

var deleteObject = function(id) {
    var index = getIndex(id) // pretty obvouis function
    // List[index] = null; // should I set it to null?
    delete List[index]; // should I set it to undefined?
}

Это только один пример того, где я могу использовать как null, так и undefined, и я не знаю, что правильно.

Есть ли случаи, когда вы должны проверить как null, так и undefined, потому что у вас нет выбора?

4b9b3361

Ответ 1

Функции неявно возвращают undefined. Клавиши Undefined в массивах undefined. Undefined атрибуты в объектах undefined.

function foo () {

};

var bar = [];
var baz = {};

//foo() === undefined && bar[100] === undefined && baz.something === undefined

document.getElementById возвращает null, если элементы не найдены.

var el = document.getElementById("foo");

// el === null || el instanceof HTMLElement

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

Я рекомендую вам избегать null; используйте undefined.

Ответ 2

Некоторые методы DOM возвращают null. Все свойства объекта, которые не были установлены, возвращают undefined при попытке получить к ним доступ, включая свойства Array. Функция без оператора return неявно возвращает undefined.

Я бы посоветовал убедиться, что вы точно знаете, какие значения возможны для переменной или свойства, которое вы тестируете и проверяете для этих значений явно и с уверенностью. Для тестирования null используйте foo === null. Для тестирования undefined я бы рекомендовал использовать typeof foo == "undefined" в большинстве ситуаций, потому что undefined (в отличие от null) не является зарезервированным словом и вместо этого является простым свойством глобального объекта, который может быть изменен, а также по другим причинам, о которых я недавно писал: variable === undefined void typeof variable === "undefined"

Ответ 3

Разница между null и undefined заключается в том, что null сам является значением и должен быть назначен. Это не значение по умолчанию. Новая переменная без присвоенного ей значения - undefined.

var x;
// value undefined - NOT null.
x = null;
// value null - NOT undefined.

Ответ 4

Мне интересно отметить, что, когда Windows была впервые написана, он не выполнял много проверок на недопустимые/NULL-указатели. В конце концов, ни один программист не был бы достаточно глупым, чтобы передать NULL, где нужна действительная строка. И тестирование для NULL просто делает код более крупным и медленным.

В результате многие ОАЭ были связаны с ошибками в клиентских программах, но все тепло пошло на Microsoft. С тех пор Microsoft изменила Windows, чтобы в значительной степени проверить каждый аргумент для NULL.

Я думаю, что урок состоит в том, что, если вы не уверены, что аргумент всегда будет действительным, вероятно, стоит проверить его. Конечно, Windows используется многими программистами, в то время как ваша функция может использоваться только вами. Таким образом, это безусловно влияет на то, насколько вероятен недопустимый аргумент.

В таких языках, как C и С++, вы можете использовать ASSERT, и я использую их ВСЕ время, когда вы используете эти языки. Это утверждения, которые проверяют определенные условия, которых вы никогда не ожидаете. Во время отладки вы можете проверить, что на самом деле они никогда этого не делают. Затем, когда вы создаете выпуск, эти инструкции не включаются в скомпилированный код. В некотором смысле это кажется мне лучшим из обоих миров.

Ответ 5

Если вы вызываете функцию без явного возврата, она неявно возвращает undefined. Поэтому, если у меня есть функция, которая должна сказать, что она выполнила свою задачу, и ничего не получается, например. XMLHTTPRequest, который ничего не возвращал, когда вы обычно ожидаете, что будет что-то (например, вызов базы данных), тогда я бы явно возвращал null.

Ответ 6

Undefined отличается от нуля при использовании! ==, но не при использовании более слабого! =, потому что JavaScript делает в этом случае неявное литье.

Основное различие между нулем и undefined заключается в том, что undefined также может означать то, что не было назначено.

                            undefined   false
(SomeObject.foo)            false        false
(SomeObject.foo != null)    false        true
(SomeObject.foo !== null)   true         true
(SomeObject.foo != false)   true         false
(SomeObject.foo !== false)  true         false

Это взято из этого веб-сайта

Ответ 7

Проблема в том, что вы утверждаете, что видите разницу, но вы этого не делаете. Возьмите свой пример. Это должно быть действительно:

var List = []; // ordered list contains data at odd indexes.
var getObject = function(id) {
    for (var i = 1; i < List.length; i+=2) {
        if (id === List[i].getId()) {
            return List[i];
        }
    }
    // returns undefined by default
}

Ваш алгоритм ошибочен, потому что вы проверяете даже индексы (даже если вы там ничего не знаете), и вы также злоупотребляете null как возвращаемое значение.

Эти функции должны действительно возвращать undefined, потому что это означает: нет таких данных

И там вы находитесь в центре проблемы. Если вы не полностью понимаете null и undefined и иногда можете использовать их неправильно, как вы можете быть уверены, что другие будут использовать его правильно? Вы не можете.

Тогда есть Host objects с их неприятным поведением, если вы спросите меня, вам лучше проверить их. На самом деле это не повредит, это избавляет вас от некоторых головных болей, связанных с сторонним кодом, или с указанными non-native объектами.

За исключением этих двух случаев, в вашем собственном коде вы можете сделать то, что @bobince сказал:

Храните undefined в качестве специального значения для сигнализации, когда другие языки могут вместо этого генерировать исключение.

Ответ 8

Когда устанавливать/использовать их...

Обратите внимание, что метод без оператора return возвращает undefined, вы не должны принуждать его к ожидаемому ответу, если вы используете его в методе, который всегда должен возвращать значение, тогда он должен представлять внутреннее состояние ошибки.

Используйте значение null для преднамеренного или неответного ответа.


Что касается того, как/когда проверять...

undefined, null, 0, пустая строка, NaN и false будут FALSE через принуждение. Они известны как "ложные" значения... все остальное верно.

Ваш лучший выбор - принуждение, а затем тестирование допустимых значений исключений...


var something; //undefined

something = !!something; //something coerced into a boolean

//true if false, null, NaN or undefined
function isFalsish(value) {
  return (!value && value !== "" && value !== 0);
}

//get number or default
function getNumber(val, defaultVal) {
  defaultVal = isFalsish(defaultVal) ? 0 : defaultVal;
  return (isFalsish(val) || isNaN(val)) ? defaultVal : +val;
}

Числовое тестирование является реальным bugger, так как true, false и null могут быть принудительно введены в число, а 0 - к false.

Ответ 9

Я рассмотрел бы их как 2 совершенно разных значения и проверил бы тот, который, как вы знаете, может произойти.

Если вы проверяете, было ли что-то еще присвоено значение, проверьте undefined.

Если вы проверяете, является ли это значение "ничего", установите флажок "null"

Немного надуманный пример:

Скажите, что у вас есть серия запросов ajax, и вы морально против использования обратных вызовов, поэтому у вас есть тайм-аут, который проверяет их завершение.

Ваша проверка будет выглядеть примерно так:

if (result !== undefined){
    //The ajax requests have completed
    doOnCompleteStuff();
    if (result !== null){
        //There is actually data to process
        doSomething(result);
    }
}

TL;DR; Это два разных значения, undefined означает, что значение не указано, null означает, что значение было задано, но значение "ничего".