我的JS笔记 -- 类型转换


在JS中数据有七种内置类型:空值( null)、未定义( undefined)、布尔值( boolean)、数字( number)、字符串( string)、对象( object)、符号( symbol, ES6 中新增)

将值从一种类型转换成另一种类型便是类型转换,在JS中常常会自主或不经意间将值进行类型转换。类型转换通常有两种情况一种是显式强制类型转换,这种情况是使用JS提供的类型转换函数,将值转换成特定的类型;另一种情况是隐式强制类型转换,是在进行某些操作是JS隐式的将值的类型进行转换后再进行操作。

显式强制类型转换

JS中提供了Number()、String()、Boolean()等函数将值转换成特定的类型。这种使用函数方法显式的将值的类型进行转换就称为显式强制类型转换。

  • Number(),将值的类型转换成数字。Number()函数转换规则:

    • 参数是布尔值,true和false分别转换成1和1;

    • 参数是数字,返回参数本身;

    • 参数为null,返回0;

    • 参数是undefined,返回NaN;

    • 参数是字符串,有下面情况:

      • 参数字符串只包含数字,转化成十进制数值;
      • 参数字符串包含有效浮点数,转换成对应的浮点数值;
      • 参数字符串包含有效的十六进制格式,转换成相应的十进制整数;
      • 参数字符串为空,转换为0;
      • 参数字符串包含上述格式之外的字符,转换为NaN;
    • 参数是对象,调用对象自身的valueOf()方法。如果返回原始类型的值,则直接对该值使用Number()函数,不再进行后续步骤。如果valueOf()方法返回的还是对象,则改为调用对象自身的toString()方法。如果toString()方法返回原始类型的值,则对该值使用Number()函数,不再进行后续步骤。如果toString()方法返回的是对象,就报错。

        var a = {
            name: 'a',
        };
        Number(a); // NaN
        a.valueOf = function () {
                return 1;
        };
        Number(a); // 1
      
        var b = [2];
        b.valueof(); // [2]
        b.toString(); // '2'
        Number(b); // 2
      
  • JS中parseInt和parseFloat函数可以将字符串转化为整数和浮点数,parseInt()可以传递第二个参数,代表解析的进制,parseFloat只能解析十进制值。这两个方法允许字符串中含有非数字字符,解析按从左到右的顺序,如果遇到非数字字符就停止,而Number()不允许参数含有非数字字符,如包含返回NaN。

      parseInt('10a') // 10
      parseInt('AF', 16) // 175
      parseInt('AF') // NaN 
      
      parseFloat('10.01a') // 10.01
    
  • toString()方法和String()函数,将值的类型转换成字符串。

    • toString()方法,除null和undefined之外的所有值都有toString()方法,此方法可以接受一个参数,表示输出数值的进制基数。

        var a = 10;     
        a.toString(); // '10'
        a.toString(2); // '1010',10的二进制字符串
      
        var b = null;
        b.toString(); // 报错
      
        var c = {
            name: 'c'
        };
        c.toString(); // "[object Object]",默认的toString()方法可以用来判断对象类型
        c.toString = function () {
            return 'c';
        };
        c.toString(); // 'c',改写toString()方法,返回设定的值
      
    • String()函数,可以将任何类型的值转换为字符串,转换规则:

      • 参数有toString()方法,调用该方法返回结果;
      • 参数是null,返回'null';
      • 参数是undefined,返回'undefined';
  • Boolean()函数,将值转换为布尔值,在JS中false、''、0、NaN、null、undefined为假,其余都为真值,所以使用Number()函数false、''、0、NaN、null、undefined会被转换为false,其余转换为true。

隐式强制类型转换

在JS的某些操作中,JS会隐式将值进行类型转换,例如使用'=='、'+'和'-'等操作,所以需要在不同情况下进行区分。

  • +运算符

    • +运算符单独使用,类似于调用Number()函数;

        +'-1' // 1
        +{name: 'a'} // NaN
        +{name: 'b', toString: function () { return 2 }} // 2
      
    • +运算符作为加法运算符;

      • 如果两个操作数都是数字,进行数学上的加法运算

      • 如果两个操作数都是字符串,进行字符串拼接操作

      • 如果只有一个操作数是字符串,则将另一个操作数转化为字符串,然后将两个字符串拼接起来

          1 + 1 // 2
          'a' + 'b' // 'ab'
          1 + 'a' // '1a'
        
  • -*/运算符,会将两边操作数转换为数字,转换规则类似调用Number();

      1 - 'a' // NaN
      1 * 'a' // NaN
      1 / 'a' // NaN
    
      1 - '2' // -1
      1 * '2' // 2
      1 / '2' // 0.5
    
      1 - {name: 'b', toString: function () { return 2 }} // -1
      1 * {name: 'b', toString: function () { return 2 }} // 2
      1 / {name: 'b', toString: function () { return 2 }} // 0.5
    
  • ==运算符,在判定操作数是否相等时规则:

    • NaN不与任何数相等,包括NaN本身;

    • null与undefined宽松相等;

        null == undefined // true
        null === undefined // false
      
    • 操作数其中一个为数字,另一个为字符串,则将字符串转换为数字;

        1 == '1' // true
        '1' == 1 // true
      
    • 操作数其中一个为布尔值,则将布尔值转换为数字再进行比较;

        true == 1 // true
        true == '1' // true
        null == false // false
        true == { valueOf: function () {return 1;}} // true
      
    • 操作数一个为对象,另一个为数字或字符串,对象进行toPrimitive(obj)操作,等价于:先计算obj.valueOf(),如果结果为原始值,则返回此结果;否则,计算obj.toString();

        'a' == { valueOf: function () {return 'a';}} // true
        'a' == { toString: function () {return 'a';}} // true
        'a' == { valueOf: function () {return 'a';}, toString: function () {return 'b';}} // true
        'a' == { valueOf: function () {return 'b';}, toString: function () {return 'a';}} // false
      
  • 隐式转换为布尔类型,在下面的情况下,值会被转换为布尔类型,规则与调用Boolean()函数一致:

    • if (..) 语句中的条件判断表达式;
    • for ( .. ; .. ; .. ) 语句中的条件判断表达式(第二个);
    • while (..) 和 do..while(..) 循环中的条件判断表达式;
    • ? : 中的条件判断表达式;
    • 逻辑运算符 ||(逻辑或)和 &&(逻辑与)左边的操作数(作为条件判断表达式);

更多文章在 这里 ,觉得不错希望点个 star

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

推荐阅读更多精彩内容