ChatGPT解决这个技术问题 Extra ChatGPT

如何在 JavaScript 中检查 null 值?

如何检查 JavaScript 中的空值?我写了下面的代码,但是没有用。

if (pass == null || cpass == null || email == null || cemail == null || user == null) {      

    alert("fill all columns");
    return false;  

}   

以及如何在我的 JavaScript 程序中找到错误?

您确定您正在测试的值实际上是 null 而不仅仅是空字符串吗?
在 js 中测试 null 应该使用严格的操作符 ===
@davin - 是的,但不是这里的问题,因为如果是这样,该声明仍然有效。
@cwolves,如果我认为这是问题所在,我会将该评论作为答案。看看我的措辞,我显然是在参考 OP 的实践对语言做出一般性声明,而不是提议这可以解决他的问题。
@TRiG 提议的更改从根本上改变了问题的性质,以至于答案(不仅仅是我的)失去了上下文并且没有意义。编辑应该只是评论。

R
Ryan M

JavaScript 在检查“null”值方面非常灵活。我猜您实际上是在寻找空字符串,在这种情况下,这个更简单的代码将起作用:

if(!pass || !cpass || !email || !cemail || !user){

它将检查空字符串 ("")、nullundefinedfalse 以及数字 0NaN

请注意,如果您专门检查数字,则使用此方法会遗漏 0 是一个常见错误,并且首选 num !== 0(或 num !== -1~num(也检查 -1 的黑客代码) )) 对于返回 -1 的函数,例如 indexOf)。


了解该测试的哪些部分对应哪些值将非常有用。有时你会特别寻找一个。
有点迟到的声明,但是是的,您可以对每个 @inorganik 进行测试,请参阅下面的答案
读者,在对数值数据使用这种类型的测试时请小心。不要使用 !!! 在典型数字数据上测试 nullundefined,除非您还想丢弃 0 值。
答案本身说明了这一点:“......和数字0......”。我相信这个答案非常适合给定上下文(我推断是“用户名、密码、电子邮件”)的问题,他们没有检查 0 值。然而,鉴于这个问题和答案的受欢迎程度,我同意在答案本身中值得一提。
@zyklus 即使他询问用户名和密码,函数也可能会从表单中收集数据并在找到空字符串时返回 null。但更重要的是,Stack Overflow 问题一直作为 google 搜索结果出现,所以很多好奇如何检查 null 值的人会被引导到这里,并会首先看到你的答案。最好回答所提出的问题,然后解决此代码的细节。抱歉,如果这让您感到不安,那么当我对答案投反对票时,我会要求我发表评论,所以我正在这样做。
i
isherwood

要特别检查 null,您将使用以下命令:

if (variable === null)

此测试将通过 null,而不会通过 ""undefinedfalse0NaN

此外,我为每个“类似假”的值提供了绝对检查(对于 !variable 将返回真值)。

请注意,对于某些绝对检查,您需要实现使用 absolutely equals: ===typeof

I've created a JSFiddle here to show all of the individual tests working

以下是每次检查的输出:

Null Test:

if (variable === null)

- variable = ""; (false) typeof variable = string

- variable = null; (true) typeof variable = object

- variable = undefined; (false) typeof variable = undefined

- variable = false; (false) typeof variable = boolean

- variable = 0; (false) typeof variable = number

- variable = NaN; (false) typeof variable = number



Empty String Test:

if (variable === '')

- variable = ''; (true) typeof variable = string

- variable = null; (false) typeof variable = object

- variable = undefined; (false) typeof variable = undefined

- variable = false; (false) typeof variable = boolean

- variable = 0; (false) typeof variable = number

- variable = NaN; (false) typeof variable = number




Undefined Test:

if (typeof variable == "undefined")

-- or --

if (variable === undefined)

- variable = ''; (false) typeof variable = string

- variable = null; (false) typeof variable = object

- variable = undefined; (true) typeof variable = undefined

- variable = false; (false) typeof variable = boolean

- variable = 0; (false) typeof variable = number

- variable = NaN; (false) typeof variable = number



False Test:

if (variable === false)

- variable = ''; (false) typeof variable = string

- variable = null; (false) typeof variable = object

- variable = undefined; (false) typeof variable = undefined

- variable = false; (true) typeof variable = boolean

- variable = 0; (false) typeof variable = number

- variable = NaN; (false) typeof variable = number



Zero Test:

if (variable === 0)

- variable = ''; (false) typeof variable = string

- variable = null; (false) typeof variable = object

- variable = undefined; (false) typeof variable = undefined

- variable = false; (false) typeof variable = boolean

- variable = 0; (true) typeof variable = number

