装箱、拆箱、隐式类型转换

装箱、拆箱、隐式类型转换

装箱

把基本数据类型转换为引用类型的操作称为装箱

1
2
var s1 = "some text";
var s2 = s1.substring(2);

s1是一个基本类型值,它不是对象,所以它不应该有方法。但是js内部为我们完成了装箱,使得它能够调用方法

实现的机制如下:

(1)创建String类型的一个实例;

(2)在实例上调用指定的方法;

(3)销毁这个实例;

用代码来展现:

1
2
3
var s1  = new String("some text");
var s2 = s1.substring(2);
s1 = null;

拆箱

把引用类型转换为基本的数据类型称为拆箱。通过引用类型的valueOf()或者toString()方法来实现的

==的隐式类型转换

注意:若==两边类型相同,不会进行隐式类型转换

规律:对象–>字符串–>数值<–布尔,通过比较数值

对象VS布尔

对象先转换为字符串,然后再转换为数字,布尔值直接转换为数字

1
[] == true;  //false  []转换为字符串'',然后转换为数字0。true转换为数字1,结果为false

对象VS字符串

对象转换为字符串

1
[1,2,3] == '1,2,3' // true  [1,2,3]转化为'1,2,3',然后和'1,2,3', 结果为true;

[1,2,3]转化为’1,2,3’相当于join()

对象VS数值

对象先转换为字符串,然后转换为数字

1
[1] == 1;  // true  `对象先转换为字符串再转换为数字,二者再比较 [1] => '1' => 1 所以结果为true

特殊

1
2
[] == false;
![] == false;

两个的结果都是true,第一个是,对象 => 字符串 => 数值0 false转换为数字0

第二个前边多了个!,则直接转换为布尔值再取反,转换为布尔值时,空字符串(‘’),NaN,0,null,undefined这几个外返回的都是true, 所以! []这个[] => true 取反为false

1
[]==![]

![]转换为false转换为0。[]转换为‘’再转换转换为0。结果为true