Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.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 JS类型强制是如何工作的?_Javascript_Equality_Coercion - Fatal编程技术网

Javascript JS类型强制是如何工作的?

Javascript JS类型强制是如何工作的?,javascript,equality,coercion,Javascript,Equality,Coercion,我正在学习===与===的对比,并且发现了这一点,这对理解这个概念非常有帮助。然而,我想知道其中一个例子: '0' == false // true 这可能有道理,因为==不会检查类型。但随后我在控制台中尝试了一些可能的强制操作,并发现以下情况: Boolean('0') // true String(false) // "false" 我本以为'0'==false与'0'==String(false)具有相同的真值,但事实似乎并非如此 那么强制到底是如何起作用的呢?是

我正在学习
===
===
的对比,并且发现了这一点,这对理解这个概念非常有帮助。然而,我想知道其中一个例子:

'0' == false     // true
这可能有道理,因为
==
不会检查类型。但随后我在控制台中尝试了一些可能的强制操作,并发现以下情况:

Boolean('0')     // true
String(false)    // "false"
我本以为
'0'==false
'0'==String(false)
具有相同的真值,但事实似乎并非如此

那么强制到底是如何起作用的呢?是否缺少更基本的类型?

“0”是一个包含字符0的字符串,它不是数值
0
。计算结果为
false
的唯一字符串类型值是

“0”

定义如何将不同类型转换为布尔类型:

参数类型结果
未定义的错误
空-假
布尔值:结果等于输入参数(无转换)。
Number如果参数为+0,则结果为false,−0,或NaN;否则
结果是真的。
字符串如果参数为空字符串(其长度为
零);否则,结果是正确的。
对象真实
但是,只有在使用
==
进行比较时,才严格遵循这一点

使用
布尔('0')
时,您正在将值
'0'
转换为布尔值(这与使用
!!'0'
相同)。将
'0'
false
进行粗略比较时,布尔值将转换为一个数字(如定义的)
false
在转换为数字时变为
0
。这意味着最终的计算是
'0'==0
,这等于
true

要总结以上ECMAScript规范链接部分的相关部分,请执行以下操作:

  • 设x=
    '0'
    和y=
    false
  • 检查y的类型是否为布尔型
  • 如果为true,请将y转换为数字
  • 将x与y的等效数值进行比较
  • 在我们的例子中,这方面的JavaScript实现是:

    var x = '0',                      // x = "0"
        y = false;                    // y = false
    
    if (typeof y === "boolean") {
        y = +y;                       // y = 0
    }
    
    console.log( x == y );            // "0" == 0
    
    ->true
    
    为了让编程界的全新事物更加混乱:

    Boolean('false')
    true
    
    Boolean('true')
    true
    
    我认为使用
    更简单、更直观运算符。我不知道我是否理解,但我从未使用过
    Boolean()


    回答这个问题时,我发现线程很有用:

    String(false)返回false的字符串表示形式,而Boolean('0')将字符串“0”转换为true(因为非空字符串是truthy)回答了您在这里可以找到的所有问题:一开始有点难读,但您会受益匪浅,如果你花点时间通读。一些。对不起,我还是很困惑。如果“0”是真的,那么
    '0'==false
    怎么可能是真的呢?请看下面的答案:谢谢@james donnelly!这个链接正是我想要的,但我并不知道:)@LucyBain我在我的答案中添加了一个小的更新,希望能让一切都清楚。ECMAScript规范的关键部分是,特别是第6点和第7点。@LucyBain一天的工作很慢,因此我还添加了一个JavaScript方法,说明如何应用ECMAScript的定义,即如何使用
    ==
    进行比较。这就是我从哪里得到示例的问题,但我无法理解它是如何工作的。现在我将坚持使用
    =
    :)