JS第二天

对象到其他类型之间的数据转换

对象到boolean

  • 非空对象 是true
  • 空对象(是null,不是{}) false

对象到字符串

  • 调用对象的toString方法。
    String(o);//String()调用o的toString();
    o.toString();//o调用自身的toString()方法

对象到number

  • 使用Number()转换
  • 如果对象既没有重写toString()方法,也没有重写valueOf(),返回NaN
    var o = {
    name : "briup",
    age :22
    };
    Number(o); // NaN
  • 如果对象只重写了toString()方法,没有重写valueOf()方法,将获
    取到toString()返回的值,然后对该值进行转换
    var o = {
    name : "briup",
    age :22,
    toString:function(){
    return "1";
    }
    };
    Number(o);
    // 默认转换o.toString(),既Number("1"),结果为 1
  • 如果对象既重写了toString()方法,也重写了valueOf()方法,或者仅
    重写了valueOf()方法,将调用valueOf(),并且取得返回值,对该返回
    值进行转换
    var o = {
    name : "briup",
    age :22,
    toString:function(){
    return "1";
    },
    valueOf:function(){
    return false;
    }
    };
    Number(o); // 默认转换o.valueOf(),既Number(false),结果为 0
  • parseInt()/parseFloat()
    始终调用toString()将其返回值进行parseInt()转换

操作符

一元操作符

++,--,+,-操作符应用任何类型数值都返回一个数值类型,先将任意类型的值转换为Number
然后进行运算

递增 ++

  • 前置:操作该变量之前进行递增或者递减操作
  • 后置:操作该变量之后进行递增或者递减操作

对任意数据类型的操作数都适用,使用前先将其转换为数字(Number()),然后再进行运算

在应用于对象的时候,优先先调用对象的valueOf方法,以取得一个可供操作的值,如果子类
对象仅重写了toString(),调用该方法。

递减 --

  • 前置:操作该变量之前进行递增或者递减操作

  • 后置:操作该变量之后进行递增或者递减操作

    对任意数据类型的操作数都适用,使用前先将其转换为数字,然后再进行运算

    在应用于对象的时候,先调用对象的valueOf方法,以取得一个可供操作的值,如果子类
    对象仅重写了toString(),调用该方法。

加 +

    相当于调用Number();
var a = "12"
+a ;    // 12  相当于调用了Number("12")

减 -

    将一元减应用于数值时,数值会变成负数。
    将一元减应用于非数值时,
遵循与一元加操作符相同的规则,最后将得到的数值转化为负数

布尔操作符, 非(NOT),与(and),或(OR)

逻辑非 !

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

逻辑与 && (同真才真,有假则假)

短路
可应用于任意数值。如果有一个操作数不是布尔类型,逻辑与就不一定返回boolean类型

  • 如果第一个操作数是
    null,NaN,undefined,false,0,""可被转换
    为false的值的时候返回该值

  • 如果第一个数其他,返回第二个数

      var s1 = 8;
      var s2 = "briup";
      var s3 = "";
      var result = s1 && s2;    //briup
      var result2 = s3 &&s2;  //空字符串
    

逻辑或 ||(有真则真,同假才假)

false ||
如果两个操作数都是null,NaN,undefined,false,0,""可被转换为false的值的时候返回该值
如果第一个操作数是null,NaN,undefined,false,0,"" 则返回第二个操作数

加性操作符

加法 +

    m + n
  • 当m,n不为String,Object类型的时候,先将m,n转换为Number类型,然后再进行计算

      true + false;      //1;Number(true)+Number(false);
      true + 1;      //2;Number(true) + 1
      null + undefined; //NaN;Number(undefined) -> NaN
    
  • 当m,n有一个为String,无论另一个操作数为何(但不为对象)都要转换为String,然后再进行拼接

      "1" + true;    // 1true
      "1" + undefined;// 1undefined
      "1" + 1;    // 11
    
  • 当m,n 有一个为对象,如果该对象既重写toString,又重写了valueOf方法,调用valueOf方法获取返回值,
    将该返回值和另外一个操作数进行运算。如果该对象没有重写valueOf方法,将调用toString方法获取返回值,
    将该返回值和另外一个操作数进行运算。
    var o = {
    name:"briup",
    valueOf:function(){
    return "1";
    }
    }
    o+1; //2;o+1

减法 -

返回值为Number

