一个对象可以是未定义的但有定义的 属性 吗? (Javascript)

Can an object be undefined but yet have a defined property? (Javascript)

关于我遇到的一个简单 Javascript 函数,我有一个有点尴尬的问题:

Passport.prototype.use = function(name, strategy) {
  if (!strategy) {
    strategy = name;
    name = strategy.name;
  }
  if (!name) throw new Error('authentication strategies must have a name');

  this._strategies[name] = strategy;
  return this;
};

我认为此函数的目的是为策略提供一个 name,覆盖它可能具有的默认名称。

我认为函数的第一部分本质上是将 strategy.name 分配给 name,考虑到未定义策略 if(!strategy){} 的情况。这对我来说并不直观。如果没有定义strategy,这个代码只有运行,怎么能定义strategy.name呢? IE。一个未定义的对象可以有一个定义的 属性——还是我看错了?

作为旁注——我一直在网上搜索,试图找出 _ 在整个 javascript 中的用法。我知道 underscore.js 库很受欢迎,但该库尚未加载,所以这个下划线必须表示其他内容。

无论如何,我们将不胜感激。谢谢!

为了组织起见,让我们将评论部分正式化(顺便说一句,为什么现在有这么多人通过评论来回答?)

参数重载

这在 Javascript 中(不幸的是)很常见。这是一种为两个接口提供相同功能的方法。在我看来,这通常会导致混淆。

尽管如此,在这种情况下,作者想提供两个签名:

Prototype.use(strategy: Object)

Prototype.use(name: String, strategy: String)

允许呼叫者:

Passport.use("name", "strategy");

Passport.use({ "name": "name" });

因此,如果第二个参数是假的 (if (!strategy)),则使用第一个参数代替 (strategy = name;)。

"""Private""" 变量

Javascript 缺少 "private" 变量(闭包除外)因此使用下划线作为 _property 的前缀表示它不应被外部代码访问,即 "use at your own peril, may break".