一个对象可以是未定义的但有定义的 属性 吗? (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".
关于我遇到的一个简单 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".