Javascript 理解代码段中的条件运算符和条件赋值

Javascript 理解代码段中的条件运算符和条件赋值,javascript,Javascript,我试图理解此代码段中的第三行(条件表达式条件下的赋值value=f)是如何工作的: someProp(propName, f) { let prop = this._props && this._props[propName], value if (prop != null && (value = f ? f(prop) : prop)) return value ... } 在本例中,value在console.log(value)语句中未定义:

我试图理解此代码段中的第三行(条件表达式条件下的赋值
value=f
)是如何工作的:

someProp(propName, f) {
  let prop = this._props && this._props[propName], value
  if (prop != null && (value = f ? f(prop) : prop)) return value
  ...
}
在本例中,
value
console.log(value)
语句中未定义:

let f = 42;
value = f ? console.log('true') : console.log('false');
console.log(value);
在我看来,在第一个代码段的第三行返回的
变量总是未定义的。我错过了什么?这个片段来自我正在研究的一个开源项目中的生产代码


另外,
这是一个对象。为什么作者使用
if(prop!=null&&&…
来测试props对象是否存在,而不是像
if这样的东西(prop&&…
?我认为这是经验丰富的开发人员的典型代码,还是其他人编写的代码会有所不同?

条件运算符比赋值运算符有一个,所以这是解析的

if (prop != null && (value = (f ? f(prop) : prop))) return value
//                           ^                  ^
不是

正如您所期望的。因此,是的,在您的演示示例中,您总是得到
未定义的
,因为这是
控制台.log
调用的返回值。但是在这里,它被分配为
f(prop)
prop

还有,为什么作者使用
prop!=null&&&…
而不仅仅是
prop&&…

因为他喜欢直言不讳

我认为这是经验丰富的开发人员的典型代码,对吗


不。可能是开发人员的典型代码,曾经被错误值咬过。

条件运算符比赋值运算符有一个更大的值,因此将对其进行解析

if (prop != null && (value = (f ? f(prop) : prop))) return value
//                           ^                  ^
不是

正如您所期望的。因此,是的,在您的演示示例中,您总是得到
未定义的
,因为这是
控制台.log
调用的返回值。但是在这里,它被分配为
f(prop)
prop

还有,为什么作者使用
prop!=null&&&…
而不仅仅是
prop&&…

因为他喜欢直言不讳

我认为这是经验丰富的开发人员的典型代码,对吗


不。可能是开发人员的典型代码,他们曾经被错误的值咬过。

让我们检查一下这行代码:

if (prop != null && (value = f ? f(prop) : prop)) return value
特别是这一部分:

(value = f ? f(prop) : prop) 
如果
f
为真,则将
value
设置为
f(prop)
的返回值

如果
f
未通过,则将
value
设置为
prop
的值

然后检查Thruthynes值并返回


在第二个示例中:

let f = 42;
value = f ? console.log('true') : console.log('false');
console.log(value);
实际上,您要做的是将
值设置为
console.log('true')
的返回值,因为
console.log()
返回
未定义的


我认为这是经验丰富的开发人员编写的典型代码,还是其他人编写的代码会有所不同


为了便于理解,尤其是在教程中使用代码时,我个人会扩展代码,以提高学习者的可读性,但我也喜欢代码紧凑,因此如果是库代码,我可能也会按照这些思路编写代码。

让我们看一下这一行:

if (prop != null && (value = f ? f(prop) : prop)) return value
特别是这一部分:

(value = f ? f(prop) : prop) 
如果
f
为真,则将
value
设置为
f(prop)
的返回值

如果
f
未通过,则将
value
设置为
prop
的值

然后检查Thruthynes值并返回


在第二个示例中:

let f = 42;
value = f ? console.log('true') : console.log('false');
console.log(value);
实际上,您要做的是将
值设置为
console.log('true')
的返回值,因为
console.log()
返回
未定义的


我认为这是经验丰富的开发人员编写的典型代码,还是其他人编写的代码会有所不同


为了便于理解,特别是如果代码用于教程,我个人会扩展代码以提高学习者的可读性,但我也喜欢我的代码紧凑,因此如果它是库的代码,我可能也会按照这些思路编写。

我个人认为这写得不好;撇开经验不谈,它太难阅读。在if条件中执行分配,然后可能返回-冷静

这是直截了当的:

if ( prop != null ) {
    if ( f ) {
        value = f( prop );
    } else {
        value = prop;
    }
    if ( value ) return value;
}

另外一个怪癖是
值如果是falsy就不会返回,这(我猜)这就是为什么它的赋值是if条件的一部分。作者将所有这些逻辑塞进一行是聪明的,但在我看来,它最好是简化一下。

我个人认为这写得很糟糕;撇开经验不谈,它太难阅读。在if条件中,完成一个可能返回的赋值-冷静

这是直截了当的:

if ( prop != null ) {
    if ( f ) {
        value = f( prop );
    } else {
        value = prop;
    }
    if ( value ) return value;
}

另外一个怪癖是,如果它是falsy,则不会返回
值,这(我猜)就是为什么它的赋值是if条件的一部分。作者将所有这些逻辑塞进一行是聪明的,但在我看来,它最好简化。

值=f?console.log('true'):console.log('false'));
在这种情况下,
将始终是
未定义的
,因为它将被设置为
控制台.log()的返回值
始终是
未定义的
值=f?f(prop):prop)
在这种情况下,如果
f
为假,那么
值=prop
,如果
f``为真(根据上下文,我怀疑是回调),那么
value`将是
f(prop)
返回的值。
你能链接你正在学习的开源项目中的完整代码吗?@Bergi它是ProseMirror项目
value=f?console.log('true'):console.log('false')中的第179行;
在这种情况下,
将始终是
未定义的
,因为它将被设置为返回值