开发者社区> 烽穹寒渊> 正文

JS解释器之自动类型转换:[] == ![]

简介: 自动类型转换 自动类型转换主要针对的是对象类型,有俩种情况会出现: 等性运算(==,即比较,如:false == []) 四则运算(+-*/,如:[] + 1)。
+关注继续查看

自动类型转换

自动类型转换主要针对的是对象类型,有俩种情况会出现:

  • 等性运算(==,即比较,如:false == [])

  • 四则运算(+-*/,如:[] + 1)

在这两种运算中,js解释器需要将对象类型转换成原始类型(除了nullundefined),才能进行后续的操作。

在说明自动类型转换前,首先要了解两个方法:

  • Object.prototype.toString 

  • Object.prototype.valueOf 

这两个方法定义在Object.prototype上,是转换的核心 

对象=>数字

在用对象做四则运算时,JS解释器会尝试将其转换成数字

比如下面这种操作:

let obj = {};
obj + 1;

解释器会进行如下操作

let obj = {};
let temp = 0;

if(typeof obj.valueOf() != 'object'){
    temp = obj.valueOf();
}else if(typeof obj.toString() != 'object'){
    temp = obj.toString();
}else{
    throw new Error("Uncaught TypeError: Cannot convert object to primitive value...")
}

temp + 1; // "[object object]1"

用语言描述其过程:

  1. 调用valueOf(),返回值若不是原始类型,执行2

  2. 调用toString(),返回值若不是原始类型,执行3

  3. 抛出错误:Uncaught TypeError: Cannot convert object to primitive value(…)

下面来几个实例测试下:

仅调用 valueOf

let obj = {};
obj + 1; // "[object Object]1"

obj.valueOf = () => {
    return 0;
}
obj.toString = () => {
    return -1;
}
obj + 1; // 1

调用valueOftoString

let obj = {};
obj.valueOf = () => {
    return {};
}
obj.toString = () => {
    return -1;
}
obj + 1; // 0

var obj = {};

对象=>字符串

直接输出一个对象时,JS解释器会尝试将其转为字符串

比如下面的代码:

let obj = {};
alert(obj);

解释器会进行如下操作:

let obj = {};
let temp = "";

if(typeof obj.toString() != 'object'){
    temp = obj.toString();
}
else if(typeof obj.valueOf() != 'object'){
    temp = obj.valueOf();
}
else{
    throw new Error("Uncaught TypeError: Cannot convert object to primitive value(…)")
}
console.log(temp);

上面的步骤用语言描述就是:

  1. 调用toString(),返回值若不是原始类型,执行2

  2. 调用valueOf(),返回值若不是原始类型,执行3

  3. 抛出错误:” Uncaught TypeError: Cannot convert object to primitive value(…)”

恰恰与转换成数字的调用顺序相反

同样用实例测试下:

仅调用toString

let obj = {};
obj.toString = () => {
    return "hi";
}
obj.valueOf = () => {
    return "hello"
}
alert(obj); // "hi"

调用toStringvalueOf

// 调用 toString() 与 valueOf()
let obj = {};
obj.toString = () => {
    return {};
}
obj.valueOf = () => {
    return "hello"
}
alert(obj); // "hello"

等性运算 ==

在进行==比较时,不同类型的比较一般会都会转换成数字来进行

比如:[] == false => 0 == 0 => true

其中又有些特殊情况

比如:

  • NaN == NaN => false

  • null == undefined => true

参考博文

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
JavaScript 类型转换
JavaScript 类型转换
11 0
前端 js 将字符串类型转换成其他类型
前端 js 将字符串类型转换成其他类型
8 0
js基础笔记学习18-类型转换数值1
js基础笔记学习18-类型转换数值1
10 0
js基础笔记学习19-类型转换数值2
js基础笔记学习19-类型转换数值2
18 0
js基础笔记学习16-类型转换字符串1方式
js基础笔记学习16-类型转换字符串1方式
10 0
js基础笔记学习17-类型转换字符串2方式
js基础笔记学习17-类型转换字符串2方式
14 0
JS基础教程6——流程控制—循环语句与类型转换
三个语句在特定情况下都是可以升省略的,通过实际情况而定。 语句 1 在循环(代码块)开始之前执行。 语句 2 定义运行循环(代码块)的条件。 语句 3 会在循环(代码块)每次被执行后执行。
43 0
每日一题:谈谈 JavaScript 中的类型转换机制
每日一题:谈谈 JavaScript 中的类型转换机制
31 0
JavaScript核心概念(1):类型转换
JavaScript核心概念(1):类型转换
35 0
JavaScript 数据类型与类型转换
JavaScript 数据类型与类型转换
47 0
+关注
烽穹寒渊
快乐工作,认真生活
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Javascript中的函数
立即下载
Javascript异步编程
立即下载
JS零基础入门教程(上册)
立即下载