数据类型转换的一道例题

上图先:

1.jpg

然后举栗子:
题目:计算

[' '] == false

首先,两个操作数分别是对象类型,布尔类型,根据图1,需要将对象类型转为原始类型:

  • 首先调用[].valueOf(),由于数组的valueOf()方法返回自身,所以结果不是原始类型,继续调用[].toString().
  • 对于数组来说,toString()方法的算法是将每个元素都转为字符串类型,然后用逗号依次连接起来,所以最终的结果是空字符串'',它是一个原始类型的值.

实际上,运行的可以相当于下列程序代码:

var obj = {x: 1};
Number(obj) // NaN
// 等同于
if (typeof obj.valueOf() === 'object') {
  Number(obj.toString());
} else {
  Number(obj.valueOf());
}
上面代码中,Number函数将obj对象转为数值。背后发生了一连串的操作,首先调用obj.valueOf方法, 结果返回对象本身;于是,继续调用obj.toString方法,这时返回字符串[object Object],对这个字符串使用Number函数,得到NaN。

默认情况下,对象的valueOf方法返回对象本身,所以一般总是会调用toString方法,而toString方法返回对象的类型字符串(比如[object Object])。所以,会有下面的结果。

此时,表达式变为:

' ' == 0

到底为值,两个操作数的类型终于相同了,结果明显是true.

从这个例子可以看出,要想掌握==运算的规则,除了牢记图一外,还要记住那些内置对象的toString()和valueOf()方法的规则.包括Object,Array,Date,Number,String,Boolean等.

将图1完善下:

2.jpg

总结一下==运算的规则:

  • undefined == null,结果是true.且它俩与素有其他值比较的结果都是false.
  • String == Boolean,需要两个操作数同时转为Number.
  • String/Boolean == Number,需要String/Boolean转为Number.
  • Object == Primitive,需要Object转为Primitive(具体通过valueOf()和toString()方法)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容