Skip to content

Latest commit

 

History

History
540 lines (407 loc) · 18.7 KB

File metadata and controls

540 lines (407 loc) · 18.7 KB

表达式,运算符是程序的基础,最简单的

var myName="zhuanbang";

这个就是一个表达式,把等号右边的字符串,赋值到左边myName这个变量名上;表达式在各个类型里会介绍,这里主要总结运算符;

大多数的运算符是有+-==这种标点符号来表现,但是也有一些运算符是由关键字表示的,比如delete和instanceof,不过无论标点符号表示的运算符还是关键字表示的运算符,都是合法的运算符;

运算符;

类似生活中的,加减乘除,是对程序的操作;但是需要注意的是,数学里面的加减乘数等都是对数字而言的,但是在JS里这些都是可以对不同的数据进行操作的,当然这些也是包括数字类型的;

ECMAScript里用于操作数据值的运算符也叫操作符,只是叫法不同,包括算术运算符,位运算,关系运算,相等运算;这些都是可以针对不同类型的值的(比如字符串,数值,布尔,对象)

需要牢记一点:应用对象的时候,运算符通常会调用对象上的valueOf或者toString方法,转成字符串后再次进行操作;

需要注意一点:NaN和任何数操作,结果都返回NaN;

知识点一、算术运算符;

算术运算符包括:+-*/%;

复合赋值运算符:+=、-=、*=、/=、%=

  • +(加号)
    • 功能: - 1、对数字进行代数求和 - 2、对字符串进行连接操作 - 3、将一个数值转换成字符串

    • 字符串拼接 - 字符串+字符串---两者直接拼接 - 字符串+数值---数值转为字符串再拼接 - 如果有一个操作数是对象、数值或布尔值,则调用它们的 toString() 方法取得相应的字符串值,然后再应用前面关于字符串的规则。

      	    var strEmpty="";
      	    var testNum=222;
      	    var targetData=strEmpty+testNum;
      	    console.log(typeof testNum);//number
      	    console.log(typeof targetData);//string
      
      	    //多次运算
      	    var testOne="字符串";
      	    console.log(testOne+2+5);//字符串25
      	    console.log(testOne+(2+5));//字符串7
      

如果数值和字符串一起混,数值类型的用()包裹,提高优先级;否则是字符串+2;计算的结果再+5;

  • -(减号)
    • 功能:
      • 对操作数进行”取反”操作
      • 对数字进行减法操作
      • 将字符串转换成数值--数值型字符串-0;
  • *和/(乘除)
    • 功能:对两个运算数进行乘法(除法)运算;
    • 符号问题:同号得正,异号得负;
    • 如果有一个操作数不是数值,则在后台调用 Number() 将其转换为数值,然后再应用上面的规则。
    • 如果有一个操作数是 NaN ,则结果是 NaN ;
  • %(求余/求模)
    • 功能:返回两个除数的余数

    • 符号问题:和第一个运算数的符号相同;

    • 如果被除数是零,则结果是零;

    • 如果有一个操作数不是数值,则在后台调用 Number() 将其转换为数值,然后再应用上面的规则。

          var times=123453;//求多少分,多少秒;
          var targetTime=parseInt(times/60)+"分"+times%60+"秒";
          console.log(targetTime);
          //思考:等于多少天,多少小时,多少分,多少秒
      
操作数类型和结果类型

运算符通常会根据需要对操作数进行类型转换;比如【*】【/】的时候,可以把字符串转为数值;

console.log("5"+"3");//53
console.log("5"-"3");//2
console.log("5"*"3");//15
console.log("15"/"3");//5
赋值操作符

=:赋值

var a=10;

+=:加赋值

x+=y // x=x+y;

-=:减赋值

x-=y // x=x-y;

*=:乘赋值

x*=y // x=x*y;

/=:除赋值

x/=y // x=x/y;

%=:取余赋值

x%=y // x=x%y;

↑ 返回目录

知识点二、自增与自减;

注意:++i和i++是完全两回事;(递增和递减操作符直接借鉴自 C,而且各有两个版本:前置型和后置型。)

  • 功能相反
    • ++ 对唯一的运算数进行递增操作(每次加1)
    • -- 对唯一的运算数进行递减操作(每次减1)
  • 规则相同
    • 运算数必须是一个变量,数组的一个元素或者对象的属性
    • 如果运算数是非数值的则运算符将它转成数值;(可用于字符串,布尔值,浮点数值和对象)
    • 转换规则是,调用用Number,根据转后的值,再次进行运算;
  • 符号位置决定运算结果
    • 运算数之前,先进行递增(递减)操作,再进行求值;

    • 运算数之后,先求值,再进行递增(递减操作;)

          var num1=20,
              num2= 2,
              num3=30;
          var num4=num1--+num2,
          num5=num1+num2,
          num6=--num3+num2,
          num7=num3+num2;
          console.log(num4 ,num5);//22,21
          console.log(num6 ,num7);//31,31
      
      
          var num=0;
          num=num+2;
          num=num*3;
          num=num/2;
          num++;
          num--;
          num+=1;
          num-=2;
          num*=3;
          num/=2;
          num%3;
          console.log(num);
      

