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

var mustBeObject = aValue || {};


要么

var mustBeObject = Object(aValue);


两者哪个更有效?为什么?

最佳答案

如果要保证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

关于javascript - 哪一个是效率更高的`Object(value)`或`value || {}`,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23973367/

10-12 21:29