是否有标准函数检查JavaScript中的null,undefined或空白变量?


2258

是否有一个通用的JavaScript函数检查一个变量的值,并确保它不undefined还是null?我有以下代码,但不确定是否涵盖所有情况:

function isEmpty(val){
    return (val === undefined || val == null || val.length <= 0) ? true : false;
}


78
Protip,永不做(truthy statement) ? true : false;。做吧(truthy statement);
David Baucum

5
@GeorgeJempty不是dup,因为另一个答案特别是关于字符串的,而这个答案是关于变量的
Madbreaks '18

2
这个问题的任何正确答案都完全取决于您如何定义“空白”。
Madbreaks '18

3
@Jay就执行代码而言,它没有任何伤害。太冗长了。您不会说:“您饿了是真的吗?” 您只是“饿了”,所以在代码中只说if (hungry) …而不是if (hungry === true) …。像所有以这种方式编码的东西一样,这只是一个口味问题。更具体地讲,OP提供的示例更加冗长地说:“如果为真,那么为真,如果不是,那么为假”。但是,如果它为真,则它已经为真。而且,如果它为假,则它已经为假。这类似于说“如果您饿了,那么您就饿了,否则,您就不饿了。”
David Baucum

Answers:


4376

您可以只检查变量是否具有truthy值。那意味着

if( value ) {
}

将计算为true,如果value不是

  • 空值
  • 未定义
  • N
  • 空字符串(“”)
  • 0

上面的列表表示falsyECMA- / Javascript中的所有可能值。在本节的规范中找到它ToBoolean

此外,如果您不知道变量是否存在(也就是说,是否已声明),则应与typeof运算符联系。例如

if( typeof foo !== 'undefined' ) {
    // foo could get resolved and it's defined
}

如果可以确定至少声明了一个变量,则应直接检查它是否具有truthy如上所示的值。

进一步阅读:http : //typeofnan.blogspot.com/2011/01/typeof-is-fast.html


110
如果该值是预期的错误布尔值,该怎么办。有时您想要在没有值的情况下提供默认值,如果传入了错误的布尔值,则该值将不起作用
。– TruMan1 2012年

99
@ TruMan1:在这种情况下(您的逻辑决定了验证),您必须像if( value || value === false )。所有虚假的值一样,我们需要明确地验证那些
jAndy 2012

28
除非value是一个数组。的解释truthy可能具有误导性。在那种情况下,我们应该检查value.length != 0一个非空数组。
用户

12
只是想补充一点,如果你觉得if结构在语法上是太重了,你可以使用三元运算符,就像这样:var result = undefined ? "truthy" : "falsy"。或者,如果您只想强制转换为布尔值,请使用!!运算符,例如!!1 // true!!null // false
KFL 2014年

7
另请注意,这不会检查仅包含空格字符的字符串。
Christophe Roussy 2014年

220

检查value是undefined还是null的详细方法是:

return value === undefined || value === null;

您还可以使用==运算符,但这希望人们知道所有规则

return value == null; // also returns true if value is undefined

33
仅检查nullundefined可以像这样进行检查: if (value == null)。注意==强迫的操作员。如果您这样检查if (value === null || value === undefined),您就会忘记/不知道Javascript是如何强制转换的。webreflection.blogspot.nl/2010/10/…–
Christiaan Westerbeek

32
@ChristiaanWesterbeek:您的观点与arg == null产生相同的结果arg === undefined || arg === null。但是,我认为后面的示例更具可读性。
Salman 2014年

10
arg == null以我的经验很常见。
布莱恩·唐宁

8
return value === (void 0)undefined遗憾的是,比进行测试更安全,因为测试可能是范围内的合法变量。
x0n

4
@Sharky未定义的变量和未声明的变量之间有区别:lucybain.com/blog/2014/null-undefined-uneclared
Christiaan Westerbeek

79
function isEmpty(value){
  return (value == null || value.length === 0);
}

这将返回true

undefined  // Because undefined == null

null

[]

""

和零参数函数,因为函数length是它所使用的已声明参数的数量。

要禁止使用后一种类别,您可能只需要检查空白字符串即可

function isEmpty(value){
  return (value == null || value === '');
}