无论操作数为任何类型,先将其使用Number()转换器转换为Number类型,然后再计算。

    true - 1;    //0;    1-1
    null - true;    //-1 ;    0-1
    1 - undefined    //NaN
    var o = {
        name:"briup",
        valueOf:function(){
        return 1;
        }
    }
    o-1;        //0;    1-1

乘性操作符

当操作数为非数值的时候执行自动的类型转化Number()

乘法 *

  • 如果两个数都是数值,执行常规的乘法计算
  • 如果一个操作数是NaN,结果为NaN
    超过数值范围返回Infinity(Infinity 属性用于存
    放表示正无穷大的数值。
  • 如果有一个操作数不是数值,则在后台先调用Number()将其转换为数值。

除法 /

  • 如果一个操作数是NaN,结果为NaN (0/0 ; NaN)
    一个非0值除0 Infinity

  • 如果有一个操作数不是数值,则在后台先
    调用Number()将其转换为数值。

          var s1 = 5;
          var s2 = 2;
          var result = s1/s2;  //2.5
    

取余 %

  • 如果两个数都是数值,执行常规的取余计算
  • 如果一个操作数是NaN,结果为NaN(任意数%0 ; NaN)
  • 如果有一个操作数不是数值,则在后台先调用Number()将其转换为数值。

关系操作符

< > <= >= ,返回一个boolean值

  • 如果两个操作数是字符串,比较字符串中对应位置的每个字符的字符编码值

    a -> z
    "10" -> "9"
      "a">"b"    //false
      "1">"a"    //false
    
  • 如果一个操作数是数值,将另外一个操作数也转换为数值进行比较

      "3">1;        //true
      3>true;        //true 3>Number(true)
      3>undefined;    //false Number(undefined)=NaN ;任何数和NaN比较结果都为false
    
  • 如果一个操作数是对象,先调用valueOf(),再调用toString()将返回值与另外一个操作数比较
    如果没有重写toString() valueOf()则始终为false

      var o = {
          name:"briup",
          valueOf:function(){
          return "13";
          }
      }
      o>2        // true ; "13">2
    

相等操作符

相等和不相等 ==, != (先转换在比较)

  • 如果有一个数为boolean类型,比较前先转换为数值。
  • 如果一个数为字符串,另外一个数为数值,比较前先将字符串转换为数值
  • 如果两个都是字符串,比较字符序列
  • 如果一个数是对象,另外一个数不是,则调用valuesOf()方法,用得到的基本数据类型进行比较
    null == undefined //true
  • 如果一个数为NaN,相等操作返回为false,不等操作返回true
  • 如果两个数都为对象,则比较他们是不是同一个对象,如果两个操作数都指向同一个对象,返回true

全等和不全等

    仅比较不转换,先比较两个数所属的数据类型,如果类型不同则不同,如果类型相同
再继续比较两个数的值
console.log("55" == 55); true
    console.log("55" === 55);false
null == undifined;  //false

三目运算符 ? :

   variable = boolean_expression ? true_value : false_value;
 如果boolean_expression为true,将true_value赋给variable,
   否则将false_value赋给variable
       求任意两个数之间最大值
       function max(m,n){
      return m>n?m:n;    //如果m>n为true返回m,如果m>n为false,返回n
       }

赋值运算符 =

   将右侧的值赋给左侧的变量
   可以和其他算术运算符连用 *= /= %= += -= 
   a *= 3;

逗号操作符

   可以在一条语句中执行多个操作
   var num1=1,num2 = 2, num3 = 3;

推荐阅读更多精彩内容

  • 什么是 JavaScript 语言? JavaScript 是一种轻量级的脚本语言。所谓“脚本语言”(script...
    oWSQo阅读 522评论 0 1
  • 最近开始学习的JS,做这个笔记只是为了记录一下自己的学习情况,也算是督促自己每天多看点书。基本都是书上的内容整理了...
    丨ouo丨阅读 111评论 2 1
  • 第一章 Javascript简介 Javascript实现 核心(ECMAScript) 文档对象模型(DOM) ...
    江上风平浪静阅读 119评论 0 0
  • 最近几年,跑步运动风靡全球,无数名人参与这种简单的运动,“彩跑”“夜跑”等各种跑族也随处可见。我佩服他们的毅力,但...
    妙所阅读 4,059评论 5 3
  • 生活中每个人都会有恐惧,这是一种动力,让我们去努力的一种动力。在生活中我是一个勇敢的人,不管是恋爱的时候,或工作的...
    蔡志杰阅读 64评论 0 0