zoukankan      html  css  js  c++  java
  • JavaScript 隐式转换

    javascript 中的怪癖,js运算符隐式类型转换

     x + "" //等价于 String(x)

    + x //等价于 Number(x),也可以写成x-0

    !!x //等价于 Boolean(x),注意是双叹号!

    var now = new Date();    //创建一个日期对象

    typeof(now + 1)          //=> "string":"+"将日期转换为字符串

    typeof(now - 1)          //=> "number":"-"使用对象到数字的转换

    now == now.toString()    //=> true:隐式(==)的和显式(toString)的字符串转换

    now > (now - 1)          //=> true: ">"将日期转换为数字

     

    一、 运算中存在的隐式类型转换

    1、 “+”运算符

    var a = 11, b = '22';
    var c = a + b;

    这里引擎将会先把a变成字符串"11"再与b进行连接,变成了"1122"。有人会有疑问,为什么不把b变成数字22再进行算术加运算呢,这样的话c就是33了。没有为什么,当运算符“+”两边一个是数字类型,一个是字符串类型时,js引擎规定进行字符串连接运算而非算术加运算。利用运算符“+”这个特性,可以很方便的将Number转换成String。如

    var a = 11;
    alert(typeof a); //-->number
    a = a + '';
    alert(typeof a); //-->string

    2、“-”运算符

    “-”可以是一元运算符(取负),也可以是二元(减法运算)的。如

    var a = 11, b = '5';
    var c = a - b;
    alert(typeof c); //--> number

    这里与上面的“+”相反,会把字符串b隐式的转换成数字5再进行算术减法运算。利用这个特性,可以很方便的将String转换成Number

    var a = '11';
    a = a - '';
    alert(typeof a);// -->number

    二、 语句中存在的隐式类型转换

    1、if

    var obj = {name:'jack'}
    if(obj){
        //do more
    }

    这里会把obj隐式的转换成Boolean类型

    2、while

    var obj = {name:'jack'}
    while(obj){
        //do more
    }

    同if

    3、for in时的类型转换

    定义对象字面量时发生从标识符到字符串的隐式转换。

    var person = {'name':'jack',"age":20,school:'PKU'};
    for(var a in person){
        alert(a + ": " + typeof a);
    }

    这里name,age分别加单/双引号以强调其为String类型,school没有加单/双引号。我们遍历下该对象的属性,查看其类型。发现school也被隐式的转换成了String类型。

    数组的索引其实也是字符串类型。这着实令人惊叹,但事实的确如此。如

    var ary = [1,3,5,7];
    for(var a in ary){
        alert(a + ": " + typeof a);
    }

    三、 alert时存在的隐式类型转换

    String.prototype.fn = function(){return this};
    var a = 'hello';
    alert(typeof a.fn()); //-->object
    alert(a.fn()); //-->hello

    给String原型上添加了个fn方法,该方法返回this,我们知道this可以理解成当前类的实例对象,既然是对象那么typeof a.fn()自然返回是object了。
    关键是最后的alert(a.fn()),a.fn()返回的明明是对象,但却隐式的转换成了字符串“hello”显示。

    同样的情况发生在数字类型上,如

    Number.prototype.fn = function(){return this};
    var a = 10;
    alert(typeof a.fn());//-->object
    alert(a.fn()); //-->10

    a.fn()返回的是对象类型,但在alert(a.fn())时会隐式的将其转换成数字。

     

     

  • 相关阅读:
    [Everyday Mathematics]20150208
    [Everyday Mathematics]20150207
    [Everyday Mathematics]20150206
    数学基本技艺100题
    这天,白云酒楼里来了两位客人
    [Everyday Mathematics]20150205
    [Everyday Mathematics]20150204
    数学书籍阅读
    国科金发计〔2014〕86号
    [Everyday Mathematics]20150203
  • 原文地址:https://www.cnblogs.com/xbcq/p/3690248.html
Copyright © 2011-2022 走看看