7
undefined == null但是undefined !== null
伊恩·博伊德

2
@IanBoyd是因为您正在将==与===进行比较。这意味着undefined == null(true)undefined!= null(false)undefined === null(false)undefined!== null(true)最好提供更多信息,以便有所帮助并推动人们在正确的方向。在差异MOZ DOC developer.mozilla.org/en-US/docs/Web/JavaScript/...
科里年轻

43

这是最安全的支票,我还没有看到它完全像这样张贴在这里:

if (typeof value !== 'undefined' && value) {
    //deal with value'
};

它将涵盖从未定义过价值的情况,以及以下任何一种情况:

  • 空值
  • 未定义(未定义的值与从未定义的参数不同)
  • 0
  • “”(空字符串)
  • N

编辑:更改为严格相等(!==),因为目前为止这是标准;)


10
我没有投票,但是关于严格相等比较,一般规则是除非需要隐式类型转换,否则应使用严格比较。
J.Steve

2
感谢您的评论史蒂夫。该一般规则很好。我只是希望ppl能够理解为什么要使用其中一个。ppl的每一种显示方式都将很高兴向您传授“始终始终使用严格”的知识-就像它在Javascript中最重要的事情一样。我已经看到过很多类似if(val!== null)的情况,这些情况显然会导致不良结果。可以肯定地说,当有疑问时-使用严格,但最好不要有疑问。
guya 2013年

6
我认为这里的意思是我们希望typeof运算符返回一个字符串,因此使用严格的相等性检查在技术上更准确,更具体且更快捷。因此,确实,没有理由使用松散比较,而不是相反。同样val !== null是在许多情况下完全有效的-我做这一切的时候。我同意您的不合格论点,但我认为这是一个不好的例子。不试图欺骗你。
布莱恩·唐宁

感谢您的评论Bryan,您使用val!== null是因为您知道自己在做什么。初学者会希望回退到val虚假的时候。但是,val永远不会为null,它将是未定义的。如果他不听从“总是始终使用严格”的建议,那么他的bug将更少。我已经在生产代码中看到了这种情况。typeof总是返回一个字符串,速度差异将是多余的。因此,在上述情况下使用strict的唯一论据是一致性。我说过“不需要严格的平等”。这并不意味着您不能,或者如果它使您的代码更加一致。
Guya 2014年

28

您可能会发现以下功能有用:

function typeOf(obj) {
  return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase();
}

或在ES7中(如果有进一步改进,请评论)

function typeOf(obj) {
  const { toString } = Object.prototype;
  const stringified = obj::toString();
  const type = stringified.split(' ')[1].slice(0, -1);

  return type.toLowerCase();
}

结果:

typeOf(); //undefined
typeOf(null); //null
typeOf(NaN); //number
typeOf(5); //number
typeOf({}); //object
typeOf([]); //array
typeOf(''); //string
typeOf(function () {}); //function
typeOf(/a/) //regexp
typeOf(new Date()) //date
typeOf(new WeakMap()) //weakmap
typeOf(new Map()) //map

“请注意,绑定运算符(::)根本不是ES2016(ES7)的一部分,也不是ECMAScript标准的任何更高版本。它目前是引入该语言的阶段0(strawman)提议。” –西蒙·凯贝格(Simon Kjellberg)。作者希望对这个美丽的接受皇家提升的提议表示支持。


+1有助于了解类型 'regexp','array'和'function'的对象
Yash

@Vix,为什么ES7版本更好?
GollyJer

不是,正在尝试使用更具可读性的方式来表达相同的功能,方法是:分解分配,绑定运算符。
Vix

2
请注意,绑定运算符(::)根本不是ES2016(ES7)的一部分,也不是ECMAScript标准的任何更高版本。目前,该语言已被引入第0阶段(稻草人)提案。
西蒙·凯贝格

25

评分最高的第一个答案是错误的。如果值未定义,它将在现代浏览器中引发异常。您必须使用:

if (typeof(value) !== "undefined" && value)

要么

if (typeof value  !== "undefined" && value)

3
eee ...我认为这是错误的,因为if(value)足够(空对象/数组除外)。如果value为'undefined',则'if'配置不会通过。
Oskar Szura 2014年