- variable = NaN; (false) typeof variable = number



NaN Test:

if (typeof variable == 'number' && !parseFloat(variable) && variable !== 0)

-- or --

if (isNaN(variable))

- variable = ''; (false) typeof variable = string

- variable = null; (false) typeof variable = object

- variable = undefined; (false) typeof variable = undefined

- variable = false; (false) typeof variable = boolean

- variable = 0; (false) typeof variable = number

- variable = NaN; (true) typeof variable = number

如您所见,针对 NaN 进行测试要困难一些;


如果使用 === 严格相等,类型检查的目的是什么?谢谢。同样对于 NaN 测试,您可以使用 isNaN(value),仅当变量等于 NaN 时才会返回 true
是否存在 variable === null 但不是“对象”类型的情况?如果没有,为什么不将检查简化为 variable === null,去掉第二个连词?谢谢。
@HunanRostomyan 好问题,老实说,不,我认为没有。使用我刚刚测试过的 variable === null here in this JSFiddle,您很可能足够安全。我也使用了`&&的原因typeof variable === 'object'` 不仅是为了说明一个有趣的事实,即 null 值是 typeof object,而且是为了与其他检查的流程保持一致。但是,是的,总而言之,您可以安全地使用 variable === null
jsfiddle.net/neoaptt/avt1cgem/1 这是分解为函数的答案。不是很有用,但我还是做了。
我要做的事情几乎从来都不是一个好主意:更改此答案中的代码。具体来说,在检查 null 时,删除对类型对象完全不必要的测试。这是一个基本的代码片段:即使是一个初学者错误地知道他们需要做那个冗长的测试也不是一个好主意。
i
ic3b3rg

只需在所有地方将 == 替换为 === 即可。

== 是松散或抽象的相等比较

=== 是严格的相等比较

有关更多详细信息,请参阅关于 Equality comparisons and sameness 的 MDN 文章。


这仅在您认为 undefined 不是 null 时才有效。否则会导致很多意想不到的行为。通常,如果您对 null/undefined 感兴趣,但对虚假值不感兴趣,则使用 ==(您应该这样做的少数情况之一)。
@AndrewMao undefined 不是 nullstackoverflow.com/a/5076962/753237
我相信这就是@AndrewMao 所说的,真的。他的第一句话可能会被改写为“这只适用于 undefined 和 null 不是实际等价物的情况。”
@BobRodes 感谢您澄清我糟糕的写作,我很感激 :)
@AndrewMao 非常欢迎您。我个人不会说你的写作很差。我会说这比平均水平要好很多。 :)
A
Arshid KV

严格相等运算符:-

我们可以通过 === 检查 null

if ( value === null ){

}

只需使用 if

if( value ) {

}

如果 value 不是,将评估为 true:

无效的

不明确的

空字符串 ("")

错误的

0


K
Kamil Kiełczewski

您可以检查某个值是否为空,如下所示

[pass,cpass,email,cemail,user].some(x=> x===null) 

让通过=1;让 cpass=2;让电子邮件=3;让cemail=null;让用户=5; if ( [pass,cpass,email,cemail,user].some(x=> x===null) ) { alert("fill all columns"); //返回假; }

奖励:为什么 ===== (source) 更清楚

== b

https://i.stack.imgur.com/nkpj6.png

a === b

https://i.stack.imgur.com/7MeG6.png


很棒的 2 个图表,我冒昧地将它们合并:docs.google.com/drawings/d/…
除了上面的2个图表。虽然 if ([] == false) 为真(如图所示),但 if ([]) 的计算结果也为真。
b
bvdb

乍一看,它看起来像是覆盖范围和严格性之间的简单权衡。

== 覆盖多个值,可以用更少的代码处理更多的场景。

=== 是最严格的,这使得它可以预测。

可预测性总是胜出,这似乎使 === 成为一种万能的解决方案。

https://i.stack.imgur.com/SXRVY.png

但这是错误的。尽管 === 是可预测的,但它确实并非总是产生可预测的代码,因为它忽略了场景。

const options = { };
if (options.callback !== null) {
  options.callback();      // error --> callback is undefined.
}

一般 == 对空值检查的工作更具可预测性:

通常, null 和 undefined 都意味着同一件事:“缺少某些东西”。为了可预测性,您需要检查这两个值。然后 == null 做得很好,因为它恰好涵盖了这两个值。 (即 == null 等价于 === null && === undefined)

在特殊情况下,您确实希望明确区分 null 和 undefined。在这些情况下,您最好使用严格的 === undefined 或 === null。 (例如,缺失/忽略/跳过和空/清除/删除之间的区别。)但这种情况很少见。

这不仅很少见,而且是要避免的。您不能将 undefined 存储在传统数据库中。由于互操作性的原因,您也不应该在 API 设计中依赖 undefined 值。但即使您根本不区分,您也不能假设 undefined 不会发生。我们周围的人都间接地采取了概括 null/undefined这就是为什么像 this 这样的问题被关闭为“有意见”。)。

