JavaScript操作符(|、||、&、&&)

位操作符( | 和 & )

var number = 2;
var logic = number < 5 | number > 0;
    
console.log(number < 5);  // 结果返回 true
console.log(logic);  // 结果返回 1

结果并没有返回 布尔值,而是数值

var logic = true | true;
console.log(logic);  //结果返回 1

可以看到结果还是返回一个数值,也就是说JavaScript位操作符只有一个功能:进行位运算

如果使用位操作符去操作非数值

/* 测试类型1 */
var str1 = '9';
var str2 = '5';
console.log(str1 & str2);  // 结果为 1
console.log(typeof (str1 & str2)); //结果为 number 类型

/* 测试类型2 */
var number1 = 9;
var number2 = 5;
console.log(number1 & number2); 结果为 1


/* 测试类型3 */
var obj1 = {
    valueOf: function() {
        return 9;
    }
}
var obj2 = {
    valueOf: function() {
        return 5;
    } 
}
console.log(obj1 & obj2); // 结果为 1

如果操作数不是数值类型,就会根据一定规则把它转换成数值,若不能转化成数值则为NaN。

如果是NaN或者正负无穷:

console.log(NaN & NaN);  // 结果为 0
console.log('stirng' & 'string');  // 字符串转换为NaN,结果为 0
console.log(10 & NaN);  // 10 & 0,结果为 0

console.log(-Infinity & -Infinity);  // 结果为 0

因此有:

  • JS中位操作符只能当做数值进行位运算,若操作数为非数值,则转换为数值
  • 若操作number类型的 NaN、-Infinity、Infinity 则会被转换会数值 0

逻辑操作符(||和&&)

JavaScript中逻辑操作符可以操作 ECMAScript中的任何值 ,同时也不强制返回boolean类型。

  1. 逻辑或(||)

    • 只要第一个值的布尔值为false,那么永远返回第二个值,不管第二个值的布尔值是true还是false

      console.log(0 || '我是string,boolean值为true');          // 返回字符串
      console.log(NaN || '我是string,boolean值为true');        // 返回字符串
      console.log('' || '我是string,boolean值为true');         // 返回字符串
      console.log(null || '我是string,boolean值为true');       // 返回字符串
      console.log(undefined || '我是string,boolean值为true');  // 返回字符串
      
      console.log(0 || 'NaN');           // 返回 NaN
      console.log(NaN || '');            // 返回 '' 空字符串
      console.log('' || null);           // 返回 null
      console.log(null || 'undefined');  // 返回 undefined
      console.log(undefined || 0);       // 返回 0
      
    • 属于短路操作,第一个值为true时,不再操作第二个值,且返回第一个值

      var obj = {};
      console.log(obj || NaN);      // 返回 obj
      console.log(obj || number);   // 返回 obj,未定义变量不会报错
      console.log( 0 || number);    // 报错,number未定义
      
  2. 逻辑与(&&)

    • 只要第一个值的布尔值为true,那么永远返回第二个值

      var obj = {};
      var str = 'Riny';
      
      /* 当第一个值的布尔值为true 返回第二个值 */
      console.log(obj && 0);          // 返回 0
      console.log(obj && NaN);        // 返回 NaN
      console.log(obj && '');         // 返回 '' 空字符串
      console.log(obj && undefined);  // 返回 undefined
      console.log(obj && null);       // 返回 null
      
      /* 当第一个值的布尔值为true 返回第二个值 */
      console.log(obj && str);        // 返回 字符串
      
    • 短路操作,第一个值为false时,不再操作第二个值,且返回第一个值

      var obj = {};
      console.log(0 && obj);               // 返回 0
      console.log(NaN && obj);             // 返回 NaN
      console.log('' && obj);              // 返回 '' 空字符串
      console.log(null && obj);            // 返回 null
      console.log(undefined && obj);       // 返回 undefined
      // number 未定义
      console.log(undefined && number);    // 返回 undefined 不会报错
      

非非非常好记!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

eynoZzzzc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值