JavaScript中的类型转化扫盲

29,476次阅读
没有评论

共计 1938 个字符,预计需要花费 5 分钟才能阅读完成。

转换为基础类型

布尔值

  • undefinednullfalseNaN''0 –> false
  • 其它值都, 包括所有对象 –> true

数字

  • 数组
    • [] –> 0: 空数组转为 0
    • [1] –> 1: 含有一个元素且为数字则转换为数字
    • [1,2] –> NaN: 其余情况转为 NaN
    • ['abc',1] –> NaN: 其余情况转为 NaN
  • 值类型
    • null –> 0
    • '123' –> 123: 纯数字构成的字符串直接转换为对应的数字
    • true –> 1
    • false –> 0
    • '124a' –> NaN
    • undefined –> NaN
    • Symbol –> 抛出错误
  • 除了数组之外的引用类型(Object) –> NaN

字符串

  • 666 –> ‘666’: 数字可直接转为字符串
  • 布尔值:布尔值直接转换
    • true –> ‘true’
    • false –> ‘false’
  • 数组
    • [] –> :空数组转为空串
    • [2,'3'] –> ‘2,3’:非空数组的每一项转为字符串再用 , 分割
  • 对象:
    • {} –> [object Object]
    • {a:1} –> [object Object]

对象转基础类型规则

对象在转换类型的时候,会调用内置的 [[ToPrimitive]] 函数,对于该函数来说,算法逻辑一般来说如下:

  1. 如果已经是基础类型了,那就不需要转换了
  2. 目标类型 为字符串 就先调用 toString
    • 转换为基础类型的话就返回转换的值
  3. 目标类型 不为字符串 就先调用 valueOf
    • 结果为基础类型,就返回转换的值
    • 结果不是基础类型的话再调用 toString
  4. 如果都没有返回基础类型,就会报错

各种情况举例

const demo1 = {
    [Symbol.toPrimitive]: function () {
        return 2
    }
}

console.log(demo1 + 1); 

const demo2 = {
    toString() {
        return 'demo2'
    },
    valueOf() {
        return 20
    }
}

console.log(String(demo2)) 


console.log(demo2 - 3); 

const demo3 = {
    toString() {
        return 30
    },
    valueOf() {
        return {}
    }
}

console.log(demo3 - 4); 

const demo4 = {
    toString() {
        return {}
    },
    valueOf() {
        return {}
    }
}

console.log(demo4 + 1); 

四则运算符

加法

  • 有一方为String,那么另一方也会被转为String
  • 一方为Number, 另一方为原始值类型,则将原始值类型转换为Number
  • 一方为Number, 另一方为引用类型,双方都转为String

其它

除了加法的运算符来说(-,*,/),会将非 Number 类型转换为 Number 类型

转换示例

'123'+4 

123+true 
123+undefined 
123+null 

123+[] 
123+{} 

比较运算符

==

  1. NaN不等于任何其它类型
  2. Boolean 与其它类型进行比较,Boolean转换为Number
  3. String 与 Number进行比较,String 转化为Number
  4. null 与 undefinde进行比较结果为true
  5. null,undefined与其它任何类型进行比较结果都为false
  6. 引用类型 值类型 进行比较, 引用类型先转换为 值类型(调用[ToPrimitive])
  7. 引用类型 引用类型,直接判断是否指向同一对象

JavaScript 中的类型转化扫盲

举例

自测

if ([]) console.log(1);             
if ({}) console.log(2);             
if ([] == false) console.log(3);    
if ({} == false) console.log(4);    
if ([] == ![]) console.log(5);      
if ({} == !{}) console.log(6);      
if ('' == false) console.log(7);    
if (false == 0) console.log(8);     
if (1 == true) console.log(9);      
if ('' == 0) console.log(10);       
if (NaN == NaN) console.log(11);    
if ([] == !true) console.log(12);   
if ([] == false) console.log(13);   
if ([] == 0) console.log(14);       
if (+0 == -0) console.log(15);      
if (NaN == false) console.log(16);  
{ } +1              
1 + {}              
[] + 1              
1 + []              
[1, 2, 3] + 0       
[1, 2, 3] + '0'     
1 + '0'             
1 + 0               
1 + true            
1 + false           
'1' + true          
'1' + false         
![] + []            
1 - true            
'0' - 0             
0 - '1'             
false - true        
{ } -[]             
[] - {}             
false - []          

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于1970-01-01发表,共计1938字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)