05-JavaScript运算符

运算符基本概念

  • JavaScript运算符的概念和C语言一样, 都是告诉程序执行特定算术或逻辑操作的符号。

运算符分类

  • JavaScript运算符的分类和C语言也一样

  • 按照功能划分:

    • 算术运算符
    • 位运算符
    • 关系运算符
    • 逻辑运算符
  • 运算符根据参与运算的操作数的个数分为

    • 单目运算
    • 双目运算
    • 三目运算

运算符的优先级和结合性

  • 优先级
    • JavaScript运算符的优先级和C语言也一样
    • JavaScript中,运算符的运算优先级共分为15 级。1 级最高,15 级最低。
    • 在表达式中,优先级较高的先于优先级较低的进行运算。
    • 在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理
运算符 描述
() 表达式分组
++ -- - ~ ! 一元运算符
* / % 乘法、除法、取模
+ - + 加法、减法、字符串连接
<< >> >>> 移位
< <= > >= 小于、小于等于、大于、大于等于
== != === !== 等于、不等于、严格相等、非严格相等
& 按位与
^ 按位异或
| 按位或
&& 逻辑与
|| 逻辑或
?: 条件
= += -= *= /= %= 赋值运算
, 多重求值
  • 结合性
    • JavaScript运算符的结合性和C语言也一样
    • 即左结合性(自左至右)和右结合性(自右至左)。

算术运算符

  • JavaScript算术运算符和C语言也一样
名称 符号 说明
加法运算符 + 对两个值进行加法运算,并将结果返回
减法运算符 - 对两个值进行减法运算,并将结果返回
乘法运算符 * 对两个值进行乘法运算,并将结果返回
除法运算符 / 对两个值进行除法运算,并将结果返回
求余运算符 (模运算符) % 对两个值进行取余运算,并将结果返回
  • 基本使用和C语言一模一样
        var res1 = 1 + 1;
        var res2 = 1 - 1;
        var res3 = 2 * 2;
        var res4 = 10 / 3;
        var res5 = 10 % 3;
        console.log(res1); // 1
        console.log(res2); // 0 
        console.log(res3); // 4
        console.log(res4); // 3.3333
        console.log(res5); // 1
    

  • 注意点:
    • 和C语言不同的是JavaScript中整数除以整数结果是小数

          var res4 = 10 / 3;
          console.log(res4); // 3.3333
      
    • 任何值和NaN做运算都得NaN

      var result = 2 + NaN;
      console.log(result); //NaN
      
    • 非Number类型的值进行运算时,会将这些值转换为Number然后在运算

      var result = true + 1; // + - * /  %
      console.log(result); // 2
      result = true + false;
      console.log(result); // 1
      result = 2 + null; 
      console.log(result);// 2
      
    • 任何的值和字符串做加法运算,都会先转换为字符串,然后再和字符串做拼串的操作

      var result = 1 + "123";
      console.log(result); // 1123
      result = 2 + "true";
      console.log(result); // 2true
      
    • 任何的值和字符串做- * / %法运算, 都会先转换为字符串转换为Number

      var result = 2 - "1"; // - * /  %
      console.log(result); // 1
      result = "2" - "1";
      console.log(result); // 1
      
    • 取余运算m%n, n等于0 返回NaN, 其它和C语言一样

      var result = 10 % 0;
      console.log(result); // NaN
      

正负运算符

    • 正号
    • + 正号不会对数字产生任何影响
      var num = 123;
      num = +num;
      console.log(num); // 123
      
    • 对于非Number类型的值,会将先转换为Number,然后再运算
      var bool = true;
      var res = +bool;
      console.log(res); // 1
      
      var str = "123";
      res = +str;
      console.log(res); // 123
      
      var str2 = "123abc";
      res = +str2;
      console.log(res); // NaN, 所以内部不是调用parseInt, 而是Number()函数
      
      var temp = null;
      res = +temp;
      console.log(res); // 0
      
  • 负号
    • - 负号可以对数字进行负号的取反
      var num = 123;
      num = -num;
      console.log(num); // -123
      

赋值运算符

  • JavaScript赋值运算符和C语言也一样
优先级 名称 符号 说明
14 赋值运算符 = 双目运算符,具有右结合性
14 除后赋值运算符 /= 双目运算符,具有右结合性
14 乘后赋值运算符 (模运算符) *= 双目运算符,具有右结合性
14 取模后赋值运算符 %= 双目运算符,具有右结合性
14 加后赋值运算符 += 双目运算符,具有右结合性
14 减后赋值运算符 -= 双目运算符,具有右结合性

自增自减运算符

  • JavaScript自增自减运算符和C语言也一样