3
这会使未定义的变量(在评估时抛出ReferenceError)变大,这与具有该undefined值的变量不同。
澳洲航空94重型

2
我在这里遇到了同样的错误。如果x未定义,则if(x),if(!x),if(!! x)都将引发错误。
shaosh 2015年

if(value === 0) gameOver(); ;)
Madbreaks '18

这个答案也是错误的,因为当value为零时返回false ,这不是 op所寻找的。
Madbreaks '18

17

此条件检查

if (!!foo) {
    //foo is defined
}

是你所需要的全部。


我认为这只是一个片段。但是if已经进行了伪造的检查,将其转换为布尔值。是否会遇到正常人if(foo)无法捕获的任何情况?
达恩·范·赫斯特

1
这非常适合当您需要内联的内容时,例如,当字符串不为空时,我需要一个true的react属性(称为active)-if语句会过分杀伤,因此我只能使用active={!!foo}
Ben Kolya Mansley

16

检查空字符串(“”),null,undefined,false以及数字0和NaN。说,如果字符串为空,var name = ""console.log(!name)返回true

function isEmpty(val){
  return !val;
}

如果val空,null,未定义,false,数字0或NaN,则此函数将返回true 。

要么

根据您的问题域,您可以仅使用like !val!!val


这实际上并不能说明变量是否为空,因为false和0可以是有效值,而不是空值。具有isEmpty函数的值将确保您期望为空的值返回true。在我看来,null,undefined,NaN和空字符串是有意义的值为空。
Corey Young

9
isEmpty(val)如果可以,为什么要使用!val
艾伦·利纳托茨

它是由你决定。您可以使用它来提高可读性。否则,如果你认为你的工作,他们更提前编码器的团队,那么你可以只使用!val或者!!val根据您的问题域。
Arif

15

我非常喜欢的解决方案:

让我们定义一个空白变量是nullundefined,或者如果它的长度是零,或者是一个对象,则没有键:

function isEmpty (value) {
  return (
    // null or undefined
    (value == null) ||

    // has length and it's zero
    (value.hasOwnProperty('length') && value.length === 0) ||

    // is an Object and has no keys
    (value.constructor === Object && Object.keys(value).length === 0)
  )
}

返回值:

  • 真: undefinednull""[]{}
  • 假: truefalse10-1"foo"[1, 2, 3]{ foo: 1 }

14

你有点过分了。要检查变量是否没有赋值,只需要检查undefined和null。

function isEmpty(value){
    return (typeof value === "undefined" || value === null);
}

假设0""和对象(甚至是空对象和数组)都是有效的“值”。


10

如果您喜欢普通的javascript,请尝试以下操作:

  /**
   * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a
   * length of `0` and objects with no own enumerable properties are considered
   * "empty".
   *
   * @static
   * @memberOf _
   * @category Objects
   * @param {Array|Object|string} value The value to inspect.
   * @returns {boolean} Returns `true` if the `value` is empty, else `false`.
   * @example
   *
   * _.isEmpty([1, 2, 3]);
   * // => false
   *
   * _.isEmpty([]);
   * // => true
   *
   * _.isEmpty({});
   * // => true
   *
   * _.isEmpty('');
   * // => true
   */

function isEmpty(value) {
    if (!value) {
      return true;
    }
    if (isArray(value) || isString(value)) {
      return !value.length;
    }
    for (var key in value) {
      if (hasOwnProperty.call(value, key)) {
        return false;
      }
    }
    return true;
  }

否则,如果您已经在使用下划线或破折号,请尝试:

_.isEmpty(value)

3
尝试过您的代码。我在控制台中收到一条错误消息,提示:“未捕获的引用错误:isArray()未定义”。否则,如果它能奏效,那就太好了。
crmprogdev 2015年

11
至少就lodash而言_.isNil,不是您要寻找的功能,不是_.isEmptyisNil文档isEmpty文档
Snixtor '16

如果value为boolean并且值为true,则此操作将失败。
kalyanbk

3
普通javascript没有isArrayisString功能window
GFoley83

@ GFoley83-你抓住了我!我有不使用Windows的原因。我实际上在讨论软件语言的历史和发展的一章中介绍了该主题。更相关的信息可能是在我的书《 Go中的函数式编程》中展示Monadic错误处理的讨论/代码。干杯!
l3x

