美文网首页
深入理解js隐式类型转化

深入理解js隐式类型转化

作者: 如意同学Try | 来源:发表于2018-01-04 11:28 被阅读0次

    在开始本文前,先声明两句十分重要的话

    Falsy 类型值包括:"", 0, null, undefined, NaN, false.

    换句话说,除了以上6种,其他任何值都为true

    Javascript是弱类型的语言

    换句话说,类型之间会通过某些操作进行转化。

    好,表演开始

    隐式类型转化的两种方式

    1. 操作符
    a) +:
    • 数字+字符串,将数值转化为字符串
      和相加两个值的顺序无关,最终都是转化为字符串
    1 + 2 = 3
    1 + "2" = "12"
    
    b) - * % /:

    字符串- * % /数值,字符串转化为数值,运算失败则结果为NaN

    "-1" * "2" = -2
    "" - 1 = -1
    "4px" - 2 = NaN
    
    c) null代表空值,转化为0计算
    null + 1 = 1   //null代表空值
    null - 1 = -1
    
    d) undefined代表未定义,会导致运算失败
    undefined + 1 = NaN //undefined代表未定义
    
    2. == 与 ===

    之前我对于两者的理解是,==比较两者值是否相等,忽略类型,而===需要值和类型都相等,才会返回ture

    其实,上述说法并不规范,===其实是将两边数值直接进行比较,而==其实是比较强制类型转化之后的结果。

    Boolean(2 === "2")           //false
    Boolean(undefined == null)   //ture
    Boolean(undefined === null)  //false
    

    有几个值得注意的地方:

    对象和数组的比较
    Boolean([]);           //ture
    //空数组为ture
    
    Boolean({});           //ture
    //空对象为ture
    
    Boolean([] == []);     //false
    //两个数组(对象也一样),就算属性和方法完全一致,两者也不相等。
    
    var arr = [],a = arr,b = arr;
    Boolean(a == b)        //ture
    //指向同一个数组的两个变量才能说是相等的
    

    因为数组和对象实际上是地址的引用,不同的数组之间,即使属性和方法完全一致,指向的地址也是不一致的。所以才有深拷贝这一说法了。

    类型转化
    • 数字和字符串的互相转换

    很简单,数字会加上引号转化为字符串,再进行比较

    Boolean(1 == "1")  //true
    
    • 布尔类型的值会转换为数字,false转化为0,true转化为非0数字
    Boolean(false == 1) //false
    
    • 数组的转换
      空数组本身为true,但是在做比较时是转化为0
    Boolean([] == false) //ture
    

    左边空数组[]转化为number 0,

    右边false也转化为number 0

    但还是想再强调一遍,两个空数组的结果依然是false,因为这时候是直接进行比较的,没有进行转化

    Boolean([]==[])   //false
    
    • 对象的转换
      javascript中所有对象都是true。
    Boolean({} == false) //false
    

    但是同样,两个空对象进行比较,结果依然是false

    Boolean({}=={})
    

    不知道你被绕晕了没有,其实理解起来也很简单,只要稍微注意下数组和对象的特殊情况,就能通关了
    over~

    相关文章

      网友评论

          本文标题:深入理解js隐式类型转化

          本文链接:https://www.haomeiwen.com/subject/efnlnxtx.html