优先级 名称 符号 说明
2 自增运算符(在后) i++ 单目运算符,具有左结合性
2 自增运算符(在前) ++i 单目运算符,具有右结合性
2 自减运算符(在后) i-- 单目运算符,具有左结合性
2 自减运算符(在前) --i 单目运算符,具有右结合性

关系运算符

  • JavaScript关系运算符和C语言也一样
  • 和C语言不同的是, JavaScript中的关系运算符只会返回true或false
优先级 名称 符号 说明
6 大于运算符 > 双目运算符,具有左结合性
6 小于运算符 < 双目运算符,具有左结合性
6 大于等于运算符 >= 双目运算符,具有左结合性
6 小于等于运算符 <= 双目运算符,具有左结合性
7 等于运算符 == 双目运算符,具有左结合性
7 不等于运算符 != 双目运算符,具有左结合性
7 不等于运算符 === 双目运算符,具有左结合性
7 不等于运算符 !== 双目运算符,具有左结合性
  • 注意点:
    • 对于非数值进行比较时,会将其转换为数字然后在比较
      console.log(1 > true); //false
      console.log(1 > false); //true
      console.log(1 > "0"); //true
      console.log(1 > null); //true
      
    • 如果符号两侧的值都是字符串时,不会将其转换为数字进行比较, 而会分别比较字符串中字符的Unicode编码
    • Unicode编码转换地址
      // a的Unicode编码是:0061
      // b的Unicode编码是:0062
      console.log("a" < "b");//true
      
      // 比较多位时则是从前往后一位一位比较
      // 第一位相同比较第二位, 直到比较到不一样或者结束为止
      // c的Unicode编码是:0063
      // 类似于C语言strcmp函数, 只不过JavaScript中比较的是Unicode编码
      console.log("ab" < "ac");//true
      
    • null、undefined 、NaN比较
      console.log(null == 0); // false
      console.log(undefined == 0); // false
      // 永远不要判断两个NaN是否相等
      console.log(NaN == NaN); // false
      
      /*
       * 可以通过isNaN()函数来判断一个值是否是NaN
       *    如果该值是NaN则返回true,否则返回false
       */
      var num = NaN;
      console.log(isNaN(num)); // true
      
      // undefined 衍生自 null, 所以返回true
      console.log(null == undefined); // true;
      console.log(null === undefined); // false;
      
      // == 判断值是否相等
      // == 会进行数据类型转换
      console.log("123" == 123); // true
      // === 判断值和类型时候同时相等
      // === 不会进行数据类型转换
      console.log("123" === 123); // false
      

逻辑运算符

  • JavaScript逻辑运算符和C语言也一样
优先级 名称 符号 说明
2 逻辑非运算符 ! 单目运算符,具有右结合性
11 逻辑与运算符 && 双目运算符,具有左结合性
12 逻辑或运算符 || 双目运算符,具有左结合性
  • 注意点:
    • 对于非Boolean类型的数值, 逻辑运算符会将其悄悄咪咪转换为Boolean类型来判断

    • 逻辑与

      • 如果条件A不成立, 则返回条件A的数值本身
      • 如果条件A成立, 不管条件B成不成立都返回条件B数值本身
      result =  null && 0;
      console.log(result); // null
      var result =  "123" && "abc";
      console.log(result); // "abc"
      result =  "123" && 0;
      console.log(result); // 0
      
    • 逻辑或

      • 如果条件A不成立, 则不管条件B成不成立都返回条件B数值本身
      • 如果条件A成立, 则返回条件A的数值本身
      var  result =  null || 0;
      console.log(result); // 0
      result =  "123" || "abc";
      console.log(result); // "123"
      result =  "123" || 0;
      console.log(result); // "123"
      

逗号运算符

  • JavaScript逗号运算符和C语言也一样
  • 逗号运算符会从左至右依次取出每个表达式的值, 最后整个逗号表达式的值等于最后一个表达式的值
  • 格式: 表达式1,表达式2,… …,表达式n;
    var a, b, c, d;
    /*
    1.先计算表达式1, a = 2
    2.再计算表达式2, b = 12
    3.再计算表达式3, c = 5
    4.将表达式3的结果返回给d
    */
    d = (a = 1 + 1,b = 3 * 4, c = 10 / 2);
    console.log(d); // 5
    

三目运算符(条件运算符)

  • JavaScript三目运算符和C语言也一样
  • 格式: 条件表达式 ? 语句1 : 语句2;
    // 弹第一个
    true?alert("语句1") : alert("语句2");
    // 弹第二个
    false?alert("语句1") : alert("语句2");
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容