所以,回到你的问题。使用 == null 没有任何问题。它确实做了它应该做的事情。

// FIX 1 --> yes === is very explicit
const options = { };
if (options.callback !== null && 
    options.callback !== undefined) {
  options.callback();
}


// FIX 2 --> but == covers both
const options = { };
if (options.callback != null) {
  options.callback();
}

// FIX 3 --> optional chaining also covers both.
const options = { };
options.callback?.();

D
Deekshith

通过显式检查 null 但使用简化的语法来改进已接受的答案:

if ([pass, cpass, email, cemail, user].every(x=>x!==null)) {
    // your code here ...
}

// 测试 let pass=1, cpass=1, email=1, cemail=1, user=1; // 只是为了测试 if ([pass, cpass, email, cemail, user].every(x=>x!==null)) { // 你的代码在这里 ... console.log ("Yayy! None of them为空"); } else { console.log ("哎呀!至少其中一个是空的"); }


N
Nikhil Agrawal

首先,你有一个没有函数体的 return 语句。这很有可能会引发错误。

进行检查的一种更清洁的方法是简单地使用 !操作员:

if (!pass || !cpass || !email || !cemail || !user) {

    alert("fill all columns");

}

该代码可能在一个函数中,他只是没有显示它;)
N
Nikhil Agrawal

你终于可以使用 try catch

 try {
     document.getElementById("mydiv").innerHTML = 'Success' //assuming "mydiv" is undefined
 } catch (e) {

     if (e.name.toString() == "TypeError") //evals to true in this case
     //do something

 } finally {}   

您还可以throw您自己的错误。请参阅this


我认为这符合“偏执”代码。如果你真的写了这样的东西,那就是理解“mydiv”不可能不存在。除非我们确信是这种情况,否则我们不应该使用此代码,并且我们有很多途径,例如响应代码,以确保我们在尝试这样的线路之前有信心。
不要使用 try 和 catch 进行控制流。这不是一个好的解决方案。
M
Michael Laszlo

在 JavaScript 中,没有字符串等于 null

pass 为空字符串时,您可能希望 pass == null 为真,因为您知道松散相等运算符 == 执行某些类型的强制转换。

例如,这个表达式为真:

'' == 0

相反,严格相等运算符 === 表示这是错误的:

'' === 0

鉴于 ''0 大致相等,您可以合理地推测 ''null 大致相等。但是,它们不是。

这个表达式是错误的:

'' == null

将任何字符串与 null 进行比较的结果都是错误的。因此,pass == null 和所有其他测试总是错误的,用户永远不会收到警报。

要修复您的代码,请将每个值与空字符串进行比较:

pass === ''

如果您确定 pass 是一个字符串,那么 pass == '' 也可以工作,因为只有一个空字符串松散地等于空字符串。另一方面,一些专家表示,在 JavaScript 中始终使用严格相等是一种很好的做法,除非您特别想要执行松散相等运算符执行的类型强制。

如果您想知道哪些值对松散相等,请参阅 Mozilla article on this topic 中的表“相同性比较”。


S
Sunny Patel

要在 javascript 中检查 undefined 和 null,您只需编写以下内容:

if (!var) {
        console.log("var IS null or undefined");
} else {
        console.log("var is NOT null or undefined");
}

!var 对于 0、""、NaN 和 false 也是 true。
N
Naeem Baghi

实际上,我认为您可能需要使用 if (value !== null && value !== undefined),因为如果您使用 if (value),您还可以过滤 0 或 false 值。

考虑这两个函数:

const firstTest = value => {
    if (value) {
        console.log('passed');
    } else {
        console.log('failed');
    }
}
const secondTest = value => {
    if (value !== null && value !== undefined) {
        console.log('passed');
    } else {
        console.log('failed');
    }
}

firstTest(0);            // result: failed
secondTest(0);           // result: passed

firstTest(false);        // result: failed
secondTest(false);       // result: passed

firstTest('');           // result: failed
secondTest('');          // result: passed

firstTest(null);         // result: failed
secondTest(null);        // result: failed

firstTest(undefined);    // result: failed
secondTest(undefined);   // result: failed