↑ 返回目录

知识点三、关系运算符;

###大小关系检测

运算符
  • <
    • 如果A小于B,则返回true,否则返回值为false;
  • <=
    • 如果A小于等于B,则返回值为true,否则返回false
  • >=
    • 如果A大于等于B,返回true,否则返回值为false
  • >
    • 如果A大于B,则返回true,否则返回值为false

        //关系操作符
        var testNum=3;
        console.log("下面是关系操作符");
        console.log(testNum>1);
        console.log(testNum>=1);
        console.log(testNum<1);
        console.log(testNum<=1);
      
操作规则
  • 数值与数值的比较,比较他们的代数值;

  • 仅一个运算数是数值,将另一个运算数转换成数值,并比较他们的代数值;

  • 字符串间的比较,逐字符比较他们的Unicode数值;//""

  • 如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较;(只要有一个是数值,另外一个无论什么值,都会最终转为数值后再比较)

  • 运算数既非数字也非字符串,返回值为fals e;

  • 与NaN比较,返回值是false;

    console.log("20">"100000");//true
    console.log(null>2);//false
    console.log(NaN>2);//false
    

注意:做关系比较的时候,一定要把值全部转为数值,这是一个很好的习惯;一定要避免2个字符串在一起比较大小;

等值关系检测;( == 和 === )

#####相等比较

  • 操作符
    • == 比较两个运算数的返回值看是否相等;(和正常生活中的=一定要区分开;)
    • != 比较两个运算数的返回值看是否不想等;
  • 类型转换
    • 布尔值
      • True 1;
      • False 0;
    • 对象,调用valueOf() 基本类型
    • 字符串与数值的比较,字符串转换为数值;
  • 比较原则
    • Null与undefined;相等,比较前不做任何转换;
    • NaN,与任何数值都不想等,包括其自身;
    • 对象,是否属于同一个对象
      • 是 ==

      • 否 !=

          var testNum=3;
          console.log("下面是关系操作符");
          console.log(testNum==1);
          console.log(testNum===1);
          console.log(testNum!=1);
        

【我手动画的转换图】

    //转换分析1
    console.log("zhuanbang"?true:false);//true,因为非空的字符串是一个真值;

    //转换分析2
    console.log("zhuanbang"==true);//这个时候输出什么呢?在分析一里非空字符串是一个true,那么非空字符串==true吗?

    //转换分析3
    console.log("zhuanbang"==false);//如果上面的的返回不是true,那么这个会返回true吗?

	//下面的分析的步骤;
    /*转换分析2-解析
    * 1、右边的布尔值会转为数字,true->1;"zhuanbang"==1
    * 2、左边的字符串会转为数字,"zhuanbang"因为里面有字母,所以转换为NaN;NaN==1
    * 3、NaN和任何数据都不想等,包括自己,所以结果是false,并不是true;
    * */

    /*
    * 1、右边的布尔值会转为数字,false->0;"zhuanbang"==0
    * 2、左边的字符串会转为数字,"zhuanbang"因为里面有字母,所以转换为NaN;NaN==0
    * 3、NaN和任何数据都不想等,包括自己,所以结果是false,结果也不是true
    * */
相同比较(也叫绝对相等/全等)
  • 运算符
    • === 比较两个运算数的返回值以及数据类型是否相同;
    • !== 比较两个运算数的返回值以及数据类型是否不相同
  • 比较原则
    • 值类型间比较,只有数据类型相同,且数值相等时才能够相同;
    • 值类型与引用类型比较,肯定不相同,
    • 引用类型间的比较,比较他们的引用值(内存地址)

简单的说,就是x和y比较,如果两者的类型不同,那就没有比较的意义了,直接返回false;

//相同的小分析
console.log("zhuanbang"===true);
console.log("1"===1);
console.log("zhuanbang"==="zhuanbang");
var person1={name:"zhuanbang"};
var person2={name:"zhuanbang"};
console.log(person1===person2);//false, 是不同的引用地址;在堆内存中储存是不一样的; 

