如何检查 JavaScript 中的空值?我写了下面的代码,但是没有用。
if (pass == null || cpass == null || email == null || cemail == null || user == null) {
alert("fill all columns");
return false;
}
以及如何在我的 JavaScript 程序中找到错误?
null
应该使用严格的操作符 ===
JavaScript 在检查“null”值方面非常灵活。我猜您实际上是在寻找空字符串,在这种情况下,这个更简单的代码将起作用:
if(!pass || !cpass || !email || !cemail || !user){
它将检查空字符串 (""
)、null
、undefined
、false
以及数字 0
和 NaN
。
请注意,如果您专门检查数字,则使用此方法会遗漏 0
是一个常见错误,并且首选 num !== 0
(或 num !== -1
或 ~num
(也检查 -1
的黑客代码) )) 对于返回 -1
的函数,例如 indexOf
)。
要特别检查 null,您将使用以下命令:
if (variable === null)
此测试将仅通过 null
,而不会通过 ""
、undefined
、false
、0
或 NaN
。
此外,我为每个“类似假”的值提供了绝对检查(对于 !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
,去掉第二个连词?谢谢。
variable === null
here in this JSFiddle,您很可能足够安全。我也使用了`&&的原因typeof variable === 'object'` 不仅是为了说明一个有趣的事实,即 null
值是 typeof object
,而且是为了与其他检查的流程保持一致。但是,是的,总而言之,您可以安全地使用 variable === null
。
只需在所有地方将 ==
替换为 ===
即可。
==
是松散或抽象的相等比较
===
是严格的相等比较
有关更多详细信息,请参阅关于 Equality comparisons and sameness 的 MDN 文章。
undefined
不是 null
时才有效。否则会导致很多意想不到的行为。通常,如果您对 null
/undefined
感兴趣,但对虚假值不感兴趣,则使用 ==
(您应该这样做的少数情况之一)。
严格相等运算符:-
我们可以通过 ===
检查 null
if ( value === null ){
}
只需使用 if
if( value ) {
}
如果 value 不是,将评估为 true:
无效的
不明确的
钠
空字符串 ("")
错误的
0
您可以检查某个值是否为空,如下所示
[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
if ([] == false)
为真(如图所示),但 if ([])
的计算结果也为真。
乍一看,它看起来像是覆盖范围和严格性之间的简单权衡。
== 覆盖多个值,可以用更少的代码处理更多的场景。
=== 是最严格的,这使得它可以预测。
可预测性总是胜出,这似乎使 ===
成为一种万能的解决方案。
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?.();
通过显式检查 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 ("哎呀!至少其中一个是空的"); }
首先,你有一个没有函数体的 return 语句。这很有可能会引发错误。
进行检查的一种更清洁的方法是简单地使用 !操作员:
if (!pass || !cpass || !email || !cemail || !user) {
alert("fill all columns");
}
你终于可以使用 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。
在 JavaScript 中,没有字符串等于 null
。
当 pass
为空字符串时,您可能希望 pass == null
为真,因为您知道松散相等运算符 ==
执行某些类型的强制转换。
例如,这个表达式为真:
'' == 0
相反,严格相等运算符 ===
表示这是错误的:
'' === 0
鉴于 ''
和 0
大致相等,您可以合理地推测 ''
和 null
大致相等。但是,它们不是。
这个表达式是错误的:
'' == null
将任何字符串与 null
进行比较的结果都是错误的。因此,pass == null
和所有其他测试总是错误的,用户永远不会收到警报。
要修复您的代码,请将每个值与空字符串进行比较:
pass === ''
如果您确定 pass
是一个字符串,那么 pass == ''
也可以工作,因为只有一个空字符串松散地等于空字符串。另一方面,一些专家表示,在 JavaScript 中始终使用严格相等是一种很好的做法,除非您特别想要执行松散相等运算符执行的类型强制。
如果您想知道哪些值对松散相等,请参阅 Mozilla article on this topic 中的表“相同性比较”。
要在 javascript 中检查 undefined 和 null,您只需编写以下内容:
if (!var) {
console.log("var IS null or undefined");
} else {
console.log("var is NOT null or undefined");
}
实际上,我认为您可能需要使用 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 和未定义,并且我不想过滤 0
或 false
或 ''
值。所以我使用了第二个测试,但您可能也需要过滤它们,这可能会导致您使用第一个测试。
value !== null || value !== undefined
始终为真。我认为您的意思是value !== null && value !== undefined
。这实际上与 value != null
相同(准确检查 null 和 undefined。)
这是对 WebWanderer 关于检查 NaN 的解决方案的评论(我还没有足够的代表来发表正式评论)。解决方案读作
if(!parseInt(variable) && variable != 0 && typeof variable === "number")
但这对于四舍五入为 0
的有理数(例如 variable = 0.1
)将失败。更好的测试是:
if(isNaN(variable) && typeof variable === "number")
parseInt
更改为 parseFloat
来修复测试(这对我来说应该是显而易见的)。我避免使用 isNan
函数,因为我觉得许多开发人员将诸如 isNaN
之类的函数视为某种“魔法盒子”,值进入并从中出来,我想进一步测试一下深入。但是,是的,您建议的测试将起作用并且完全可以使用。抱歉直到现在才注意到你的帖子。
isNaN
的评论,我可以理解这个逻辑。还有 Underscore.js 方法,它看起来更令人困惑/黑盒,但无论如何值得注意,因为它利用了 NaN !== NaN
。 Object.prototype.toString.call(variable) === '[object Number]' && variable !== +variable
您可以使用 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
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”似乎与这个问题无关。请解释您的意图 - 什么时候有用?这与问题有什么关系?
我找到了另一种测试值是否为空的方法:
if(variable >= 0 && typeof variable === "object")
null
同时充当 number
和 object
。比较 null >= 0
或 null <= 0
得出 true
。比较 null === 0
或 null > 0
或 null < 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")) }
我做了这个非常简单的函数,它可以创造奇迹:
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){
[...]
}
与操作员进行可选检查怎么样?
例如:
// 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...
}
尝试这个:
if (!variable && typeof variable === "object") {
// variable is null
}
if (variable === null)
好多少?去年也有人提供了这个答案:stackoverflow.com/a/27550756/218196。
如果布尔值来自 DB for ex,这将不起作用:
value = false
if(!value) {
// it will change all false values to not available
return "not available"
}
检查错误条件:
// 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");
}
空值的简单解决方案:
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)
);
}
不定期副业成功案例分享
!
或!!
在典型数字数据上测试null
或undefined
,除非您还想丢弃 0 值。0
......”。我相信这个答案非常适合给定上下文(我推断是“用户名、密码、电子邮件”)的问题,他们没有检查0
值。然而,鉴于这个问题和答案的受欢迎程度,我同意在答案本身中值得一提。