9

这是我的-如果value为null,undefined等或空白(即仅包含空格),则返回true:

function stringIsEmpty(value) {

    return value ? value.trim().length == 0 : true;

}

1
我在这里对几种方法进行了测试。通过检查undefined,您的函数可以很好地工作。因此,我使用if(typeof value!=='undefined'&&!IsEmpty(value))或,如果您实际上想检查是否为空,则可以使用if(typeof value ==='undefined'|| IsEmpty2(value) )。这将为null。未定义 0; “”; “”; 假
RationalRabbit

6
return val || 'Handle empty variable'

是在很多地方处理它的一种非常不错的方法,也可以用来分配变量

const res = val || 'default value'

很多地方,但不是在默认是true和你试图供应或返回valfalse
Molomby

@Molomby这是一个非常特殊的边缘情况,但是即使很容易处理const res = falsyValue ? true : falsyValue
cubefox

5

如果尚未声明该变量,则将无法使用函数测试未定义变量,因为会出现错误。

if (foo) {}
function (bar) {}(foo)

如果尚未声明foo,则两者都会产生错误。

如果要测试是否已声明变量,可以使用

typeof foo != "undefined"

如果要测试是否已声明foo并且它具有一个值,则可以使用

if (typeof foo != "undefined" && foo) {
    //code here
}

5

检查默认值

function typeOfVar (obj) {
      return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase();
}
function isVariableHaveDefaltVal(variable) {
    if ( typeof(variable) === 'string' ) {  // number, boolean, string, object 
        console.log(' Any data Between single/double Quotes is treated as String ');        
        return (variable.trim().length === 0) ? true : false;
    }else if ( typeof(variable) === 'boolean' ) {
      console.log('boolean value with default value \'false\'');
        return (variable === false) ? true : false;
    }else if ( typeof(variable) === 'undefined' ) {
        console.log('EX: var a; variable is created, but has the default value of undefined.'); 
        return true;
    }else if ( typeof(variable) === 'number' ) { 
        console.log('number : '+variable);
        return (variable === 0 ) ? true : false;
    }else if ( typeof(variable) === 'object' ) {
   //   -----Object-----
        if (typeOfVar(variable) === 'array' && variable.length === 0) {
            console.log('\t Object Array with length = ' + [].length); // Object.keys(variable)
            return true;
        }else if (typeOfVar(variable) === 'string' && variable.length === 0 ) {
            console.log('\t Object String with length = ' + variable.length);
            return true;
        }else if (typeOfVar(variable) === 'boolean' ) {
            console.log('\t Object Boolean = ' + variable);
            return (variable === false) ? true : false;
        }else if (typeOfVar(variable) === 'number' ) {
            console.log('\t Object Number = ' + variable);
            return (variable === 0 ) ? true : false;
        }else if (typeOfVar(variable) === 'regexp' && variable.source.trim().length === 0 ) {
       console.log('\t Object Regular Expression : ');
        return true;
        }else if (variable === null) {
       console.log('\t Object null value');
        return true;
        }
    }
    return false;
}
var str = "A Basket For Every Occasion";
str = str.replace(/\s/g, "-");
//The "g" flag in the regex will cause all spaces to get replaced.

检查结果:

isVariableHaveDefaltVal(' '); // string          
isVariableHaveDefaltVal(false); // boolean       
var a;           
isVariableHaveDefaltVal(a);               
isVariableHaveDefaltVal(0); // number             
isVariableHaveDefaltVal(parseInt('')); // NAN isNAN(' '); - true         
isVariableHaveDefaltVal(null);              
isVariableHaveDefaltVal([]);               
isVariableHaveDefaltVal(/ /);              
isVariableHaveDefaltVal(new Object(''));               
isVariableHaveDefaltVal(new Object(false));            
isVariableHaveDefaltVal(new Object(0)); 
typeOfVar( function() {} );

我使用@Vix function()检查哪种类型的对象。

使用«