↑ 返回目录

知识点四、对象运算符;

  • In 判断左侧运算数是否为右侧运算数的成员;

  • Instancesof 判断对相爱呢个实例是否属于某个类或构造函数

  • New 根据构造函数创建一个新的对象,并初始化该对象

  • Delete 删除指定对象的属性,数组元素或变量

    • 可以删除对象里的属性:

        var myObj = {name: 'aaaa', age: 21};  
        delete myObj.age;  
        console.log(myObj); // 输出对象{name: "aaaa"}  	
      
  • .及[] 存取对象和数组元素

  • () 函数调用,改变运算运算符优先级等;

    ↑ 返回目录

知识点五、逻辑运算符;

!逻辑非:返回值

在JavaScript中,true和false有些复杂。在大多数编程语言中,布尔值true和false仅仅表示true/false。在JavaScript中,如"ssss"这样的字符串值,也可以看作true。

  • 返回值
    • True(表达式或值计算为false的,都可以转为true)

      • 空字符串
      • 0
      • -0;
      • NaN
      • Null
      • Undefined
      • False
    • False(表达式或值计算为true的,都可以转为false)

      • 对象
      • 非空字符串
      • 非0数值(Infinity)
  • 特性;
    • 如果运算数的值为false则返回true,否则返回false;

    • 连续使用两次,可将任意类型转为布尔类型值;(!!相当于Boolean)

      console.log(!true);//false console.log(true && false);//false console.log(true || false);//true

&&逻辑与

规则
  • 只有第一个值是true的时候,才会返回第二个值;第一个值为false,则返回第一个值;意是根据原理来返回的;&&是必须两个都为true才为true的;看取决于哪个值的
    • 第一个操作数的对象,返回第二个操作数(第一个为true了,关键取决于第二个值,所以返回第二个)
    • 第二个操作数是对象,如果想返回第二个对象,第一个必须为true;
    • 如果两个操作数都是对象,第一个是true,则返回第二个操作数;
    • 第一个操作数是null,返回null(第一个null已经是false了,后面第二个值无论是true-还是false已经不重要了,所以返回的是第一个值)
    • 第一个操作数是NaN,返回NaN(原理同上)
    • 第一个操作数是undefined,返回undefined(原理同上)
特性
  • 当且进档两个运算数的值都是true时,才返回true,否则返回false(做if判断的时候)
  • 短路操作,当第一个操作数的值是false,则不再对第二个操作数进行求值(做变量赋值的时候)

||逻辑或

  • 规则:
    • 两个操作数都是false的时候才为false;第一个操作数是true,则返回第一个数;无需对第二个值判断了,已经可以确定为true;如果第一个值为false的时候,返回第二个数;因为第一个已经是false了,值取决于第二个值,所以返回第二个值;
    • 第一个操作数是对象,返回第一个操作数
    • 第一个操作数值为false,返回第二个操作数
    • 两个操作数都是对象,返回第一个操作数
    • 两个操作数都是null,返回null;
    • 两个操作数都是NaN,返回NaN;
    • 两个操作数都是undefined,返回undefined
  • 特性:
    • 当且进档两个运算数的值都是false时,才会烦false,否则返回true;

    • 如果第一个操作数值为true,则不会对第二个操作数进行求值;

        var a="",
            b="B有值";
        var result=a||"A的值是假的",
            result2=b||"B的值是假的";
        console.log(result);
        console.log(result2);
      

↑ 返回目录

知识点六、位运算符

(仅作了解,可以忽略不看,项目中很少用到);

  • 基础知识;
    • 类型;
      • 有符号;
        • 数值位,前31位;
        • 符号位,第32位;
          • 0,整数
          • 1,负数
      • 无符号;
        • 只能是正数
        • 第32位表示数值
        • 数值范围可以加大
    • 数值范围;-2147483648~2147483647
    • 存储方式
      • 正数
        • 纯2进制存储
        • 31位表示数值
        • 数值范围可以加大
      • 负数
        • 2进制补码存储
        • 补码的计算步骤
          • 1、确定该数字的非负版本的二进制表示
          • 2、求得二进制反码,既要把0替换为1,把1替换为0;
          • 3、在二进制反码上加1;
    • 当作0来处理的特殊值
      • NaN
      • Infinity
  • 逻辑位运算
    • 返回值为1,
      • 按位非~ 0
      • 按位与& 对应值全为1
      • 按位或| 任何一位是1
      • 按位异或^ 既不同时为0,也不同时为1;
    • 返回值为0;
      • 按位非~ 1
      • 按位与& 任何一位是0
      • 按位或| 对应位全0;
      • 按位异或^ 对应位全0或全1
  • 位移操作
    • 左移<<
      • 将数值的所有位左移指定的位数
      • 所有空位用0补充
      • 左移1位对其X2,左移2位对其X4;依次类推;
    • 有符号右移>>
      • 将数值的所有位右移指定的位数
      • 一处的位被舍弃
      • 保留符号位
      • 右移一位对齐除2,右移两位对齐除4,依次类推
    • 无符号右移>>>
      • 正数,与有符号右移结果相同
      • 负数,会出现无限大的数值;
  • 复合赋值运算符:位操作符与等号结合,复合赋值不会有性能方面的提升;

& 按位与

| 按位或

~ 按位非

^ 按位异或

<< 按位左移

按位右移

↑ 返回目录

知识点七、其他运算符;

  • ?: 条件运算符,简介的if else;也叫三元运算符/三目运算符;
    • 基本格式为:条件表达式?表达式一:表达式二;

    • 其中问号之前的表示判断的条件,如果这个条件为真,则执行问号后面的语句,如果判断条件不成立,则执行冒号后面的语句;

    • 简单的条件可以用三目运算符写;

        function trueOrFalse(val) {
            return val?console.log(val+" is true"):console.log(val+" is false")
        }
        trueOrFalse(null);
        trueOrFalse(undefined);
        trueOrFalse(0);
        trueOrFalse(NaN);
        trueOrFalse(-0);//0===-0
        trueOrFalse(false);
        trueOrFalse("");
        trueOrFalse(" ");
        trueOrFalse({});
        trueOrFalse([]);
        trueOrFalse(1);
      

三元/三目是根据操作数的个数来分的,比如 a-b,计算2个数属于二元元算数,而-b就是一元运算符(将操作数b求负数,只操作b这个一个数);而?:是计算三个数的,所以叫三元运算符;

而三目是三元的另外一种叫法

上面的利用三元运算符来判断值的真假;

  • typeof,类型判定运算符

      	console.log('typeof num:', typeof num);  
      	console.log('typeof Packt:', typeof 'aaaaaa');  
      	console.log('typeof true:', typeof true);  
      	console.log('typeof [1,2,3]:', typeof [1,2,3]);  
      	console.log('typeof {name:John}:', typeof {name:'sssss'});  	
    
  • ,逗号,在一行语句中执行多个不同的操作 ,一般用于声明多个变量;

    • 忽略第一个操作符,返回第二个操作符;

        var a=,
        	b=4,
        	c=5;
      
        var test=1,2,3,4,5,6,7;//结果test的值是7;
      
  • void,舍弃运算数的值,返回undefined作为表达式的值;

↑ 返回目录

知识点八、=/==/===、!与!!的区别

=、==、===三者的区别;

千万不要把"=="当做"="来使用,

千万不要把"=="当做"="来使用,

千万不要把"=="当做"="来使用,尤其是写if语句的时候一定要注意;

  • =、一个等号是赋值运算,把等号右边的值付给左边的变量,是从右想做计算,并且运算优先级最低;
  • ==。两个等号是比较运算,会得到一个真/假的逻辑只,遇到左右两边是不同的数据类型,默认会进行数据类型转换;
  • ===、三个等号是绝对的相等,只有数据类型一样才有可比性,遇到左右两边数据类型不同,并不会像==一样进行数据类型转换;
!和!!:
  • !是取反的意思;先将其它的数据类型转换为布尔类型;然后在取反;
  • !!是将其他的数据类型转换为不二类型,相当于Boolean;

记住前面说的哪些数据是真,哪些是假就可以了;

0 NaN "" null undefined这些用都是flase

  • 如果操作数是一个对象,返回 false ;
  • 如果操作数是一个空字符串,返回 true ;
  • 如果操作数是一个非空字符串,返回 false ;
  • 如果操作数是数值 0,返回 true ;
  • 如果操作数是任意非 0 数值(包括 Infinity ),返回 false ;
  • 如果操作数是 null ,返回 true ;
  • 如果操作数是 NaN ,返回 true ;
  • 如果操作数是 undefined ,返回 true 。

↑ 返回目录

计算器和表格排序案例;

  • 写一个计算器案例;
  • 表格排序案例;

↑ 返回目录

下面图片是截自权威指南,体现运算符的优先级;

思考题:

  • 123567秒转X分X秒;
  • if(a=2){console.log(“””)}; ==不要混淆成=;
  • var timers=213123123;是多少分,多少秒;

↑ 返回目录