Javascript Can';我不理解条件执行流
一个简单的js代码段。为什么它总是保持警惕 “结果为空” 根据我的理解,Javascript Can';我不理解条件执行流,javascript,Javascript,一个简单的js代码段。为什么它总是保持警惕 “结果为空” 根据我的理解,if块应该执行,因为结果=“为true并发出警报 “结果不是空的” <script> var result = false; if(result != "") alert('result is not empty') else alert('result is empty') </script> var结果=假; 如果(结果!=“”) 警报('结果不为空') 其他的 警报('结果为空') 这是因为
if
块应该执行,因为结果=“
为true
并发出警报
“结果不是空的”
<script>
var result = false;
if(result != "")
alert('result is not empty')
else
alert('result is empty')
</script>
var结果=假;
如果(结果!=“”)
警报('结果不为空')
其他的
警报('结果为空')
这是因为=代码>执行隐式类型转换。如果您使用的是严格版本,==代码>,它将执行您期望的操作。但是松散的版本,=
,将这两个操作数都转换为数字,而和false都将转换为0
,因此!=false
为false,因为它(通过一系列卷积)最终为0!=0
规范中的算法对此进行了详细阐述:
返回一个brupt(x)
返回初始值(y)
如果类型(x)与类型(y)相同,则
返回执行严格相等比较的结果x==y
如果x为null而y未定义,则返回true
如果x未定义且y为null,则返回true
如果类型(x)是数字,类型(y)是字符串,
返回比较结果x==ToNumber(y)
如果类型(x)是字符串,类型(y)是数字,
将比较结果返回到数字(x)=y
如果类型(x)是布尔值,则返回比较结果tonNumber(x)==y
如果类型(y)是布尔值,则返回比较结果x==ToNumber(y)
如果类型(x)是字符串、数字或符号,而类型(y)是对象,则
返回比较结果x==ToPrimitive(y)
如果类型(x)是对象,类型(y)是字符串、数字或符号,则
返回比较结果ToPrimitive(x)==y
返回false
从上面我们可以看到,如果我们从false
和“
开始,那么:
- 我们按照步骤8,将
false
转换为0
,然后从0!=“”
- 我们按照第6步,将
“
转换为0
,然后从0!=0
- 我们按照步骤3得到结果
false
(因为我们正在做!=
,而算法是根据=
定义的)
这是因为
=代码>执行隐式类型转换。如果您使用的是严格版本,==代码>,它将执行您期望的操作。但是松散的版本,=
,将这两个操作数都转换为数字,而和false都将转换为0
,因此!=false
为false,因为它(通过一系列卷积)最终为0!=0
规范中的算法对此进行了详细阐述:
返回一个brupt(x)
返回初始值(y)
如果类型(x)与类型(y)相同,则
返回执行严格相等比较的结果x==y
如果x为null而y未定义,则返回true
如果x未定义且y为null,则返回true
如果类型(x)是数字,类型(y)是字符串,
返回比较结果x==ToNumber(y)
如果类型(x)是字符串,类型(y)是数字,
将比较结果返回到数字(x)=y
如果类型(x)是布尔值,则返回比较结果tonNumber(x)==y
如果类型(y)是布尔值,则返回比较结果x==ToNumber(y)
如果类型(x)是字符串、数字或符号,而类型(y)是对象,则
返回比较结果x==ToPrimitive(y)
如果类型(x)是对象,类型(y)是字符串、数字或符号,则
返回比较结果ToPrimitive(x)==y
返回false
从上面我们可以看到,如果我们从false
和“
开始,那么:
- 我们按照步骤8,将
false
转换为0
,然后从0!=“”
- 我们按照第6步,将
“
转换为0
,然后从0!=0
- 我们按照步骤3得到结果
false
(因为我们正在做!=
,而算法是根据=
定义的)
Javascript检查真实值
false != ""
是假的
false !== ""
是true,因此您可以尝试使用。Javascript检查truthy值
false != ""
是假的
false !== ""
是真的,所以你可以试试看。在javascript中,两个错误是相等的,就像在本例中,结果!=“
产生false
您需要使用严格的比较,即==
进行比较<代码>结果!==“
产生true
在javascript中,两个错误可以相等,在本例中,结果!=“
产生false
您需要使用严格的比较,即==
进行比较<代码>结果!==“
产生true
因为”“是一个虚假的值。@jalooc不,这不是reason@Bergi当然是:=代码>强制转换值,以便false!=''
解析为false
@jalooc,但它将“
转换为一个数字(数字(“”
),而不是布尔值(布尔值(“”
),所以它的错误性并不重要。@Bergi“0”数字仍然是错误的,不是吗?只需执行false!=''代码>在devtools控制台中。您将得到false
,而不是true
,正如您在问题中错误地陈述的那样。因为“”是一个错误的值。@jalooc不,这不是reason@Bergi当然是:=代码>强制转换值,以便false!=''
解析为false
@jalooc,但它将“
转换为一个数字(数字(“”
),而不是布尔值(布尔值(“”
),所以它的错误性无关紧要。@Bergi“0”数字仍然是错误的,不是吗