javascript:在条件表达式通常为
我刚刚遇到一段javascript代码,它在使用逻辑javascript:在条件表达式通常为,javascript,Javascript,我刚刚遇到一段javascript代码,它在使用逻辑&或逻辑或表达式的地方使用赋值语句: var-geo; 函数getGeoLocation(){ 试一试{ 如果(!!navigator.geolocation){ 返回navigator.geolocation; }否则{ 返回未定义; } }捕获(e){ 返回未定义; } } 如果(geo=getGeoLocation()){ //这是我感兴趣的声明 log('conditional expression was true/truthy');
&
或逻辑或
表达式的地方使用赋值语句:
var-geo;
函数getGeoLocation(){
试一试{
如果(!!navigator.geolocation){
返回navigator.geolocation;
}否则{
返回未定义;
}
}捕获(e){
返回未定义;
}
}
如果(geo=getGeoLocation()){
//这是我感兴趣的声明
log('conditional expression was true/truthy');
}
我的问题是,从if
语句的角度来看,当是否计算了
geo=getGeoLocation()
特别是它的结果是什么?这是什么类型的?是吗
- 无论函数
返回什么?getGeoLocation()
(其中类型为truthy/falsy) - 这是作业的“结果”吗?i、 e.是否分配了非空的内容?
(在这种情况下,“结果”可能是布尔值,真/假?) - 还是别的什么
将首先执行getGeoLocation()
- 接下来将执行分配操作,其中返回的任何
都将存储在getGeolocation()
geo
- 这将是
或未定义的
,如果存在的话导航器.geolocation
- 这将是
将作为 对geo
语句的条件if
geo = getGeoLocation();
if (geo) {
// ...
}
如果navigator成功,您将获得一个地理位置对象,它是真实的,如果失败,您可以在else部分中看到,该函数将返回undefined,即falsy 它可能返回true或false,也可能返回1或0 简单地说,任何不是0或false的值计算为true,我们可以执行以下操作:
if (true)
always do this
if (false)
never do this
或
是的,
geolocation()
返回的值将用于测试if
条件。例如if(a=false){console.log(“abc”)}未定义
但是if(a=true){console.log(“abc”)}VM402:1 abc
赋值的“结果”是赋值的值。也就是说赋值操作符返回被赋值的值。这就是为什么a=b=c=“test”
有效的原因。只需阅读,它清楚地表示“赋值操作的计算结果为赋值”(换句话说,RHS)。任何不是0、false、未定义或null的对象。与代码中的注释相反,while循环永远不会结束。我想你不是说“返回”,而是说“评估到”。无论如何,它不会“返回true或false”,它的计算结果是truthy或falsy值;在我看来,if(geo){/…}似乎是一种很有用的思考方法。这正是我所希望的答案,谢谢,没问题,如果我能推荐这样写的话,我很高兴能帮上忙,因为在接下来的几个月里,这会更加明显。想象一下有一些bug,浏览代码并立即将其更改为=
,因为这是更常见的模式-然后您引入了另一个bug:p@JaromandaX-当我学习C时,我被教导如果只有一个=
操作数是一个变量,则将其置于右侧。如中所示,5==x
,而不是x==5
,或者getGeoLocation()==geo
,而不是geo==getGeoLocation()
。这样,如果您不小心使用了=
,您会通过编译错误立即发现错误。但由于C代码编写者是牛仔,我也被教导在if(或while等)条件下故意赋值是完全可以接受的,如果合适的话,我仍然在JS中这样做。虽然在JS中我通常使用==
和==代码>用于比较,因此这使得单个=
更加突出。实际上,这介于错误和误导之间。赋值仅计算为其RHS。例如,如果geo
是一个属性,那么它可能有一个getter,但是在计算if
条件时永远不会调用该getter。然后你说geo将被强制为布尔值。这也是不正确的。正确的说法是“ifgeo
是真实的”,这与强制使用布尔值截然不同。例如,{valueOf:false}
是真实的,但是当强制为布尔值时是虚假的。
if (true)
always do this
if (false)
never do this
// loop will break when v = 0
var v = 10
while (v) {
if (v)
do something...
v--;
}