• 【JS】隐式转换


    + 运算符

    • 如果一方是字符串,另一方会被转换为字符串,两字符串连接。
    • 如果两方非字符串,则双方都会被转换为数字,执行数字加法。
    • NaN 与任何数字(包括自身)执行加法,他们的结果都是NaN
    • 特殊情况:
    • 如果双方都是 BigInt,则执行 BigInt 加法。
    • 如果一方是 BigInt 而另一方不是,会抛出 TypeError
    console.log(1 + 'true');	// '1true'
    // 解析:String(1) + 'true' = '1true'
    
    console.log(1 + true);		// 2
    // 解析:1 + Number(true) = 1 + 1 = 2
    
    console.log(1 + false);		// 1
    // 解析:1 + Number(false) = 1 + 0 = 1
    
    console.log(1 + undefined);	// NaN
    // 解析:1+ Number(undefined) = 1 + NaN = NaN
    
    console.log(1 + null);		// 1
    // 解析:1+ Number(null) = 1 + 0 = 1
    
    console.log(true + true);	// 2
    // 解析:Number(true) + Number(true) = 1 + 1 = 2
    
    console.log(null + null);	// 0
    // 解析:Number(null) + Number(null) = 0 + 0 = 0
    
    console.log(undefined + undefined);	// NaN
    // 解析:Number(undefined) + Number(undefined) = NaN + NaN = NaN
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    > 和 < 运算符

    • NaN 无法与任何值做比较,他们的比较结果都是false
    • 如果一方是数字,另一方会被转换为数字,做数字比较。
    • 如果都是字符串,则按照字符串对应的Unicode编码来转换,以编码做比较。
    • 多个字符串从左往右依次比较,直到分出unicode编码大小。
    console.log('2' > 10);	// false
    // 解析:Number('2') > 10 = false
    
    console.log('' > 1);	// false
    // 解析:Number('') > 1 = 0 > 1 = false
    
    console.log('aaa' > 1);	// false
    // 解析:Number('aaa') > 1 = NaN > 1 = false
    
    console.log('aaa' < 1);	// false
    // 解析:Number('aaa') < 1 = NaN < 1 = false
    
    console.log(true < false);	// false
    // 解析:Number(true) < Number(false)= 1 < 0 = false
    
    console.log(null < undefined);	// false
    // 解析:Number(null) < Number(undefined)= 0 < NaN = false
    
    console.log('2' > '10');// true
    // 解析:'2'.charCodeAt() > '10'.charCodeAt() = 50 > 49 = true
    console.log('2'.charCodeAt(),'10'.charCodeAt());	// 50 49
    
    // 'a'.charCodeAt() = 97, 'b'.charCodeAt() = 98
    console.log('abc' > 'b');	// false
    // 解析:第一位a>b = 97 > 98 = false
    console.log('a'.charCodeAt(),'b'.charCodeAt());
    
    console.log('abc' > 'aad');	// true
    // 解析:第一位a=a,第二位b>a = 98 > 97 = true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    == 运算符

    只有 0NaNundefinednull''false 进行 Boolean 转换才为 false!

    • 如果其中一个操作数是对象类型,另一个是基本类型,==会将复杂数据类型[]{}通过valueOf()toString()方法,转换成基本数据类型,再进行比较。
    • 如果都是基本类型,==会将其他数据类型转换成number,然后再次松散地比较两个操作数。
    • 逻辑非!,将其他数据类型用Boolean()转换,优先级大于==关系运算符
    console.log([] == 0);	// true
    // 解析:Number([].valueOf().toString()) == 0 = Number('') == 0 = true
    
    console.log(![] == 0);	// true
    // 解析:!Boolean([]) == 0 = false == 0 = true
    
    console.log([] == ![]);		// true
    // 解析:[].valueOf().toString() == false = '' == false = true
    
    console.log([] == []);		// false
    // 解析:两个[]代表2个不同空间,所以比较结果为 false
    
    console.log({} == !{});	// false
    // 解析:{}.valueOf().toString() == false = '[object Object]' == false = false
    
    console.log({} == {});		// false
    // 解析:两个{}代表2个不同空间,所以比较结果为 false
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    【iOS开发】(三)react Native核心组件十个20240418
    写年度总结报告的注意事项
    nvm安装及使用,nodejs版本切换使用
    [附源码]计算机毕业设计springboot校园代取快递系统
    函数式编程:一等函数(First-class Function)
    [pytorch]手动构建一个神经网络并且训练
    (标签-yolo|关键词-上标)
    计算机毕业设计springboot+vue基本微信小程序的小区防疫监管系统
    spfa处理差分约束
    自动驾驶感知算法实战12——BEV 基于图像/Lidar/多模态数据的3D检测与分割任务
  • 原文地址:https://blog.csdn.net/qq_45677671/article/details/127586342