如何更好地检查 javascript 中的参数对象?

How is better to check parameters object in javascript?

大多数时候我使用这样的东西:

function(obj) {
   obj = obj || {};
   // do stuff
   var foo = obj.foo;
}

但我的同事玩了一点控制台。time/timeEnd 并向我保证

if (obj) 
   var foo = obj.foo;

更快(代码可能更复杂,这只是示例)。

但是,对我来说,第一个变体看起来更好。但是我们每次都创建了额外的空对象(当没有传递参数时)。我想听听你们是怎么想的。你用什么方法?

当您需要 obj 中的有效对象用于其余代码并且您希望确保代码中只有一个位置存在有效对象时,第一种方法是合适的。

当您只想检查 obj 是否通过并根据该条件在代码中做一些不同的事情时,第二种方法是合适的。更可靠的检查是:

if (typeof obj === "object")

因此,这些是实现不同目标的不同技术,主要用于不同的情况。

所以,答案是"it depends upon what the rest of your code is doing and on what you're really trying to accomplish in your code"。没有永远正确的答案。

当您有一个带有可选属性的可选对象并且您想要为缺少的属性填充默认值或者即使整个对象没有被传递时,您的第一个技术的通用设计模式将被使用:

function doSomething(obj) {
   var defaults = {timeout: 2000, caseSensitive: false, waitTime: 400};
   var options = Object.assign({}, defaults, obj);

   // safely use options object in the rest of this function
}

此技术还可以安全地作用于传递对象的副本,因此永远不会修改调用者的对象。

我建议使用第二种方法来检查对象是否定义。更好的方法是检查我认为是

的对象
 if(typeof object !== undefined)

因为它让我们清楚地了解我们在 if 块中尝试做什么

第一个较慢,因为如果缺少 obj,它将通过创建一个对象来完成。第二个只是进行检查和赋值,因此速度会更快,但不会出现 obj。如果你曾经依赖 obj 的存在,那么使用第一个,如果你只是参考 foo 那么使用第二个。

但是......老实说,你不应该为这样的优化而烦恼,而是做你觉得更清晰、更容易阅读的事情。