JavaScript: 表达式中非布尔值的隐式转换
JavaScript: Implicit conversions of non boolean values in expressions
我的问题与三个link有关(以下3link中的代码截图和解释):
List of values which, when converted to boolean, are evaluated as false
First and Second code boxes (see below)
Third code box and explanation (see below)
我的问题分为几个部分:
(第一个代码框) var boo
如何以及为什么等于 'world'
而不是 'hello'
?根据第一张图片,两个值都应该被评估为true
,那么为什么它们中的任何一个都等于boo
?
(2nd code box) 这比上一个更有意义。但是,为什么等式的结果默认为等式的 true
部分而不是 false
?
(第 3 个代码框) 现在这非常令人困惑。我试图理解代码框下方的解释,但我无法弄清楚其中的原因。通过解释:
一个。第一行中的 myNumber = false
:这部分是有意义的,因为值 "1"
,因为逻辑运算符 !
,被转换为布尔值,这使得它变成:true
.因此,!1
在布尔值中的意思是:!true
(不正确),这是错误的。
b。 myNumber !=== null
,因为它等于 false
。这就是令人困惑的地方。 null
不能等于 false
的唯一方法是如果 null
不是此特定代码行中的值(首先参见 link 列出的 null
在评估为 false
的值列表中)。解释里面说"In the if statement, at line 3, false does not equal null."好像自相矛盾
c。 myNumber === false
,因此它被赋值2
。这里它再次给变量 true
值,而不是仅仅说变量是 false
("again" 是对 link #2 的引用 - 第二个代码box)这是为什么?
提前感谢您的帮助!
贝西麦克
变量 boo
的计算结果为 'world'
而不是 'hello'
的原因是因为 &&
运算符。该运算符基本上表示 如果第一个值的计算结果为 true
,则取第二个值。
本质上与 &&
运算符相反,如果第一个值的计算结果为 false
[,||
运算符 将采用第二个值=40=].
false
和 null
在测试相等性时仍然是不同的值。尽管在布尔测试中它们都被评估为 false
,但这些值不同并且相等性检查失败。测试相等性与测试 true
或 false
是不同的操作。您解释的 c
部分可以追溯到第二个问题的答案,其中 ||
运算符采用第二个值,因为第一个值的计算结果为 false
.
我希望这些可以帮助阐明您的问题。
您需要了解 &&
和 ||
运算符的作用。它们被称为布尔运算符,因为它们对输入的布尔值进行运算,但不修改实际值,因为 Javascript 是动态类型的。这很重要,因为 returning 原始输入值比 returning 布尔值更好,因为它们都将评估为相同的布尔值,但如果运算符转换了,您将丢失信息输入到布尔输出。
1) var boo = 'hello' && 'world'
&&
(与)运算符的逻辑是对第一个输入进行求值,如果求值为false
,则return,否则return第二个值。就是这样,就是合同。
在这种情况下,由于 'hello'
为真,它立即 returns 'world'
。
2) var boo2 = (0/0) || 43.2
||
(或)运算符的逻辑与 &&
(和)运算符相反,因为它计算第一个输入,如果该输入为 true ,然后 return 它,否则 return 第二个值。
正如您所见,(0/0)
的计算结果为 false,因此它立即 return 成为第二个值。
3)
1| var myNumber = !1;
2|
3| if (myNumber == null) {
4| myNumber = 3
5| }
6|
7| myNumber = myNumber || 2
这里的问题又是理解运算符的作用,==
相等运算符 不是 布尔运算符,因此它不会将输入计算为进行比较之前的布尔值。所以在第 3 行,您实际上是在询问布尔值 false
是否等于 null
对象。在这种情况下,它不是。
最后,对于 myNumber = myNumber || 2
行,只需参考我上面关于 ||
(或)运算符的作用的评论,它就会有意义。
注意:如果您希望将这些表达式计算为布尔值,您可以使用以下语法将它们转换为布尔值:
var boo = !!('hello' && 'world');
'!'取反表达式并将其转换为布尔值,再次取反为其提供正确的值。
好问题!
我的回答
完成left to right
的Logical AND (&&) could be used for a Short-circuit evaluation。此逻辑运算符 return 是 second 真值(如果存在)。如果不只是 return false.
- true &&(任何值)短路评估为 true 但 returns 任何值。
- false &&(任何东西)被短路评估为 false 并且 returns false。
如left to right
所述的Logical OR (||) could be used too for a Short-circuit evaluation。此逻辑运算符 return 是 第一个 真值。
- var foo = 'Cat' || 'Dog' // =>>>>> foo = "Cat"
- var foo2 = 'Cat' || false ' // =>>>>> foo2 = "Cat"
- var foo3 = '' || false // =>>>>> foo3 = false
之所以var boo2 = (0/0) || 43.2 return 43.2 是因为 (0/0) 被评估为 NaN 并且在这种情况下第一个真实值将是 43.2.
第一行中的 myNumber 不是 true,换句话说是 false。在第三行,将 myNumber 的当前值与 null 进行比较。然后因为 null 不是 false 并且类型不相等 ,if 语句不会被执行并且代码会继续执行直到第 7 行。在第 7 行中发生了答案 2 中解释的内容。
var boo = !1
console.log('var boo with value ', boo + ' is a ', typeof(boo))
console.log('Null is an ', typeof(null), ' but false is a ', typeof(!true))
console.log(typeof(false || true) == typeof(null)) // types are not equal
console.log(!true == null) // so they are not equal
逻辑规则保证这些评估总是正确的。请注意,不会评估上述表达式的任何部分,因此这样做的任何副作用都不会生效。另外,请注意上面表达式的任何部分是任何单个逻辑表达式(如括号所示)。
因为第一张图画错了
null 无法比较等于 true 或 false,它只能隐式比较等于 undefined
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null
继续前进
let foo = A && B
// the above is the same to the one below
function fooFunction(a, b){
if(!a)
return a
else
return b
}
foo 将是 A 的值如果 A 可以被强制转换为 false;否则,它将是 B,类型无关紧要。
let fooA = '' && 'abc' //''
let fooB = 'something' && 'abc' //'abc'
fooA 将是 '' 因为第一个值被强制为 false 而 fooB 会注意到第一个值不能被强制为 false 然后将第二个值分配给它 "abc"
同||
let foo = A || B
foo 将是 A 的值 如果 A 可以被强制为真;否则,它将是 B,类型无关紧要。
第三张图现在应该更容易理解了
我的问题与三个link有关(以下3link中的代码截图和解释):
List of values which, when converted to boolean, are evaluated as false
First and Second code boxes (see below)
Third code box and explanation (see below)
我的问题分为几个部分:
(第一个代码框)
var boo
如何以及为什么等于'world'
而不是'hello'
?根据第一张图片,两个值都应该被评估为true
,那么为什么它们中的任何一个都等于boo
?(2nd code box) 这比上一个更有意义。但是,为什么等式的结果默认为等式的
true
部分而不是false
?(第 3 个代码框) 现在这非常令人困惑。我试图理解代码框下方的解释,但我无法弄清楚其中的原因。通过解释:
一个。第一行中的
myNumber = false
:这部分是有意义的,因为值"1"
,因为逻辑运算符!
,被转换为布尔值,这使得它变成:true
.因此,!1
在布尔值中的意思是:!true
(不正确),这是错误的。b。
myNumber !=== null
,因为它等于false
。这就是令人困惑的地方。null
不能等于false
的唯一方法是如果null
不是此特定代码行中的值(首先参见 link 列出的null
在评估为false
的值列表中)。解释里面说"In the if statement, at line 3, false does not equal null."好像自相矛盾c。
myNumber === false
,因此它被赋值2
。这里它再次给变量true
值,而不是仅仅说变量是false
("again" 是对 link #2 的引用 - 第二个代码box)这是为什么?
提前感谢您的帮助!
贝西麦克
变量
boo
的计算结果为'world'
而不是'hello'
的原因是因为&&
运算符。该运算符基本上表示 如果第一个值的计算结果为true
,则取第二个值。本质上与
&&
运算符相反,如果第一个值的计算结果为false
[,||
运算符 将采用第二个值=40=].false
和null
在测试相等性时仍然是不同的值。尽管在布尔测试中它们都被评估为false
,但这些值不同并且相等性检查失败。测试相等性与测试true
或false
是不同的操作。您解释的c
部分可以追溯到第二个问题的答案,其中||
运算符采用第二个值,因为第一个值的计算结果为false
.
我希望这些可以帮助阐明您的问题。
您需要了解 &&
和 ||
运算符的作用。它们被称为布尔运算符,因为它们对输入的布尔值进行运算,但不修改实际值,因为 Javascript 是动态类型的。这很重要,因为 returning 原始输入值比 returning 布尔值更好,因为它们都将评估为相同的布尔值,但如果运算符转换了,您将丢失信息输入到布尔输出。
1) var boo = 'hello' && 'world'
&&
(与)运算符的逻辑是对第一个输入进行求值,如果求值为false
,则return,否则return第二个值。就是这样,就是合同。
在这种情况下,由于 'hello'
为真,它立即 returns 'world'
。
2) var boo2 = (0/0) || 43.2
||
(或)运算符的逻辑与 &&
(和)运算符相反,因为它计算第一个输入,如果该输入为 true ,然后 return 它,否则 return 第二个值。
正如您所见,(0/0)
的计算结果为 false,因此它立即 return 成为第二个值。
3)
1| var myNumber = !1;
2|
3| if (myNumber == null) {
4| myNumber = 3
5| }
6|
7| myNumber = myNumber || 2
这里的问题又是理解运算符的作用,==
相等运算符 不是 布尔运算符,因此它不会将输入计算为进行比较之前的布尔值。所以在第 3 行,您实际上是在询问布尔值 false
是否等于 null
对象。在这种情况下,它不是。
最后,对于 myNumber = myNumber || 2
行,只需参考我上面关于 ||
(或)运算符的作用的评论,它就会有意义。
注意:如果您希望将这些表达式计算为布尔值,您可以使用以下语法将它们转换为布尔值:
var boo = !!('hello' && 'world');
'!'取反表达式并将其转换为布尔值,再次取反为其提供正确的值。
好问题!
我的回答
完成
left to right
的Logical AND (&&) could be used for a Short-circuit evaluation。此逻辑运算符 return 是 second 真值(如果存在)。如果不只是 return false.- true &&(任何值)短路评估为 true 但 returns 任何值。
- false &&(任何东西)被短路评估为 false 并且 returns false。
如
left to right
所述的Logical OR (||) could be used too for a Short-circuit evaluation。此逻辑运算符 return 是 第一个 真值。- var foo = 'Cat' || 'Dog' // =>>>>> foo = "Cat"
- var foo2 = 'Cat' || false ' // =>>>>> foo2 = "Cat"
- var foo3 = '' || false // =>>>>> foo3 = false
之所以var boo2 = (0/0) || 43.2 return 43.2 是因为 (0/0) 被评估为 NaN 并且在这种情况下第一个真实值将是 43.2.
第一行中的 myNumber 不是 true,换句话说是 false。在第三行,将 myNumber 的当前值与 null 进行比较。然后因为 null 不是 false 并且类型不相等 ,if 语句不会被执行并且代码会继续执行直到第 7 行。在第 7 行中发生了答案 2 中解释的内容。
var boo = !1
console.log('var boo with value ', boo + ' is a ', typeof(boo))
console.log('Null is an ', typeof(null), ' but false is a ', typeof(!true))
console.log(typeof(false || true) == typeof(null)) // types are not equal
console.log(!true == null) // so they are not equal
逻辑规则保证这些评估总是正确的。请注意,不会评估上述表达式的任何部分,因此这样做的任何副作用都不会生效。另外,请注意上面表达式的任何部分是任何单个逻辑表达式(如括号所示)。
因为第一张图画错了
null 无法比较等于 true 或 false,它只能隐式比较等于 undefined
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null
继续前进
let foo = A && B
// the above is the same to the one below
function fooFunction(a, b){
if(!a)
return a
else
return b
}
foo 将是 A 的值如果 A 可以被强制转换为 false;否则,它将是 B,类型无关紧要。
let fooA = '' && 'abc' //''
let fooB = 'something' && 'abc' //'abc'
fooA 将是 '' 因为第一个值被强制为 false 而 fooB 会注意到第一个值不能被强制为 false 然后将第二个值分配给它 "abc"
同||
let foo = A || B
foo 将是 A 的值 如果 A 可以被强制为真;否则,它将是 B,类型无关紧要。
第三张图现在应该更容易理解了