js 隐式转换

229 阅读3分钟

前言

眼前的黑不是黑 [] == [] // => false

你说的白是什么白 [] == ![] // => true

这是什么操作?这难道就是传说中的 1+1 != 2?,搞错了,再来: 0.1 + 0.2 != 0.3(也不是今天的重点)

好了不扯了,进入正题:

JavaScript数据类型

  • 基本类型:

    • String(字符串);
    • Number(数字);
    • Null(空值);
    • Nndefined(未定义);
    • Boolean(布尔值);
    • Symbol(目前对它不是很熟,Symbol 本质上是一种唯一标识符,可用作对象的唯一属性名,这样其他人就不会改写或覆盖你设置的属性值,今天的重点不是它,感兴趣的同学自行去查阅吧)。
  • 复杂类型(Object):

    • Object ( { value: 1 } );
    • Array ( [1, 2, 3] );
    • Function ( function() {} );
    • Date ( new Date() );
    • RegExp ( new RegExp(/\d/, 'gi') );

我们经常会看到一些题目通过 == 运算符来比较左右两个变量或者值是否相等(输出true/false),我们都知道在比较的过程是不关注数据类型的,只关注它们的“值”是否相等。比如:

1 == '1'; // true
null == 0; // false
false == 0; // true
null == undefined; // true
NaN == NaN; // false
[] == []; // false
[] == ![]; // true

在我们没有掌握上面这些玩意发生过程之前,看起来是很混乱的,根本无法准确判断两个值是否想等,除非你死记硬背&还能不忘记的。

所以我们需要以下规则来辅助我们进行判断:

规则:

    1. nullundefined在比较时,除了相互比较或者和自己比较,其他情况都输出false;
    1. 复杂数据类型在比较时,判断两个变量引用的对象是否为同一个;
    1. 复杂类型和Number类型在比较时,会通过对象内部的方法将其转换为Number类型;
    1. 复杂类型和String类型在比较时,通过对象内部方法将其转换为String类型;
    1. 复杂类型和Boolean类型在比较时,将Boolean先转为Number类型,=>No.3👆;
    1. Number、String、Boolean三种类型在相互比较时,都会把非Number类型转为Number类型进行比较。

-注

上述第2点:与变量存放位置相关,JavaScript的变量存在内存中,分为栈内存堆内存,引用类型(也就是复杂数据类型)就是存放在堆内存中,两个变量在栈内存中分属不同的位置,但他们指向堆内存中的地址是一样的,就说明这两个变量引用了同一个对象。

有没有发现Number类型就是那么嚣张。

那么问题来了,其他数据类型如何转换为Number或者String呢?

转为Number

  • Null类型:Number(null) => 0;
  • Undefined类型:Number(undefined) => NaN (NaN属于六亲不认的那种,自己都不等于自己);
  • String类型:Number('1') => 1,Number('') => 0,Number('111+') => NaN;
  • Boolean类型:Number(false) => 0,Number(true) => 1;
  • Object类型:优先调用obj.valueOf方法,如果返回值为数字类型,则返回,否则调用toString方法,转为字符串类型,再转为数字类型;

收:

一般复杂数据类型在转换时,都实际调用了toString方法转换为String,再将字符串转换为数字进行比较。

再随便讲讲其他数据类型转为String和Boolean类型吧:

转为String:

基本上就是在变量类型上加个引号,除了数字+0,-0,0都会默认转为'0'、Array类型会转为'';

  • Null:String(null) => 'null';
  • Undefined:String(undefined) => 'undefined';
  • Boolean:String(true) => 'true',false同理;
  • Number:String('0'/'-0'/'+0') => '0',String(123) => '123';
  • Object:重点介绍下Object类型和Array类型吧:
    • String(new Object()) == new Object().toString() == '[object Object]';
    • String(new Array()) == [].toString() == '',[1,2].toString() == '1,2';

转为Boolean:

最简单的数据类型,除了""、null、undefined、0、false、NaN会转为false,其他值都转为true

不知不觉也23:17了,溜了溜了,祝大家学的开心,天天进步。