逻辑“或”运算符 (||)
对两个表达式执行逻辑“或”。
result = expression1 || expression2
如果两个表达式中有一个或两个等于 True,则 result 是 True。(expression1 执行的结果不为null或undefined或0或空串时,则 result 等于 expression1 的返回值,而expression2 就不再执行了)
JScript 使用下面的规则来把非 Boolean 值转换为 Boolean 值:
1、所有对象都被认为是 true
2、字符串当且仅当为空时才被认为是 false
3、null 和 undefined 被认为是 false
4、数字当且仅当为 0 时才是 false
对两个表达式执行逻辑“或”。
result = expression1 || expression2
如果两个表达式中有一个或两个等于 True,则 result 是 True。(expression1 执行的结果不为null或undefined或0或空串时,则 result 等于 expression1 的返回值,而expression2 就不再执行了)
JScript 使用下面的规则来把非 Boolean 值转换为 Boolean 值:
1、所有对象都被认为是 true
2、字符串当且仅当为空时才被认为是 false
3、null 和 undefined 被认为是 false
4、数字当且仅当为 0 时才是 false
---------------------------------------------------------------
""是最简单的表达式,它不为空、null、undefined、0,因此表达式的值为真(非假)。
分析一下最常见的 if( a>1 || a<10 ){...} ,里面的 if 是怎样执行的呢?假使a等于5,小括号里的表达 式首先 a>1 满足条件,即返回true,至于是不是 a<10 就不在执行。a>1的返回值类型是布尔类型的,刚好满足 if 所 需的参数类型,因此条件语句继续往下执行。
再看:
var a=5;
if( a || b ){...}
小括号里的表达式首先执行 a,其返回值为整数5,即不是0也不是null与undefined,所以或运算表达式忽略了 b 返回 a 的值 5(不是 true也不是false,这点尤需注意),这时相当于 if(5){....},if在判断其参数的返回值类型时把参数值转换为布尔类型,根据规则(如 手册中云)把非布尔类型的值转换为布尔类型,5 的值即为true,因此 if 条件语句继续往下执行。
分析一下最常见的 if( a>1 || a<10 ){...} ,里面的 if 是怎样执行的呢?假使a等于5,小括号里的表达 式首先 a>1 满足条件,即返回true,至于是不是 a<10 就不在执行。a>1的返回值类型是布尔类型的,刚好满足 if 所 需的参数类型,因此条件语句继续往下执行。
再看:
var a=5;
if( a || b ){...}
小括号里的表达式首先执行 a,其返回值为整数5,即不是0也不是null与undefined,所以或运算表达式忽略了 b 返回 a 的值 5(不是 true也不是false,这点尤需注意),这时相当于 if(5){....},if在判断其参数的返回值类型时把参数值转换为布尔类型,根据规则(如 手册中云)把非布尔类型的值转换为布尔类型,5 的值即为true,因此 if 条件语句继续往下执行。
----------------------------------------------------------------------
再看看实际的应用:
function test(a1,a2){
var x = a2 || a1;
//var x = a2===undefined ? a1 : a2;
alert(x);
}
test("abc");
test("abc","def");
第一次执行 test 时只传了一个参数,因此在 test 内部获取的 a2 恒等于 undefined,即类型属于false,或运算将继续执行双 竖线右边的表达式 a1 ,a1的值为字符串"abc",不是false,因此或运算表达式返回 "abc" 并赋值给 x。
对于此类型的表达方法 a2 || a1 可以这样理解:优先取 a2, a1 排后。按这样的理解,看看下面的:
function test(a1,a2,a3,a4,a5){
var x = a5 || a4 || a3 || a2 || a1;
alert(x);
}
test("abc","def","ghi");
var x = a2 || a1;
//var x = a2===undefined ? a1 : a2;
alert(x);
}
test("abc");
test("abc","def");
第一次执行 test 时只传了一个参数,因此在 test 内部获取的 a2 恒等于 undefined,即类型属于false,或运算将继续执行双 竖线右边的表达式 a1 ,a1的值为字符串"abc",不是false,因此或运算表达式返回 "abc" 并赋值给 x。
对于此类型的表达方法 a2 || a1 可以这样理解:优先取 a2, a1 排后。按这样的理解,看看下面的:
function test(a1,a2,a3,a4,a5){
var x = a5 || a4 || a3 || a2 || a1;
alert(x);
}
test("abc","def","ghi");