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

来源:互联网 发布:天猫魔盒怎么装软件 编辑:程序博客网 时间:2024/05/29 11:26

自动类型转换

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

  • 等性运算(==,即比较,如: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; // 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);

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

  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 对象转换之 toString 和 valueOf - FED社区

  • ECMAScript 等性运算符

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 出租发票有牌号是假的怎么办 支付宝里的多收多保被降级了怎么办 超市购物卡余额与实际不符怎么办 发广告的公众号无法取消关注怎么办 扣扣需要手机验证码登录怎么办 驾校报了联系不了教练了怎么办 手机号被别人注册了百度网盘怎么办 注册公司云证书申请成功后怎么办 淘宝购物卖家迟迟不发货怎么办 淘宝直播顾客加购物车不下单怎么办 东方航空联程机票航班延误怎么办 别别人伸请更换手机绑定qq怎么办 绑定手机号的扣扣忘记密码怎么办 微信公众号个人主体变更公司怎么办 微信号注册成订阅号了怎么办 微信开通了企鹅影院会员怎么办 注销公众号对公账号填写错误怎么办 国外邮的东西在北京扣了手续怎么办 微信购物商城买的东西不发货怎么办 魅族手机电话图标没有了怎么办 新商盟网页新商盟网页打不开怎么办 京东商城购物车装满了怎么办 商家想入住美团没有营业执照怎么办 旅行团定好的人数临时加人该怎么办 淘宝上发货后12天未收到款怎么办 京东购买的东西烂了怎么办 苹果4s手机激活密码忘了怎么办 小米4c返回键失灵了怎么办 小米4c下面三个键失灵怎么办 谷歌浏览器打不开指定的网址怎么办 电脑上我的电脑图标没了怎么办 手机上的短信图标没了怎么办 qq密保手机被别人换了怎么办 苹果六手机很卡网络不给力怎么办 堡垒之夜卡在载入界面怎么办 登录新福建一直说网络不给力怎么办 开发游戏平台给了钱不给东西怎么办 代号英雄与服务器断开连接了怎么办 千牛聊天页面买家信息不显示怎么办 秒拍存草稿箱的视频没了怎么办? 登录山东掌厅出现服务器错误怎么办