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行;
在这种情况下,值
将始终是未定义的
,因为它将被设置为返回值