哪一个更有效`对象(值)`或`值|| {}`

时间:2014-05-31 17:48:00

标签: javascript performance object

我想确保某些变量始终为Object(我知道aValue可以是Objectundefinednull )。我有以下选择:

var mustBeObject = aValue || {};

var mustBeObject = Object(aValue);

哪两个更有效率,为什么?

1 个答案:

答案 0 :(得分:5)

如果您想保证mustBeObject是一个对象而不管aValue是什么,但如果aValue是一个对象,那么您希望使用aValue的值那么你需要更多的代码:

var mustBeObject = (aValue && typeof aValue === "object") ? aValue : {};

或者,如果您想确保aValue甚至不是数组或其他类型的非JS对象,您还需要进一步测试以确保aValue符合您的要求:

// make sure it's an object and not an array and not a DOM object
function isPlainObject(item) {
    return (
        !!item &&
        typeof item === "object" && 
        Object.prototype.toString.call(item) === "[object Object]" &&
        !item.nodeType
    );
}

var mustBeObject = isPlainObject(aValue) ? aValue : {};

编写这些内容是为了确保mustBeObject是一个JS对象,而不管最初是aValue。如果您从代码中了解aValue只是undefined或有效对象,那么您的第一个选择是:

var mustBeObject = aValue || {};

肯定会比我上面的任何选项都快,但是你的选项只能防止aValue中的假值,而不是其他类型的非JS对象的非假值,所以既然你说你了需要“确保某些变量始终是一个对象”,我认为你需要的测试多于你所拥有的测试。


jsperf test表示OR版本更快。感谢@Wander Nauta