var prototypes_or_Literals = function (obj) {
    switch (typeof(obj)) {
        // object prototypes
        case 'object':
            if (obj instanceof Array)
                return '[object Array]';
            else if (obj instanceof Date)
                return '[object Date]';
            else if (obj instanceof RegExp)
                return '[object regexp]';
            else if (obj instanceof String)
                return '[object String]';
            else if (obj instanceof Number)
                return '[object Number]';

            else
                return 'object';
        // object literals
        default:
            return typeof(obj);
    }   
};
output test «
prototypes_or_Literals( '' ) // "string"
prototypes_or_Literals( new String('') ) // "[object String]"
Object.prototype.toString.call("foo bar") //"[object String]"        

比较运算符 检查 == [数据]。=== [对象的数据类型] JS数字始终按照国际IEEE 754标准存储为双精度浮点数。 // Number Type [int, float literals ] var int = 77; var float = 77.7; console.log( int.toFixed(10) + '\t' + float.toFixed(10) ); // Object Type var number = new Number( 77 ); if( int != float ) console.log('Data Not Equal'); if( int == number && int !== number ) console.log('Data is Equal & Types vary');
Yash

5
function isEmpty(obj) {
    if (typeof obj == 'number') return false;
    else if (typeof obj == 'string') return obj.length == 0;
    else if (Array.isArray(obj)) return obj.length == 0;
    else if (typeof obj == 'object') return obj == null || Object.keys(obj).length == 0;
    else if (typeof obj == 'boolean') return false;
    else return !obj;
}

在带有修剪以处理空白字符串的ES6中:

const isEmpty = value => {
    if (typeof value === 'number') return false
    else if (typeof value === 'string') return value.trim().length === 0
    else if (Array.isArray(value)) return value.length === 0
    else if (typeof value === 'object') return value == null || Object.keys(value).length === 0
    else if (typeof value === 'boolean') return false
    else return !value
}

1
很棒的功能,谢谢!处理每种类型的值-所有其他解决方案中都省略了数字!
Fabian von Ellerts

1
@FabianvonEllerts请不要尝试将其他代码编辑成别人的答案。将其发布为您自己的答案,作为答案下方的评论,或在评论中要求他们自己更新答案。
TylerH '18 -10-5

5

这可能是有用的。

数组中的所有值都表示您想要的内容(空,未定义或其他内容),然后在其中搜索所需内容。

var variablesWhatILookFor = [null, undefined, ''];
variablesWhatILookFor.indexOf(document.DocumentNumberLabel) > -1

2
你能解释一下吗?那里发生了什么
JoshKisb

该数组包含一些您假定为空的变量。
ddagsan

@JoshKisb数组中的所有值表示您想要的内容(空,未定义或其他内容),然后在其中搜索所需内容。
ddagsan

1
@ddagsan尽管JoshKisb可能会感谢您的答复,但您应该在回答中而不是评论中添加解释
尼克

4

如果您正在使用TypeScript并且不想考虑“这些值false”,那么这是适合您的解决方案:

第一: import { isNullOrUndefined } from 'util';

然后: isNullOrUndefined(this.yourVariableName)

请注意:如下所述,此方法现已弃用,请value === undefined || value === null改用。参考


2
我以为这很酷,所以我一开始就投票了,但是不赞成使用Node.js。类型定义文件说:/** @deprecated since v4.0.0 - use "value === null || value === undefined" instead. */
–atomtomtom

@atomictom我认为这是typescript一件事情。您能否提供其文档的链接?
BlackBeard

此处:nodejs.org/api/util.html#util_util_isnullorundefined_object。另外:“我认为这很酷,所以我最初投票了 ”,应改为:)
atomictom

为什么不赞成这样有用的简单事情?geeeeees。
ticktock

3

空虚

我不建议尝试定义或使用一个函数来计算整个世界是否为空。“空”到底意味着什么?如果有let human = { name: 'bob', stomach: 'empty' },应该isEmpty(human)退货true吗?如果有let reg = new RegExp('');,应该isEmpty(reg)退货true吗?怎么样isEmpty([ null, null, null, null ])-该列表仅包含空白,列表本身是否为空?我想在这里提出一些有关javascript中“空缺”(故意模糊的单词,以避免预先存在的关联)的注意事项-我想指出,javascript值中的“空缺”永远都不应加以处理。


