我想确保某些变量始终为Object
(我知道aValue
可以是Object
或undefined
或null
)。我有以下选择:
var mustBeObject = aValue || {};
或
var mustBeObject = Object(aValue);
哪两个更有效率,为什么?
答案 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