引言

在日常开发中,经常遇到前端来处理数据,在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));
最后修改:2024 年 05 月 29 日
如果觉得我的文章对你有用,请随意赞赏