真实/虚假

为了决定如何确定值的“空缺”,我们需要适应javascript对值是“真实”还是“虚假”的内在固有感觉。自然,null并且undefined都是“虚假的”。不自然的是,该数字0(除之外没有其他数字NaN)也是“虚假的”。自然最少:''是虚假的,但是[]and {}(and new Set()和and new Map())是真实的-尽管它们看上去都一样虚空!


空值与未定义

还有一些关于nullvs的讨论undefined-为了在程序中表达虚无,我们真的需要两者吗?我个人避免在我的代码中按顺序出现字母u,n,d,e,f,i,n,e,d。我总是null用来表示“空缺”。同样,尽管如此,我们需要适应javascript固有的方式nullundefined区别:

  • 尝试访问不存在的属性会给 undefined
  • 调用函数时省略参数会导致该参数接收undefined

let f = a => a;
console.log(f('hi'));
console.log(f());

  • 具有默认值的参数仅在给定时才接收默认值undefined,而不是null

let f = (v='hello') => v;
console.log(f(null));
console.log(f(undefined));


非通用性

我相信,空虚绝不应该以一般方式处理。相反,在确定数据是否为空之前,我们应该始终严格要求获取有关数据的更多信息-我主要是通过检查要处理的数据类型来做到这一点的:

let isType = (value, Cls) => {
  try {
    return Object.getPrototypeOf(value).constructor === Cls;
  } catch(err) {
    return false;
  }
};

请注意,此函数会忽略多态性-它value应该是的直接实例Cls,而不是的子类的实例Cls。我避免这样instanceof做有两个主要原因:

  • ([] instanceof Object) === true (“数组是对象”)
  • ('' instanceof String) === false (“字符串不是字符串”)

请注意,这Object.getPrototypeOf是为了避免出现类似情况,let v = { constructor: String };isType函数对于isType(v, String)(false)仍正确返回,并且isType(v, Object)(true)。

总体而言,我建议将此isType功能与以下提示结合使用:

  • 最小化未知类型的代码处理值的数量。例如,对于let v = JSON.parse(someRawValue);,我们的v变量现在为未知类型。我们应该尽早限制我们的可能性。做到这一点的最佳方法可以是通过要求一种特殊的类型:例如if (!isType(v, Array)) throw new Error('Expected Array');-这是一种非常快捷,表达力强的方法,可以消除的通用性v,并确保它始终是Array。但是,有时我们需要允许v为多种类型。在这种情况下,我们应该尽早创建v不再通用的代码块:

if (isType(v, String)) {
  /* v isn't generic in this block - It's a String! */
} else if (isType(v, Number)) {
  /* v isn't generic in this block - It's a Number! */
} else if (isType(v, Array)) {
  /* v isn't generic in this block - it's an Array! */
} else {
  throw new Error('Expected String, Number, or Array');
}

  • 始终使用“白名单”进行验证。如果您需要一个值,例如字符串,数字或数组,请检查这3种“白色”可能性,如果不满足3种,则抛出错误。我们应该能够看到检查“黑色”可能性不是很有用:说我们写了if (v === null) throw new Error('Null value rejected');-这对于确保null值不会通过实现很有用,但是如果值确实通过了,我们仍然很难知道关于它的任何事情。值v其通过这个空检查仍然是非常通用的-它的任何东西,但null!黑名单很难消除通用性。
  • 除非值是null,否则不要考虑“空值”。取而代之的是考虑“一个空虚的X”。本质上,永远不要考虑做任何事情if (isEmpty(val)) { /* ... */ }-不管该isEmpty函数如何实现(我不想知道...),它都没有意义!而且太普通了!空洞性仅应使用val的类型知识来计算。连通性检查应如下所示:

    • “一个字符串,没有字符”: if (isType(val, String) && val.length === 0) ...
    • “一个带有0个道具的物体”: if (isType(val, Object) && Object.entries(val).length === 0) ...
    • “一个等于或小于零的数字”: if (isType(val, Number) && val <= 0) ...
    • “一个数组,没有任何项目”: if (isType(val, Array) && val.length === 0) ...

    • 唯一的例外是when null用于表示某些功能。在这种情况下,有意义的是说:“空虚值”:if (val === null) ...


