linux下网站开发,汉中市建设工程招投标交易中心,网址备案号查询,快速网络推广开篇JS作为一门动态语言十分灵活#xff0c;但是伴随而来的弱类型隐式转化的问题让我们十分头疼。隐式作为一个大课题#xff0c;很难用一个很简短的篇幅把JS的隐式转换讲解的十分清楚。所以我选择用多次少量的策略进行梳理#xff0c;争取让你每看完一篇都会有加深对于JS隐…开篇JS作为一门动态语言十分灵活但是伴随而来的弱类型隐式转化的问题让我们十分头疼。隐式作为一个大课题很难用一个很简短的篇幅把JS的隐式转换讲解的十分清楚。所以我选择用多次少量的策略进行梳理争取让你每看完一篇都会有加深对于JS隐式转换的理解。一元操作符说到隐式转换就不得不提操作符了绝大多数的隐式转换都与操作符有关。我们就从最简单的一元操作符开始我们的隐式转换探索之旅吧 gogogo!先来一串 操作符的基础实践let n 1
let s1 2
let s2 z
let o {valueOf: function() {return -1}
}n n // 值不变
s1 s1 // 值变为 2
s2 s2 // 值变为 NaN
o o // 值变为 -1
由上面的代码可以看到使用操作符后使用效果会像Number()转型函数一元进行解析。而Number()的转化规则就是一元操作符隐式转化的精髓所在。(开始划重点 Number()的转化规则如下 数字不变true和false分别转化为0和1 null返回0 undefined返回NaN string比较复杂 如果为空则返回0 如果是数字(包括整型浮点数十六进制)则忽略前导0转化为对应十进制数字 如果非上述格式则返回NaN如果是对象则首先调用valueOf方法然后按照前面的规则转换如转换结果还是对象非原始值则再调用对象的toString方法。虽然红宝书中描述为“如果是对象则首先调用valueOf方法转换返回的值如果为NaN则再进行toString方法”但是据我实践发现貌似此处的描述并不准确或者谁来跟我讲讲 既然我们知道了的转换规则那么可以拓展来验证一下上面的规则我们这里主要对于对象进行探究PS: 没有记住规则不要紧可以按照上面的规则走多来几次就明白了~let o1 {valueOf: function() {console.log(执行valueOf)return a},toString: function() {console.log(执行toString)return -1}
}o1 o1 // 执行valueof NaNlet o2 {valueOf: function() {console.log(执行valueOf)return {}},toString: function() {console.log(执行toString)return -1}
}o2 o2 // 执行valueof 执行toString -1let o3 {valueOf: function() {console.log(执行valueOf)return []},toString: function() {console.log(执行toString)return -1}
}o3 o3 // 执行valueof 执行toString -1let o4 {valueOf: function() {console.log(执行valueOf)return function () {}},toString: function() {console.log(执行toString)return -1}
}o4 o4 // 执行valueof 执行toString -1let o5 []
o5 o5 // 0let o6 function() {}
o6 o6 // NaN
关于最后的o5o6的结果我们要解释一下。不要忘记Array和Function也是对象哦所以他们的执行顺序应该是下面这样的。o5 Array的执行顺序: o5.valueOf()返回[]此时[]还是个Array对象于是接下来执行[].valueOf().toString() [].valueOf().toString()返回 Number()返回0o6 Function的执行顺序: o6.valueOf()返回function() {}此时还是个Function对象于是继续执行toString() o6.valueOf().toString()返回function() {} Number(function() {})返回NaN 同样的-作为一个二元操作符也是与上面的执行类似不过要注意-是会取负的哦~总结今天我们学习到了一元运算符带来的隐式转换主要要记得 Number()的转换规则尤其是对象今日习题{}[]在Chrome控制台打出的结果是小提示Chrome控制台中前面的{}会被当成空代码块哦作者想说的希望大家看了可以提一些建议~ 嘿嘿嘿 MacbookPro任务进度2/2配图是女朋友拍的 转载请注明出处告诉我一下我会很开心~今天总算是开了一个隐式转换类型的头哈哈哈 当然写这方面也是因为自己想要更加深入的了解JavaScript。可能很多人会觉得这种情况我要知道干嘛业务里面又用不到。之前的我也这么想过。但是我逐渐发现深入了解语言的特性可以让自己对于代码的掌控能力越强出现的BUG也越少就算出现BUG了定位的效率也越来越高。其中滋味只能自己体会啦~当然写之前一定一定要自己梳理清楚整体逻辑和细节尤其是复杂且紧急的需求否则你就会留下深深的大坑。高能预警下篇不出意外的话应该还是隐式转换毕竟是个大课题啊哈哈哈 透露几个下期的关键词关键字原始值、valueOf、toPrimitive、下期更精彩哦~