Проверка JavaScript null



я наткнулся на следующий код:



function (data) {
if (data != null && data !== undefined) {
// some code here
}
}


Я несколько новичок в JavaScript, но, из других вопросов, которые я читал здесь, у меня сложилось впечатление, что этот код не имеет большого смысла.






В частности, в этом ответе говорится, что



вы получите сообщение об ошибке при доступе к неопределенной переменной в любом контексте, кроме typeof.




обновление: в (цитата) ответ выше может ввести в заблуждение. Он должен сказать "необъявленная переменная", вместо "неопределенная переменная".



как я узнал, в ответах от Райан ♦,maerics и nwellnhof, даже если функция не имеет аргументов, ее переменные для Аргументов всегда объявляются. Этот факт также доказывает неправильность первого пункта в списке ниже.





от насколько я понимаю, могут возникнуть следующие сценарии:




  • эта функция была вызвана без аргументов, что делает data неопределенная переменная и вызывает ошибку на data != null.


  • эта функция была вызвана специально с null (или undefined), как его аргумент, в этом случае data != null уже защищает внутренний код перевода && data !== undefined бесполезно.


  • функции вызывается с ненулевым аргументом, в этом случае он будет тривиально передавать оба data != nullиdata !== undefined.



Q: правильно ли я понимаю?





Я пробовал следующее, в консоли Firefox:



--
[15:31:31.057] false != null
[15:31:31.061] true
--
[15:31:37.985] false !== undefined
[15:31:37.989] true
--
[15:32:59.934] null != null
[15:32:59.937] false
--
[15:33:05.221] undefined != null
[15:33:05.225] false
--
[15:35:12.231] "" != null
[15:35:12.235] true
--
[15:35:19.214] "" !== undefined
[15:35:19.218] true


Я не могу понять случай, когда data !== undefinedпослеdata != null может быть любого использования.

727   7  

7 ответов:

"неопределенная переменная" отличается от значения undefined.

неопределенная переменная:

var a;
alert(b); // ReferenceError: b is not defined

переменная со значением undefined:

var a;
alert(a); // Alerts “undefined”

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

В JavaScript null - это специальный одноэлементный объект, который полезен для сигнализации "нет значения". Вы можете проверить его по сравнению и, как обычно в JavaScript, это хорошая практика, чтобы использовать === оператор, чтобы избежать путаницы типа принуждения:

var a = null;
alert(a === null); // true

как упоминает @rynah," undefined " немного запутан в JavaScript. Тем не менее, это всегда безопасно, чтобы проверить, если typeof(x) - это строка "undefined", даже если" x " не является объявленной переменной:

alert(typeof(x) === 'undefined'); // true

также, переменные могут иметь "неопределенное значение", если они не инициализированы:

var y;
alert(typeof(y) === 'undefined'); // true

складывая все это вместе, ваш чек должен выглядеть так:

if ((typeof(data) !== 'undefined') && (data !== null)) {
  // ...

однако, поскольку переменная " данные "всегда определена, поскольку это формальный параметр функции, использование оператора" typeof "не требуется, и вы можете безопасно сравнивать непосредственно с"неопределенным значением".

function(data) {
  if ((data !== undefined) && (data !== null)) {
    // ...

этот фрагмент означает "если функция была вызвана с аргументом, который определено и не является нулем..."

Q: функция была вызвана без аргументов, что делает данные неопределенной переменной и вызывает ошибку в данных != недействительный.

A: да data будет установлено значение undefined. Смотрите раздел 10.5 объявление привязки экземпляра спец. Но доступ к неопределенному значению не вызывает ошибки. Вероятно, вы путаете это с доступом к необъявленной переменной в строгом режиме, которая вызывает ошибка.

Q: функция была вызвана специально с null (или undefined), как ее аргумент, в этом случае данные != null уже защищает внутренний код, рендеринг и данные! = = неопределенный бесполезно.

Q: функция была вызвана с ненулевым аргументом, и в этом случае она будет тривиально передавать оба данных != нуль и данные !== неопределенный.

A: правильно. Обратите внимание, что следующие тесты эквивалент:

data != null
data != undefined
data !== null && data !== undefined

посмотреть раздел 11.9.3 алгоритм сравнения абстрактного равенства и раздел 11.9.6 алгоритм сравнения строгого равенства спец.

Я думаю, тестирование переменных для значений, которые вы не ожидаете, не является хорошей идеей в целом. Потому что тест как Ваш можно рассматривать как написание черного списка запрещенных значений. Но что делать, если вы забыли перечислить все запрещенные ценности? Кто-то, даже вы, может взломать ваш код с передачей неожиданного значения. Поэтому более подходящим подходом является что - то вроде белого списка-тестирование переменных только для ожидаемых значений, а не неожиданных. Например, если вы ожидаете, что значение должно быть строкой, вместо этого:

function (data) {
  if (data != null && data !== undefined) {
    // some code here
    // but what if data === false?
    // or data === '' - empty string?
  }
}

сделать что-то вроде этого:

function (data) {
  if (typeof data === 'string' && data.length) {
    // consume string here, it is here for sure
    // cleaner, it is obvious what type you expect
    // safer, less error prone due to implicit coercion
  } 
}

typeof foo === "undefined" отличается от foo === undefined, никогда не путайте их. typeof foo === "undefined" это то, что вам действительно нужно. Кроме того, используйте !== на месте !=

таким образом, заявление может быть написано как

function (data) {
  if (typeof data !== "undefined" && data !== null) {
    // some code here
  }
}

Edit:

вы не можете использовать foo === undefined для необъявленных переменных.

var t1;

if(typeof t1 === "undefined")
{
  alert("cp1");
}

if(t1 === undefined)
{
  alert("cp2");
}

if(typeof t2 === "undefined")
{
  alert("cp3");
}

if(t2 === undefined) // fails as t2 is never declared
{
  alert("cp4");
}

самый простой способ сделать ваш тест :

function (data) {
    if (data) { // check if null, undefined, empty ...
        // some code here
    }
}
var a;
alert(a); //Value is undefined

var b = "Volvo"; 
alert(b); //Value is Volvo

var c = null;
alert(c); //Value is null

Comments

    Ничего не найдено.