最终参考文章:https://juejin.im/post/5aba32d9f265da239e4e1b6c
空值 (null):
var isNull = function (obj) {
return obj === null;
};
未定义 (undefined)
方法1(极力推荐)
var isUndefined = function (obj) {
return obj === void 0;
}
方法2(相对稳定)
var isUndefined = function (obj) {
return typeof obj === "undefined";
}
布尔值 (boolean)
var toString = Object.prototype.toString;
var isBoolean = function (obj) {
return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
}
数字 (number)
var toString = Object.prototype.toString;
var isNumber = function (obj) {
return toString.call(obj) === '[object Number]';
}
字符串 (string)
var toString = Object.prototype.toString;
var isString = function (obj) {
return toString.call(obj) === '[object String]';
}
对象 (object)
var toString = Object.prototype.toString;
var isObject = function (obj) {
var type = typeof obj;
return type === 'function' || type === 'object' && !!obj;
}
数组(Array)
最稳妥方法
Object.prototype.toString.call([1,2,3]) // "[object Array]"
============================== 我是一条分割线=====================================================
首先说下null与undefined区别:
对已声明但未初始化的和未声明的变量执行typeof,都返回"undefined"。
null表示一个空对象指针,typeof操作会返回"object"。
一般不显式的把变量的值设置为undefined,但null相反,对于将要保存对象的变量,应明确的让该变量保存null值。
var bj;
alert(bj); //"undefined"
bj = null;
alert(typeof bj); //"object"
alert(bj == null); //true
bj = {};
alert(bj == null); //false
/*
* 检测对象是否是空对象(不包含任何可读属性)。
* 方法既检测对象本身的属性,也检测从原型继承的属性(因此没有使用hasOwnProperty)。
*/
function isEmpty(obj)
{
for (var name in obj)
{
return false;
}
return true;
};
这里所说的空对象,到底是 {}还是 null .我写了一个测试用例。
var a = {};
a.name = 'realwall';
console.log(isEmpty(a)); //false
console.log(isEmpty({})); //true
console.log(isEmpty(null)); //true
//注意参数为null时无语法错误哦,即虽然不能对null空指针对象添加属性,但可以使用for in语句。
/*
* 检测对象是否是空对象(不包含任何可读属性)。
* 方法只既检测对象本身的属性,不检测从原型继承的属性。
*/
function isOwnEmpty(obj)
{
for(var name in obj)
{
if(obj.hasOwnProperty(name))
{
return false;
}
}
return true;
};
{}与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:
var a = {};
if(!a){ console.log(1);}
else if(a == null) { console.log(2);}
else { console.log(3);}
结果为:3
2. 代码2:
var b = {};
if(b == {}){ console.log(4);}
if(b == '{}') { console.log(5);}
if(typeof(b) == 'object') { console.log(6);}
结果为:6
3. 代码3:
var c = {};
if(JSON.stringify(c) == "{}"){ console.log(7);}
结果为: 7
所以可以使用代码3的方法判断对象是否为空对象{};
如果对象不为空,并且知道对象不为空时,某个属性(比如{id:111})一定存在,则可以里这样判断:
4. 代码4:
var d = {};
var e = {id:111};
if(d.id){ console.log(8);}
if(e.id){ console.log(9);}
结果为:9
小结:显然代码3的判断方式比较“强势”,但效率明显不如代码4的判断方法
===================================我是分割线============================
补充:
文章:https://blog.csdn.net/FungLeo/article/details/78113661
function checkNullObj (obj) {
return Object.keys(obj).length === 0
}
文章:https://blog.csdn.net/wen_3370/article/details/56496238
var exp = undefined;
if (typeof(exp) == "undefined")
{
alert("undefined");
}
var exp = null;
if (!exp && typeof(exp)!=”undefined” && exp!=0)
{
alert(“is null”);
}
我们在 DOM 应用中,一般只需要用 (!exp) 来判断就可以了,因为 DOM 应用中,可能返回 null,可能返回 undefined,如果具体判断 null 还是 undefined 会使程序过于复杂。