JS解释器之自动类型转换:[] == ![]
来源:互联网 发布:天猫魔盒怎么装软件 编辑:程序博客网 时间:2024/05/29 11:26
自动类型转换
自动类型转换主要针对的是对象类型,有俩种情况会出现:
等性运算(
==
,即比较,如:false == [])四则运算(
+-*/
,如:[] + 1)。
在这两种运算中,js解释器需要将对象类型转换成原始类型(除了null
与undefined
),才能进行后续的操作。
在说明自动类型转换前,首先要了解两个方法:
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"
用语言描述其过程:
调用valueOf(),返回值若不是原始类型,执行2
调用toString(),返回值若不是原始类型,执行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
调用valueOf
与toString
let obj = {};obj.valueOf = () => { return {};}obj.toString = () => { return -1;}obj + 1; // 0var 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);
上面的步骤用语言描述就是:
调用toString(),返回值若不是原始类型,执行2
调用valueOf(),返回值若不是原始类型,执行3
抛出错误:” Uncaught TypeError: Cannot convert object to primitive value(…)”
恰恰与转换成数字的调用顺序相反
同样用实例测试下:
仅调用toString
let obj = {};obj.toString = () => { return "hi";}obj.valueOf = () => { return "hello"}alert(obj); // "hi"
调用toString
与valueOf
// 调用 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 对象转换之 toString 和 valueOf - FED社区
ECMAScript 等性运算符
- JS解释器之自动类型转换:[] == ![]
- C常见问题之自动类型转换
- C++之类型的自动转换
- PHP之——自动类型转换
- Java类型转换之自动类型转换和强制类型转换区别理解总结
- js判断之类型转换总结
- JS类型转换(强制和自动的规则)
- js之类型转换与引用类型(Boolean/Number/String)
- js之类型转换与引用类型(Boolean/Number/String)
- js之类型转换与引用类型(Boolean/Number/String)
- c++自动类型转换
- java类型自动转换
- Java_自动类型转换
- 自动类型转换
- c类型自动转换
- java类型自动转换
- C++自动类型转换
- java自动类型转换
- iOS开发流程:注册、开发、真机测试、发布以及上线。
- powershell_2.0和3.0_下载安装
- C#WinForm集成Webkit浏览器内核
- Eclipse 实用快捷方式的整理
- 新浪微博 图片上传接口
- JS解释器之自动类型转换:[] == ![]
- EtherCAT主站SOEM源码解析----ecx_siiPDO()
- powershell_2.0和3.0_下载安装
- Linux 常用命令
- ubuantu 搭建lamp
- String的其他最佳实践
- epoll和select的区别
- Sublime Text3安装了Anaconda后,写Python代码出现白框的解决方案
- 解决!只有IE64位浏览器能上网,其他软件都上不了网