我可以看到您对此有所考虑:>
Rui Marques

3

尝试不同的逻辑。您可以使用下面的代码检查所有四(4)条条件以进行验证,例如not null,not blank,not undefined和not zero,仅在javascript和jquery中使用此代码(!(!(variable)))。

function myFunction() {
    var data;  //The Values can be like as null, blank, undefined, zero you can test

    if(!(!(data)))
    {
        alert("data "+data);
    } 
    else 
    {
        alert("data is "+data);
    }
}


2
function isEmpty(val){
    return !val;
}

但是此解决方案是过度设计的,如果您以后不想为业务模型需求修改功能,那么直接在代码中使用它更干净:

if(!val)...

2
var myNewValue = myObject && myObject.child && myObject.child.myValue;

这将永远不会引发错误。如果myObjectchildmyValue为null,则myNewValue将为null。没有错误将被抛出


2

对于来这里提出类似问题的每个人,以下工作都很出色,最近几年我将其保存在我的图书馆中:

(function(g3, $, window, document, undefined){
   g3.utils = g3.utils || {};
/********************************Function type()********************************
* Returns a lowercase string representation of an object's constructor.
* @module {g3.utils}
* @function {g3.utils.type}
* @public
* @param {Type} 'obj' is any type native, host or custom.
* @return {String} Returns a lowercase string representing the object's 
* constructor which is different from word 'object' if they are not custom.
* @reference http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/
* http://stackoverflow.com/questions/3215046/differentiating-between-arrays-and-hashes-in-javascript
* http://javascript.info/tutorial/type-detection
*******************************************************************************/
g3.utils.type = function (obj){
   if(obj === null)
      return 'null';
   else if(typeof obj === 'undefined')
      return 'undefined';
   return Object.prototype.toString.call(obj).match(/^\[object\s(.*)\]$/)[1].toLowerCase();
};
}(window.g3 = window.g3 || {}, jQuery, window, document));

2

根据jAndy的回答,如果您希望避免以下情况中的任何一项成为真,则:

  • 空值
  • 未定义
  • N
  • 空字符串(“”)
  • 0

一种可能避免获得真实值的可能解决方案如下:

function isUsable(valueToCheck) {
    if (valueToCheck === 0     || // Avoid returning false if the value is 0.
        valueToCheck === ''    || // Avoid returning false if the value is an empty string.
        valueToCheck === false || // Avoid returning false if the value is false.
        valueToCheck)             // Returns true if it isn't null, undefined, or NaN.
    {
        return true;
    } else {
        return false;
    }
}

它的用法如下:

if (isUsable(x)) {
    // It is usable!
}
// Make sure to avoid placing the logical NOT operator before the parameter (isUsable(!x)) and instead, use it before the function, to check the returned value.
if (!isUsable(x)) {
    // It is NOT usable!
}

除了这些方案之外,如果对象数组为空,则可能要返回false :

您可以这样处理:

function isEmptyObject(valueToCheck) {
    if(typeof valueToCheck === 'object' && !Object.keys(valueToCheck).length){
        // Object is empty!
        return true;
    } else {
        // Object is not empty!
        return false;
    }
}

function isEmptyArray(valueToCheck) {
    if(Array.isArray(valueToCheck) && !valueToCheck.length) {
        // Array is empty!
        return true;
    } else {
        // Array is not empty!
        return false;
    }
}

如果要检查所有空格字符串(“”),则可以执行以下操作:

function isAllWhitespace(){
    if (valueToCheck.match(/^ *$/) !== null) {
        // Is all whitespaces!
        return true;
    } else {
        // Is not all whitespaces!
        return false;
    }
}

注意:hasOwnProperty如果变量被声明为空字符串,则对空字符串,0,false,NaN,null和undefined返回true,因此它可能不是最好的用法。可以修改该函数以使用它来表明它已被声明,但不可用。


2

GitHub上的代码

const isEmpty = value => (
  (!value && value !== 0 && value !== false)
  || (Array.isArray(value) && value.length === 0)
  || (isObject(value) && Object.keys(value).length === 0)
  || (typeof value.size === 'number' && value.size === 0)

  // `WeekMap.length` is supposed to exist!?
  || (typeof value.length === 'number'
      && typeof value !== 'function' && value.length === 0)
);

