对于 in 和 Object.keys - es6

这两个函数不应该返回相同的吗?因为 in 给了我 ForInStatement 不允许的语法限制,而 Object.keys 给了我完全不同的结果。一旦它返回false,为什么它又循环了?


我想检查对象中的任何元素是否为空或空。只要它返回false,为什么它仍然在Object.keys中循环?在 ForIn 中,一旦在对象中检测到空元素,它就会返回 false 并且循环停止。


对于输入


checkEmpty = (obj) => {

    for (const key in obj) {

      if (obj[key] === null || obj[key] === '') {

        console.log('forIn', obj[key] === null || obj[key] === '');

        return false;

      }

    }

    return true;

}

对象.keys


checkEmpty = (obj) => {

    Object.keys(obj).forEach(key => {

          if (obj[key] === null || obj[key] === '') {

            console.log('forEach', obj[key] === null || obj[key] === '');

            return false;

          }

    });

    return true;

}


12345678_0001
浏览 222回答 2
2回答

qq_笑_17

Array.forEach()返回值被忽略,并且您不能像在for...in. Array.some()一旦检查失败,您就可以使用您的案例返回结果。注1:Array.some()将返回true只要检查返回true。只有当所有支票Array.every()都返回时true才会返回true。注意 2:true如果至少有一个null或''值,您的函数背后的想法似乎是返回,但您的代码却恰恰相反。false当有空项目时,您可以否定我的函数的结果。注 3:Array.keys/values/entrieswithArray.forEach()和for...in循环之间还有另一个区别。该for...in循环还将循环所有继承的可枚举属性,而这些Object.x()方法只会迭代自己的可枚举属性。// use object values, I use Object.entries to show the key in the consoleconst checkHasEmpty = obj => Object.entries(obj).some(([key, value]) => console.log(`key: ${key}`) || value === null || value === '')console.log(checkHasEmpty({}))console.log(checkHasEmpty({ a: 1, b: null, c: 3 }))console.log(checkHasEmpty({ a: '', b: 2 }))console.log(checkHasEmpty({ a: 1, b: 2, c: null }))

德玛西亚99

似乎在第二个片段中,错误就在这里Object.keys(obj).forEach(key => {          if (obj[key] === null || obj[key] === '') {forEach将接受参数,因为(item,index)whereitem是数组的元素,是数组index中的当前索引。因此obj[key]将尝试获取键指定的数组中的元素,该元素也可以是未定义的试试这个obj[key]只替换key或obj[index]Object.keys(obj).forEach(key => {          if (key === null || key === '') {
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript