学习笔记十六:运算符、数据类型转换、流程语句

操作符:算术操作符、比较操作符、逻辑操作符、其他操作符
  js弱数据类型语言:隐式的数据类型转换

 

1、 逻辑运算符
    (1)逻辑与 && (同真才真,有假则假)
      可应用于任意数值,如果有一个操作数不是布尔类型,逻辑与就不一定返回boolean类型;
         如果第一个操作数是null,NaN,undefined,false,0," ",可被转换为false的值的时候返回该值;
         如果第一个数其他,返回第二个数;
      表达式 && 表达式
                     true && true ==> true
                     true && false ==> false
                     false && false ==> false
                     false && true ==> false
                     短路:有一个为false-->false


    (2)逻辑或 ||  (有真则真,同假则假)
      如果两个操作数是null,NaN,undefined,false,0," ",可被转化为false的值的时候返回该值; 
      如果第一个操作数是null,NaN,undefined,false,0," "则返回第二个操作数; 
      表达式 || 表达式
                     true || true ==> true
                     true || false ==> true
                     false || false ==> false
                     false || true ==> true
                     短路:有一个为true-->true


    (3)逻辑非 ! 
      该操作符应用任何类型数值都返回一个[布尔值];先将任意类型的数值转换为Boolean,然后取反;
      !a ==> !Boolean(a)
      !0      // true
      !""     // true
      !NaN    // true
      !false  // true
      连用两次逻辑非,就可以将任意数据类型转换为Boolean类型
      !! a ==> Boolean(a)
      !!""   //false

2、 数据类型转换
   (1)其他数据类型转换为String
      toString()函数
         除了null、undefined,其他三种基本数据类型的变量均有一个toString()函数,该函数可以获取该变量指定值的字符串表示;
             number类型.toString();
             boolean类型.toString();
             var  a = true;
             a.toString();   //'true'
         如果变量为number类型,默认情况下toString()是以十进制格式返回数值的字符串表示,通过传递参数,可以输入以二进制,八进制,十六进制乃至任意有效进制格式的字符串值;
            var  num = 10;
            num.toString();     //  "10"  
            num.toString(2);    //  "1010"
            num.toString(8);    //  "12"
            num.toString(16);   //  "a"
      String()函数 
         可以将其他任意基本数据类型的值转换为字符串表示,包括null,undefined;
      加法 + ( m , n )
         不做加法运算时,默认将其他数据类型转换为字符串表示
         当 m ,n 不为String,Object类型的时候,先将 m ,n 转换为Number类型,然后再进行计算;
           true + false        //  1   Number(true) + Number(false) (1+0)
           true + 1            //  2   Number(true) + 1  (1+1)
           null + undefined    //  NaN Number(undefined) ---> NaN  (0+undefined)
         当 m ,n 有一个为String,无论另一个操作数为什么数据类型(但不为对象)都要转换为String,然后再进行拼接
           "1"+true            //  1 true
           "1"+undefined       //  1 undefined
           "1"+1               //  1 1
         当 m ,n 有一个对象,如果该对象既重写toString,又重写了valueOf方法,先调用valueOf方法获取返回值,将该返回值和另一个操作数进行运算。
         如果该对象没有重写valueOf方法,将调用toString方法获取返回值,将该返回值和另一个操作数进行运算;
            var   o ={
               name:'briup',
               valueOf:function(){
                  return "1";  // return  1;  返回2
               }
            }
            console.log(o+1);  // 11    
           
  (2) 其他数据类型转换为Boolean类型
      任意其他数据类型都可以转换为布尔类型
      Boolean        true          false
      String      非空字符串        ""
      Number        任何非0          0/NaN
      Object        任何对象         null
      Undefined      不适用          undefined


  (3) 其他数据类型转换为Number
      Number()函数
          如果转换的值是null,undefined,boolean,number
          Number(true);            //  1
          Number(false);           //  0
          Number(null);            //  0
          Number(undefined);       //  undefined
          Number(10);              //  10   如果是数字值,原样输出
          如果转换的值是string
          Number("123");       //  123      如果仅包含数值,转换为对应的数值
          Number("234.1");     //  234.1    解析为对应的小数
          Number("+12.1");     //  12.1     首位为符号位,其余为数值,转换为对应的数值
          Number("1+2.3");     //  NaN      NaN符号位出现在其他位置,解析为NaN
          Number("0xa");       //  10       如果仅包含十六进制格式,转为对应的十进制的值
          Number("010");       //  10       不会当作八进制被解析,结果为10
          Number("");          //  0        空字符串转换为0
          Number("123ac");     //  NaN      包含其他字符,解析为NaN
          Number(" 12");       //  12       如果仅包含数值,转换为对应的数值
      parseInt()函数 
          如果转换的值是null,undefined,boolean,均转换为NaN 
          如果转换的值是string
          Number("123");       //  123      如果仅包含数值,转换为对应的数值
          Number("234.1");     //  234      小数点后面的数值省略
          Number("+12.1");     //  12       首位为符号位,其余为数值,转换为整数
          Number("1+2.3");     //  1        NaN符号位出现在其他位置,保留符号位前面的数值 
          Number("0xa");       //  10       如果仅包含十六进制格式,转为对应的十进制的值
          Number("010");       //  10       不会当作八进制被解析,结果为10
          Number("");          //  NaN      空字符串转换为NaN
          Number("123ac");     //  123      如果首位为数值,依次向后解析,找到连续的数值,直到遇到第一个非数值的,将之前获取的数值转换为Number返回
          Number(" 12");       //  12       如果仅包含数值,转换为对应的数值
      parseFloat() 函数 
          如果转换的值是null,undefined,boolean,均转换为NaN 
          如果转换的值是string
          Number("123");       //  123      如果仅包含数值,转换为对应的数值
          Number("234.1");     //  234.1    保留小数点后面的数值
          Number("+12.1");     //  12       首位为符号位,其余为数值,转换为整数
          Number("1+2.3");     //  1        NaN符号位出现在其他位置,保留符号位前面的数值 
          Number("0xa");       //  0        不会当作十六进制解析
          Number("010");       //  10       不会当作八进制被解析,结果为10
          Number("");          //  NaN      空字符串转换为NaN
          Number("123ac");     //  123      如果首位为数值,依次向后解析,找到连续的数值,直到遇到第一个非数值的,将之前获取的数值转换为Number返回
          Number(" 12");       //  12       如果仅包含数值,转换为对应的数值
        

 注意:
    1.默认情况下,ECMAScript 会将小数点后带有6个零以上的浮点数转换为科学计数法;
          console.log(0.0000003);     //   3e-7
    2.在进行算术计算时,所有以八进制、十六进制表示的数值都会被转换成十进制进行计算;
    3.保存浮点数,需要的内存时整数的两倍,因此ECMAScript 在特殊情况下会将浮点数转换为整数;
          var  a = 1;    // 1
          var  b = 1.0;  // 1
          var  c = 2.0;  // 2
    4.避免测试某个特点的浮点数值,是使用IEEE754 数值的浮点计算的通病;
          console.log(0.1+0.2);     // 0.30000000000000004    避免这种情况,需要将浮点数转换为整数计算,计算结束后,再转换为浮点数;
          
         
   
3、流程控制语句
 (1)分支语句
    if 语句
       if(condition) {
           //  code to run if condition is true 
       }
       run  some  other code  
       condition表示任意表达式,该表达式求值的结果不一定是布尔类型,
       如果不是布尔类型,ECMAScript会调用Boolean()转换函数将这个表达式结果转换为一个布尔类型;
       当该值为true时,执行if代码块中的内容
    if-else 语句
       if(condition) {
           //  code to run if condition is true 
       }else{
          run  some  other code  instead 
       }
       run  some  other code 
       当condition为true时,执行if代码块中的内容,否则,执行else代码块中的内容,
       一般情况下,如果代码块中代码只有一行,可以省略大括号
    if-else if-else 多条件分支语句
       if(condition1){
           condition1 ==>true
           代码块1
       }else if(condition2){
           condition1 == false && condition2 == true
           代码块2
       }else if(condition3){
           condition1、2 == false && condition3 == true
           代码块2
       }else if(condition4){
           condition1、2、3 == false && condition4 == true
           代码块2
       }else{
           condition1、2、3、4 == false
       }
    switch 语句
       switch(expression) {
          case choice1:
               run  this  code;
               break;
          case choice2:
               run  this  code  instead;
               break;

           //   include  as  many  cases  as  you  like

           default:
                actually,just run  this  code;
       }  
       expression 可以是变量,也可以是表达式,当expression === choice,执行当前case代码块的代码;
       每个case代码块都必须包含break;表示执行完当前代码块的内容跳出switch代码块;
       当所有的case不满足情况下,执行default代码块的内容,default的位置可以随意;
 
 (2)循环语句
    一个循环语句应该具备三要素:计数器、循环结束条件、迭代器;
    for 循环
       for(initializer; exit-condition; final-expression) {
          //  code  to  run 
       }

    while 循环
       前测试循环语句,即在循环体内的代码被执行之前,就会对出口条件求值,因此循环体内的代码有可能永远不被执行
       initializer
       while(exit-expression) {
          //  code  to  run 
          final-expression 
       }
    do-while 循环
       后测试循环语句,即只有在循环体中的代码执行之后,才会测试出口条件,循环体内的代码最少被执行一次
       initializer
       do {
          //code  to  run 
          final-expression
       }while(exit-condition);

       initializer         初始化值,一般为数字,仅会执行一次。也可以写到循环体外;
       exit-condition      结束条件,通常使用逻辑运算符进行结束循环判断;每次执行循环体之前均会执行该代码进行判断;
       final-expression    每次执行完循环体代码后执行,通常用于迭代使其更加靠近结束条件;
 (3)关键字
   break:如果想在所有迭代之前退出,即可使用break;当执行break后,会跳出循环体,执行下面的代码;
   continue:与break不同,continue不会跳出循环;而是立即结束当前循环,进入下一次循环;
   label:使用label可以在代码中添加标签,以便将来使用;(顶格自定义,对for循环取别名)
      label:for(int i = 0 ; i<10 ;i++ ){
         if( i == 5 ) {
            break  label;
         }
      }    
      注意:ECMAScript不存在块级作用域,在循环内部定义的变量也可以在外部访问到;
      

     

上一篇:JavaScript中三个等号和两个等号的区别(== 和 ===)浅析


下一篇:js基础类型转换