// Source: https://levelup.gitconnected.com/javascript-check-if-a-variable-is-an-object-and-nothing-else-not-an-array-a-set-etc-a3987ea08fd7
const isObject = value =>
  Object.prototype.toString.call(value) === '[object Object]';

穷人测试tests

const test = () => {
  const run = (label, values, expected) => {
    const length = values.length;
    console.group(`${label} (${length} tests)`);
    values.map((v, i) => {
      console.assert(isEmpty(v) === expected, `${i}: ${v}`);
    });
    console.groupEnd();
  };

  const empty = [
    null, undefined, NaN, '', {}, [],
    new Set(), new Set([]), new Map(), new Map([]),
  ];
  const notEmpty = [
    ' ', 'a', 0, 1, -1, false, true, {a: 1}, [0],
    new Set([0]), new Map([['a', 1]]),
    new WeakMap().set({}, 1),
    new Date(), /a/, new RegExp(), () => {},
  ];
  const shouldBeEmpty = [
    {undefined: undefined}, new Map([[]]),
  ];

  run('EMPTY', empty, true);
  run('NOT EMPTY', notEmpty, false);
  run('SHOULD BE EMPTY', shouldBeEmpty, true);
};

试验结果:

EMPTY (10 tests)
NOT EMPTY (16 tests)
SHOULD BE EMPTY (2 tests)
  Assertion failed: 0: [object Object]
  Assertion failed: 1: [object Map]

很棒的功能,这里所有其他答案都有您似乎要解决的多个问题,我只是希望在写自己的:p之前就找到了它,以为您可能希望看看我的工作stackoverflow.com/ Questions / 5515310 /…我们的两个函数似乎都具有完全相同的输出,但是我减少了一些代码。如果我错过了任何事情,请告诉我。
肖恩·班尼斯特

you您是否尝试过我的“穷人测试”?我想我最终在函数中为Map,WeakMap以及Date,RegExp等特殊情况添加了更多测试。您确定value.constructor === Object吗?检查一下
Pascal Polleunus

是的,我确实运行了您的测试,为此,我们的两个函数都返回了相同的结果。我一直想知道我是否缺少这些测试用例之外的东西。我相信value.constructor === Object可以,在javascript中,如果OR语句具有执行顺序,则OR语句仅在前一个未返回TRUE并且我们已经检查了的情况下才会执行Null。实际上,最后一个OR语句的唯一目的是检测{}并确保它不会为不应执行的操作返回TRUE。
肖恩·班尼斯特

1

这将检查不确定嵌套的变量是否未定义

function Undef(str) 
{
  var ary = str.split('.');
  var w = window;
  for (i in ary) {
    try      { if (typeof(w = w[ary[i]]) === "undefined") return true; }
    catch(e) { return true; }
  }
  return false;
}

if (!Undef("google.translate.TranslateElement")) {

上面检查了Google翻译功能TranslateElement是否存在。这等效于:

if (!(typeof google === "undefined" 
 || typeof google.translate === "undefined" 
 || typeof google.translate.TranslateElement === "undefined")) {

1

当引用或函数可能未定义或为null时,可选的链接运算符提供一种简化通过连接的对象访问值的方法。

let customer = {
  name: "Carl",
  details: {
    age: 82,
    location: "Paradise Falls" // detailed address is unknown
  }
};
let customerCity = customer.details?.address?.city;

在未找到可选值之后,可以使用空值合并运算符来构建默认值:

let customer = {
  name: "Carl",
  details: { age: 82 }
};
const customerCity = customer?.city ?? "Unknown city";
console.log(customerCity); // Unknown city


0

虽然很老套,但忘记的是他们应该包装自己的代码块,然后捕获错误,然后进行测试...

function checkup( t ){
  try{
    for(p in t){
      if( p.hasOwnProperty( t ) ){
        return true;
      }
    }
    return false;
  }catch(e){
    console.log("ERROR : "+e);
    return e;
  }
}

因此,您真的不必事先检查潜在的问题,只需抓住它,然后按需要进行处理即可。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.