判断JavaScript对象为null或者属性为空

本文深入探讨了JavaScript中对象、数组、null与undefined的检测方法,包括如何判断对象是否为空,提供了多种实用的代码示例,如使用JSON.stringify进行对象空值检查。

最终参考文章:https://juejin.im/post/5aba32d9f265da239e4e1b6c

空值 (null):

 
  1. var isNull = function (obj) {

  2. return obj === null;

  3. };

未定义 (undefined)

 
  1. 方法1(极力推荐)

  2. var isUndefined = function (obj) {

  3. return obj === void 0;

  4. }

  5.  
  6. 方法2(相对稳定)

  7. var isUndefined = function (obj) {

  8. return typeof obj === "undefined";

  9. }

布尔值 (boolean)

 
  1. var toString = Object.prototype.toString;

  2.  
  3. var isBoolean = function (obj) {

  4. return obj === true || obj === false || toString.call(obj) === '[object Boolean]';

  5. }

数字 (number)

 
  1. var toString = Object.prototype.toString;

  2.  
  3. var isNumber = function (obj) {

  4. return toString.call(obj) === '[object Number]';

  5. }

字符串 (string)

 
  1. var toString = Object.prototype.toString;

  2.  
  3. var isString = function (obj) {

  4. return toString.call(obj) === '[object String]';

  5. }

对象 (object)

 
  1. var toString = Object.prototype.toString;

  2.  
  3. var isObject = function (obj) {

  4. var type = typeof obj;

  5. return type === 'function' || type === 'object' && !!obj;

  6. }

数组(Array)

 
  1. 最稳妥方法

  2. Object.prototype.toString.call([1,2,3]) // "[object Array]"

============================== 我是一条分割线=====================================================

 

 

首先说下null与undefined区别:

对已声明但未初始化的和未声明的变量执行typeof,都返回"undefined"。

null表示一个空对象指针,typeof操作会返回"object"。

一般不显式的把变量的值设置为undefined,但null相反,对于将要保存对象的变量,应明确的让该变量保存null值。

 
  1. var bj;

  2. alert(bj); //"undefined"

  3. bj = null;

  4. alert(typeof bj); //"object"

  5. alert(bj == null); //true

  6. bj = {};

  7. alert(bj == null); //false

 
  1. /*

  2. * 检测对象是否是空对象(不包含任何可读属性)。

  3. * 方法既检测对象本身的属性,也检测从原型继承的属性(因此没有使用hasOwnProperty)。

  4. */

  5. function isEmpty(obj)

  6. {

  7. for (var name in obj)

  8. {

  9. return false;

  10. }

  11. return true;

  12. };

这里所说的空对象,到底是 {}还是 null .我写了一个测试用例。

var a = {};

a.name = 'realwall';

console.log(isEmpty(a));  //false

console.log(isEmpty({}));  //true

console.log(isEmpty(null));  //true

//注意参数为null时无语法错误哦,即虽然不能对null空指针对象添加属性,但可以使用for in语句。

 
  1. /*

  2. * 检测对象是否是空对象(不包含任何可读属性)。

  3. * 方法只既检测对象本身的属性,不检测从原型继承的属性。

  4. */

  5. function isOwnEmpty(obj)

  6. {

  7. for(var name in obj)

  8. {

  9. if(obj.hasOwnProperty(name))

  10. {

  11. return false;

  12. }

  13. }

  14. return true;

  15. };

{}null的区别:

这个东西很重要。

var a = {};

var b = null;

a.name = 'realwall';

b.name = 'jim'; //这里会报错,b为空指针对象,不能像普通对象一样直接添加属性。

b = a;

b.name = 'jim'; //此时 a和 b指向同一个对象。a.name, b.name均为'jam'



===================================我是分割线============================

做项目时遇到一个问题,判断一个对象是否为空对象,发现这样判断可以,上代码:

1. 代码1:

 

 
  1. var a = {};

  2. if(!a){ console.log(1);}

  3. else if(a == null) { console.log(2);}

  4. else { console.log(3);}

结果为:3

2. 代码2:

 

 
  1. var b = {};

  2. if(b == {}){ console.log(4);}

  3. if(b == '{}') { console.log(5);}

  4. if(typeof(b) == 'object') { console.log(6);}

结果为:6

3. 代码3:

 

 
  1. var c = {};

  2. if(JSON.stringify(c) == "{}"){ console.log(7);}

结果为: 7

所以可以使用代码3的方法判断对象是否为空对象{};

如果对象不为空,并且知道对象不为空时,某个属性(比如{id:111})一定存在,则可以里这样判断:

4. 代码4:

 

 
  1. var d = {};

  2. var e = {id:111};

  3. if(d.id){ console.log(8);}

  4. if(e.id){ console.log(9);}

结果为:9

小结:显然代码3的判断方式比较“强势”,但效率明显不如代码4的判断方法

 

 

===================================我是分割线============================

补充:

文章:https://blog.csdn.net/FungLeo/article/details/78113661

 
  1. function checkNullObj (obj) {

  2. return Object.keys(obj).length === 0

  3. }

文章:https://blog.csdn.net/wen_3370/article/details/56496238

 
  1. var exp = undefined;

  2. if (typeof(exp) == "undefined")

  3. {

  4.     alert("undefined");

  5. }

  6.  
  7. var exp = null; 

  8. if (!exp && typeof(exp)!=”undefined” && exp!=0) 

  9. alert(“is null”); 

  10. }

我们在 DOM 应用中,一般只需要用 (!exp) 来判断就可以了,因为 DOM 应用中,可能返回 null,可能返回 undefined,如果具体判断 null 还是 undefined 会使程序过于复杂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值