引言
在日常开发中,经常遇到前端来处理数据,在js中判断数据有很多方法,在这里列举出判断数据的不同方法
判断数据是否是NaN
isNaN(),如果给定值在被转换为数字后为 NaN 则返回值为 true;否则为 false
语法:isNaN(value)
但是在某一些特殊情况下,会对既不是数字也不是NaN的值返回 true
,如:
isNaN("37,5"); // true
isNaN("123ABC"); // true:Number("123ABC") 的结果是 NaN
isNaN(new Date().toString()); // true;Date 对象的字符串表示形式不能解析为数字
Number.isNaN(),JavaScript在ES6中还引入了检测一个值是否为数字值 NaN
的更可靠的方法,如:
if(typeof x === "number") Number.isNaN(value)
两者区别:Number.isNaN()
不会尝试将参数转换为数字,因此非数字总是返回 false
判断对象是否为空
Object.keys(),返回一个由给定对象自身的可枚举的字符串键属性名组成的数组。它与for...in循环迭代是相同的,只是for...in循环还会枚举原型链中的属性,但是Object.keys返回的数组顺序和与for...in循环提供的顺序相同
const arr = ["a", "b", "c"];
console.log(Object.keys(arr)); // ['0', '1', '2']
const obj = { 0: "a", 1: "b", 2: "c" };
console.log(Object.keys(obj)); // ['0', '1', '2']
Object.keys(obj).length === 0 //判断对象是否为空
tip:需要属性的值就使用Object.values(),同时需要属性的键和值就使用Object.entries(),在 ES5 中,将一个非对象传递给Object.keys()会抛出一个TypeError
Object.getOwnPropertyNames(),返回一个包含给定对象中所有自有属性的数组,包括不可枚举属性,但不包括使用 symbol 值作为名称的属性
语法:Object.getOwnPropertyNames(obj)
除了以上这两个方法,还可以使用for...in循环配合hasOwnProperty()方法以及使用JSON.stringify()方法来判断,但是JSON.stringify()尽量少用,在特定情况下可能会出现问题,比如对象中包含不可枚举的属性或者循环引用等
还有一些数据为空的情况,比如undefined,在这里就不逐一解释了,在下面列出一些示例:
typeof value== "undefined" //判断一个值是否为undefined
typeof this.函数名=== 'function' //判断是否为函数
!a.length和!a //判断数据是否是''
判断是否有二级数组
Array.prototype.some(),要判断一个数组里面是否存在数组,可以使用some方法来检查数组里面的所有数据,然后搭配isArray()方法来判断,示例:
function hasNestedArray(array) {
return array.some(item => Array.isArray(item));
}
之前遇到查看一个数组里面的对象,是否有对象里面含有数组,写过一个方法,可以借鉴一下下...
function hasNestedArray(arr) {
let determine = arr.some(item => { //查看每一条数据
let b = false;
Object.keys(item).forEach(key => { //循环每一条对象里面的属性
if (Array.isArray(item[key])) b = true;
})
return b
})
return determine;
}
判断对象是否含有某些参数
Object.prototype.hasOwnProperty(),返回一个布尔值,表示对象自有属性中是否具有指定的属性
语法:对象.hasOwnProperty('属性名')
但是hasOwnProperty只能判断自有属性,如果想判断继承属性的话,可以使用in操作符,这个会检查对象自身以及原型链中是否含有指定的属性,也是返回一个布尔值
语法:‘属性名’ in 对象名
如果想要检查多个属性,可以使用循环或者Object.keys()结合Array.prototype.every()实现,这个方法如果所有属性都存在就返ture,否则就false:
const obj = {
name: 'John',
age: 30,
city: 'New York'
};
const propertiesToCheck = ['name', 'age', 'country']; //要检查的属性列表
const hasAllProperties = propertiesToCheck.every(prop => obj.hasOwnProperty(prop));
console.log(hasAllProperties); // 输出:false,因为缺少'country'属性
若想要检查数组含有多个数据,可以这样:
const isSubset = (array1, array2) => array2.every((element) => array1.includes(element));