在我的情况下,我只需要检查值是否为 null 和未定义,并且我不想过滤 0false'' 值。所以我使用了第二个测试,但您可能也需要过滤它们,这可能会导致您使用第一个测试。


value !== null || value !== undefined 始终为真。我认为您的意思是value !== null && value !== undefined。这实际上与 value != null 相同(准确检查 null 和 undefined。)
@bvdb 抱歉,在代码中我使用了正确的表达式,但在那里我忘记了:-DI 已修复它,谢谢。
G
Gabriel

这是对 WebWanderer 关于检查 NaN 的解决方案的评论(我还没有足够的代表来发表正式评论)。解决方案读作

if(!parseInt(variable) && variable != 0 && typeof variable === "number")

但这对于四舍五入为 0 的有理数(例如 variable = 0.1)将失败。更好的测试是:

if(isNaN(variable) && typeof variable === "number")

感谢您指出错误 Gabriel,我已将修复程序放入我的答案中。除此之外,我能够通过将 parseInt 更改为 parseFloat 来修复测试(这对我来说应该是显而易见的)。我避免使用 isNan 函数,因为我觉得许多开发人员将诸如 isNaN 之类的函数视为某种“魔法盒子”,值进入并从中出来,我想进一步测试一下深入。但是,是的,您建议的测试将起作用并且完全可以使用。抱歉直到现在才注意到你的帖子。
太好了,这似乎有效。感谢您对为什么也避免使用 isNaN 的评论,我可以理解这个逻辑。还有 Underscore.js 方法,它看起来更令人困惑/黑盒,但无论如何值得注意,因为它利用了 NaN !== NaNObject.prototype.toString.call(variable) === '[object Number]' && variable !== +variable
M
Mark Rotteveel

您可以使用 lodash 模块来检查值是否为空或未定义

_.isNil(value)
Example 

 country= "Abc"
    _.isNil(country)
    //false

   state= null
    _.isNil(state)
    //true

city= undefined
    _.isNil(state)
    //true

   pin= true
    _.isNil(pin)
    // false   

参考链接:https://lodash.com/docs/#isNil


T
ToolmakerSteve

JAVASCRIPT 中的 AFAIK 当变量被声明但没有赋值时,其类型为 undefined。所以我们可以检查变量,即使它是一个 object 持有一些 instance 代替 value

创建一个辅助方法来检查返回 true 的空值并在您的 API 中使用它。

检查变量是否为空的辅助函数:

function isEmpty(item){
    if(item){
        return false;
    }else{
        return true;
    }
}

try-catch 异常 API 调用:

try {

    var pass, cpass, email, cemail, user; // only declared but contains nothing.

    // parametrs checking
    if(isEmpty(pass) || isEmpty(cpass) || isEmpty(email) || isEmpty(cemail) || isEmpty(user)){
        console.log("One or More of these parameter contains no vlaue. [pass] and-or [cpass] and-or [email] and-or [cemail] and-or [user]");
    }else{
        // do stuff
    }

} catch (e) {
    if (e instanceof ReferenceError) {
        console.log(e.message); // debugging purpose
        return true;
    } else {
        console.log(e.message); // debugging purpose
        return true;
    }
}

一些测试用例:

var item = ""; // isEmpty? true
var item = " "; // isEmpty? false
var item; // isEmpty? true
var item = 0; // isEmpty? true
var item = 1; // isEmpty? false
var item = "AAAAA"; // isEmpty? false
var item = NaN; // isEmpty? true
var item = null; // isEmpty? true
var item = undefined; // isEmpty? true

console.log("isEmpty? "+isEmpty(item));

什么?这个答案与这篇文章无关。您是否偶然在此线程上发布了此答案?
isEmpty 函数的行为与 ! 完全相同。无需发明功能。只需执行 if (!pass || !cpass || !email ...)。 (已在接受的答案中显示。)根据 WebWanderer 的评论,这篇文章的中间部分“try-catch exception API call”似乎与这个问题无关。请解释您的意图 - 什么时候有用?这与问题有什么关系?
T
Tarmo Saluste

我找到了另一种测试值是否为空的方法:

if(variable >= 0 && typeof variable === "object")

null 同时充当 numberobject。比较 null >= 0null <= 0 得出 true。比较 null === 0null > 0null < 0 将导致错误。但由于 null 也是一个对象,我们可以将其检测为空值。

我做了一个更复杂的函数,natureofwitch 会比 typeof 做得更好,并且可以被告知要包含或保持分组的类型

