Проверка 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 может быть любого использования.
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