Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript:在条件表达式通常为_Javascript - Fatal编程技术网

javascript:在条件表达式通常为

javascript:在条件表达式通常为,javascript,Javascript,我刚刚遇到一段javascript代码,它在使用逻辑&或逻辑或表达式的地方使用赋值语句: var-geo; 函数getGeoLocation(){ 试一试{ 如果(!!navigator.geolocation){ 返回navigator.geolocation; }否则{ 返回未定义; } }捕获(e){ 返回未定义; } } 如果(geo=getGeoLocation()){ //这是我感兴趣的声明 log('conditional expression was true/truthy');

我刚刚遇到一段javascript代码,它在使用逻辑
&
或逻辑
表达式的地方使用赋值语句:

var-geo;
函数getGeoLocation(){
试一试{
如果(!!navigator.geolocation){
返回navigator.geolocation;
}否则{
返回未定义;
}
}捕获(e){
返回未定义;
}
}
如果(geo=getGeoLocation()){
//这是我感兴趣的声明
log('conditional expression was true/truthy');
}
我的问题是,从
if
语句的角度来看,当
是否计算了
geo=getGeoLocation()
特别是它的结果是什么?这是什么类型的?
是吗

  • 无论函数
    getGeoLocation()
    返回什么?
    (其中类型为truthy/falsy)
  • 这是作业的“结果”吗?i、 e.是否分配了非空的内容?
    (在这种情况下,“结果”可能是布尔值,真/假?)
  • 还是别的什么
我的问题是,从if语句的角度来看,当 geo=getGeoLocation()是否已计算

以下是将要发生的事情的时间顺序步骤:

  • 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将被强制为布尔值。这也是不正确的。正确的说法是“if
geo
是真实的”,这与强制使用布尔值截然不同。例如,
{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--;
}