检查布尔键是否存在并将其包含在 if 语句中的最有效方法

Most efficient way to check if boolean key exists and include it in if statement

本文关键字:语句 if 方法 有效 包含 是否 布尔键 存在 检查      更新时间:2023-09-26

这里有两个对象:

var user1 = { test: true }
var user2 = { nope : "noper" }
var user3 = { test: false }

我想检查所有三个对象的测试是否为真。这是最有效的方法吗?(假设我有 100k + 对象)

var users = [user1, user2, user3]
var users_length = users.length
for(var i = 0; i < users_length; i++)
    if(("test" in users[i]) && users[i].test) { //evals to true }

您可以使用返回 true 的 Array.every()当且仅当函数参数对所有数组元素返回 true。

var user1 = { test: true }
var user2 = { nope: "noper" }
var users = [user1, user2]
var result = users.every( function( user ) {
    return user.test;
});
console.log( result );

虽然如果你总是只有两个对象,那么user1.test && user2.test就简单多了。

(请注意,"test" in users[i] && users[i].test是多余的,因为如果元素test不存在,那么users[i].test将是假的(未定义)。

首先,缓存长度在任何现代浏览器中都是无用的(IE8除外)。JIT 可以轻松地自行缓存它。

最有效的代码是:

for(var i = users.length-1; i; i--) { // Reversed iteration is little bit faster
    if((Object.prototype.hasOwnProperty.call(users[i], 'test') && users[i].test) {
        // Your code goes here
    }
}

就个人而言,我会做这样简单的事情:

var user1 = { test: true }
var user2 = { nope : "noper" }
var user3 = { test: false }
var users = [user1, user2, user3]
var result = true;
for(var i = 0, j = users.length; i < j; i++){
    result = result && !!users[i].test
    if (!result){
        break;
    }
}
alert(result);

(这假设您希望在对象上不存在属性"test"时返回 false)

这会缓存数组的长度,因此不会计算每个循环执行,然后在遇到 false 时中断,因为如果是这种情况,则没有继续的意义。这应该会给你更好的性能。这!!将测试属性的值强制转换为"and"到结果的布尔值(由于它下面的错误检查,这不是严格需要的,但我喜欢添加它,以便最终结果是一个布尔值)。

http://jsfiddle.net/jkyftjpu/