/* function natureof(variable, [included types]) 包含的类型为 null - null 将导致“未定义”,或者如果包含,将导致“null” NaN - NaN 将导致“未定义”,或者如果包含,将导致“NaN” -infinity - 将负 -Inifity 与“Infinity”数字分开 - 将数字拆分为“int”或“double”数组 - 将“array”与“object”分开 空 - 空“字符串”将导致“空” " 或 empty=undefined - 空的 "string" 将导致 "undefined" */ function natureof(v, ...types){ /*null*/ if(v === null) return types.includes('null' ) ? “空”:“未定义”; /*NaN*/ if(typeof v == "number") return (isNaN(v)) ?类型.includes('NaN') ? "NaN" : "undefined" : /*-infinity*/ (v+1 === v) ? (types.includes('-infinity') && v === Number.NEGATIVE_INFINITY) ? “-infinity”:“infinity”:/*number*/(types.includes('number'))? (数字.isInteger(v))? “int”:“双”:“数字”; /*array*/ if(typeof v == "object") return (types.includes('array') && Array.isArray(v)) ? “数组”:“对象”; /*空*/ if(typeof v == "string") return (v == "") ? types.includes('empty') ? "empty" : /*empty=undefined*/ types.includes('empty=undefined') ? “未定义”:“字符串”:“字符串”; else return typeof v } // DEMO let types = [null, "", "string", undefined, NaN, Infinity, -Infinity, false, "false", true, "true", 0, 1, -1, 0.1 , "test", {var:1}, [1,2], {0: 1, 1: 2, length: 2}] for(i in types){ console.log("natureof", types[i] , " = ", natureof(types[i], "null", "NaN", "-infinity", "number", "array", "empty=undefined")) }


N
Neithan Max

我做了这个非常简单的函数,它可以创造奇迹:

function safeOrZero(route) {
  try {
    Function(`return (${route})`)();
  } catch (error) {
    return 0;
  }
  return Function(`return (${route})`)();
}

路线是可以爆炸的任何价值链。我将它用于 jQuery/cheerio 和对象等。

示例 1:一个简单的对象,例如这个 const testObj = {items: [{ val: 'haya' }, { val: null }, { val: 'hum!' }];};

但它可能是一个我们甚至还没有制造的非常大的物体。所以我通过它:

let value1 = testobj.items[2].val;  // "hum!"
let value2 = testobj.items[3].val;  // Uncaught TypeError: Cannot read property 'val' of undefined

let svalue1 = safeOrZero(`testobj.items[2].val`)  // "hum!"
let svalue2 = safeOrZero(`testobj.items[3].val`)  // 0

当然,如果您愿意,可以使用 null'No value'... 任何适合您的需要。

通常,如果找不到 DOM 查询或 jQuery 选择器,可能会抛出错误。但是使用类似的东西:

const bookLink = safeOrZero($('span.guidebook > a')[0].href);
if(bookLink){
  [...]
}

P
Pit

与操作员进行可选检查怎么样?

例如:

// check mother for null or undefined and 
// then if mother exist check her children also
// this 100% sure it support and valid in JS today.
// Apart of that C# have almost the same operator using the same way
if (mother?.children) {

}
else {
 // it is null, undefined, etc...

}

T
THX-1138

尝试这个:

if (!variable && typeof variable === "object") {
    // variable is null
}

null 只是“虚假”的东西,而 typeof 返回“对象”。
这比 if (variable === null) 好多少?去年也有人提供了这个答案:stackoverflow.com/a/27550756/218196
C
Codiee

如果布尔值来自 DB for ex,这将不起作用:

 value = false

 if(!value) {
   // it will change all false values to not available
   return "not available"
 }

P
P-S

检查错误条件:

// Typical API response data
let data = {
  status: true,
  user: [],
  total: 0,
  activity: {sports: 1}
}

// A flag that checks whether all conditions were met or not
var passed = true;

// Boolean check
if (data['status'] === undefined || data['status'] == false){
  console.log("Undefined / no `status` data");
  passed = false;
}

// Array/dict check
if (data['user'] === undefined || !data['user'].length){
  console.log("Undefined / no `user` data");
  passed = false;
}

// Checking a key in a dictionary
if (data['activity'] === undefined || data['activity']['time'] === undefined){
   console.log("Undefined / no `time` data");
   passed = false;
}

// Other values check
if (data['total'] === undefined || !data['total']){
  console.log("Undefined / no `total` data");
  passed = false;
}

// Passed all tests?
if (passed){
  console.log("Passed all tests");
}

A
Amr Omar

空值的简单解决方案:

function isEmpty(value) {
        return (
            value === null || value === undefined || value === '' ||
            (Array.isArray(value) && value.length === 0) ||
            (!(value instanceof Date) && typeof value === 'object' && Object.keys(value).length === 0)
        );
    }