Java脚本中的“&&”运算符与Java中的运算符
'&&' operator in Javascript vs in Java
我目前正在阅读Java来自Java脚本:权威指南的脚本。在第76页,写着这样一句话,
o && o.x // => 1: o is truthy, so return value of o.x
作为一名 Java 程序员,我想问一下,为什么 returning 1 而不是 'true'
在 Java 中,情况并非如此,但无论如何我知道 Java脚本不同,但逻辑与机制在任何地方都是相同的。(在 C 中,returns 1 为真。)
我想问的是,为什么这种行为完全有意义?
有什么办法,我可以确保 return 只有 true 或 false 值?
您可以使用 Boolean(o && o.x);
获得 true
或 false
的规范
The value produced by a && or || operator is not necessarily of type
Boolean. The value produced will always be the value of one of the two
operand expressions.
这是 javascript 中经常使用的功能,一个常见的用例是为未定义的变量分配默认值。就像假设您期望一个选项对象作为参数但不是强制性的,因此用户可能不会传递它
function x(options){
options = options || {};
//now your can access optionx.a without fearing whether options is undefined
}
您可以像 !!(o && o.x)
这样的操作来始终获得 true/false
如果我们有:
expr1 && expr2
&& Returns 'expr1'是否可以转换为false;否则,returns 'expr2'。因此,当与布尔值一起使用时,如果两个操作数都为真,则 && returns 为真;否则,returns 错误。
所以如果我们有:
Var xyz = a && b;
//其中a为undefined(false),b为123,则分配undefined.
在 if 语句的情况下,这些值专门转换为布尔值。
参考以下link:“https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators”
这是return计算右操作数的值。如果 o.x
的值为 true
,它将 return true
。如果 o.x
的值为 'banana'
,它将 return 'banana'
。
var o = {x:true};
console.log(o && o.x);
技术上 &&
运算符实现为 return 第一个操作数,如果它的值不为零, return 是第二个操作数,否则在许多语言中包括 Java, C/C++, Javascript, Perl...
虽然大多数语言都接受任何类型的操作数,但 Java 强制您使用布尔操作数,因此它始终 return 为真或假。
为了在 Java 脚本中强制使用布尔结果:
Boolean(a && b)
这种行为称为强制。强制是强制一个对象像其他类型一样表现的行为,逻辑运算符在试图访问要评估的对象的值时可以产生强制。
重要的是要记住 truthy 和 falsy 值的 table,因为由于强制转换,不同的结果可能获得。
false
产生 false
0
产生 false
“”
产生 false
NaN
产生 false
null
产生 false
undefined
产生 false
其他所有内容都会生成 true
,包括文本 "0"
和 "false"
、函数、数组和空对象。
给定逻辑运算符的规则,在 JavaScript 中存在 短路 评估,例如:
0 && 1; //-> 0, falsy value
!(0 && 1); //-> true, falsy value negated
!!(0 && 1); //-> false, boolean falsy value
void 0 && alert("1") //-> undefined (void produces undefined)
[] && Math.ceil(9.1) //-> 10, truthy value
{} && someFunc() //-> the result of someFunc()
0 || null; //-> null, falsy value
null || "0"; //-> "0", truthy value
"" || void 1; //-> undefined, falsy value
!!(+"5px" || {}); //-> true, boolean truthy value
当您必须验证默认值以防止错误时,强制转换很有用,例如
function divide (a, b) {
a = +a; //-> coerced to number
b = +b; //-> coerced to number
if (!a) return 0; //-> NaN or zero
return b && a / b; //-> b must be a number different from zero
}
divide(); //-> 0
divide(5); //-> NaN, no error thrown!
divide(5, "a"); //-> NaN, no error thrown!
divide(5, 0); //-> 0, division by zero prevented!
divide(49, 6); //-> 8.1666
如果你想阻止returning NaN
,只需在return语句中添加另一个强制转换:
return (b && a / b) || 0;
您可以查看其他强制转换案例:JavaScript Coercion
编码愉快!
我目前正在阅读Java来自Java脚本:权威指南的脚本。在第76页,写着这样一句话,
o && o.x // => 1: o is truthy, so return value of o.x
作为一名 Java 程序员,我想问一下,为什么 returning 1 而不是 'true'
在 Java 中,情况并非如此,但无论如何我知道 Java脚本不同,但逻辑与机制在任何地方都是相同的。(在 C 中,returns 1 为真。)
我想问的是,为什么这种行为完全有意义?
有什么办法,我可以确保 return 只有 true 或 false 值?
您可以使用 Boolean(o && o.x);
获得 true
或 false
The value produced by a && or || operator is not necessarily of type Boolean. The value produced will always be the value of one of the two operand expressions.
这是 javascript 中经常使用的功能,一个常见的用例是为未定义的变量分配默认值。就像假设您期望一个选项对象作为参数但不是强制性的,因此用户可能不会传递它
function x(options){
options = options || {};
//now your can access optionx.a without fearing whether options is undefined
}
您可以像 !!(o && o.x)
这样的操作来始终获得 true/false
如果我们有:
expr1 && expr2
&& Returns 'expr1'是否可以转换为false;否则,returns 'expr2'。因此,当与布尔值一起使用时,如果两个操作数都为真,则 && returns 为真;否则,returns 错误。
所以如果我们有:
Var xyz = a && b;
//其中a为undefined(false),b为123,则分配undefined.
在 if 语句的情况下,这些值专门转换为布尔值。
参考以下link:“https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators”
这是return计算右操作数的值。如果 o.x
的值为 true
,它将 return true
。如果 o.x
的值为 'banana'
,它将 return 'banana'
。
var o = {x:true};
console.log(o && o.x);
技术上 &&
运算符实现为 return 第一个操作数,如果它的值不为零, return 是第二个操作数,否则在许多语言中包括 Java, C/C++, Javascript, Perl...
虽然大多数语言都接受任何类型的操作数,但 Java 强制您使用布尔操作数,因此它始终 return 为真或假。
为了在 Java 脚本中强制使用布尔结果:
Boolean(a && b)
这种行为称为强制。强制是强制一个对象像其他类型一样表现的行为,逻辑运算符在试图访问要评估的对象的值时可以产生强制。
重要的是要记住 truthy 和 falsy 值的 table,因为由于强制转换,不同的结果可能获得。
false
产生false
0
产生false
“”
产生false
NaN
产生false
null
产生false
undefined
产生false
其他所有内容都会生成 true
,包括文本 "0"
和 "false"
、函数、数组和空对象。
给定逻辑运算符的规则,在 JavaScript 中存在 短路 评估,例如:
0 && 1; //-> 0, falsy value
!(0 && 1); //-> true, falsy value negated
!!(0 && 1); //-> false, boolean falsy value
void 0 && alert("1") //-> undefined (void produces undefined)
[] && Math.ceil(9.1) //-> 10, truthy value
{} && someFunc() //-> the result of someFunc()
0 || null; //-> null, falsy value
null || "0"; //-> "0", truthy value
"" || void 1; //-> undefined, falsy value
!!(+"5px" || {}); //-> true, boolean truthy value
当您必须验证默认值以防止错误时,强制转换很有用,例如
function divide (a, b) {
a = +a; //-> coerced to number
b = +b; //-> coerced to number
if (!a) return 0; //-> NaN or zero
return b && a / b; //-> b must be a number different from zero
}
divide(); //-> 0
divide(5); //-> NaN, no error thrown!
divide(5, "a"); //-> NaN, no error thrown!
divide(5, 0); //-> 0, division by zero prevented!
divide(49, 6); //-> 8.1666
如果你想阻止returning NaN
,只需在return语句中添加另一个强制转换:
return (b && a / b) || 0;
您可以查看其他强制转换案例:JavaScript Coercion
编码愉快!