说出以下几个表达式的结果
var obj1 = { name: '张三'}
var obj2 = obj1
var obj3 = { name: '张三'}
null == undefined
123 == '123'
false == 0
NaN == false
obj1 == obj2
obj1 == obj3
要想回答上述问题,必须理解js在执行==时候的一些数据转换规则和成文的规定。ECMA-262对==的约定如下:
x==y
如果x和y的类型相同,
如果x是Number
你可能注意到了这样两个函数
参数类型 | 结果 |
---|---|
Undefined | NaN |
Null | +0 |
Boolean | true为1,false为+0 |
Number | 参数本身 |
String | 简单理解,能转换成数字的就会转换成数字,比如数字字符串,十六进制的数字等,转换失败则返回NaN(详见ECMA-262-9.3.1,内容较多,不展开叙述) |
Object | 两步转换操作:1. ToPrimitive(input argument, hint Number) 2. ToNumber() |
参数类型 | 结果 |
---|---|
Undefined | 输入值 |
Null | 输入值 |
Boolean | 输入值 |
Number | 输入值 |
String | 输入值 |
Object | 调用DefaultValue方法 |
好吧,又多了一个DefaultValue方法
细心的你发现上面ToNumber对于Object的转换里有这么一句ToPrimitive(input argument, hint Number),就是说调用ToPrimitive的时候,除了传入要转化的值,还传了一个hint参数,这个参数可以为Number,也可以为String。那么什么时候传入这两个参数,同时又有啥区别?
如果input argument是内置的Date类型,则参数是hint String,否则默认hint Number。
说了这么多,我们回到上面的题目,一一解答:
把上面题目中的==换成===,试问结果会发生怎样的变化?这里我就不说了,推理方式同上,根据如下规则,答案请各位看官自行补充。
如果x是Number
来源:https://segmentfault.com/a/1190000015757181
今天在看lodash的源码中slice这个函数实现的时候发现了里面有这么一行代码:>> 和 >>>有什么不一样、移位0有什么意义、Uint32类型是如何转换的
后缀表达式,又称逆波兰式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。
[]==![] 感叹号!的优先级最高,因此先计算![], 其结果为 false, 所以表达式被转换成: []==false.遇到Boolean类型,需要先转换成Number类型,所以表达是变成 []==0,0是基础类型,[]是引用类型
以博客写文章为例,有的时候我们不经意间写的字符串带标签,然后浏览器将其解析了,实际上我们并不希望其被解析,于是可通过核心代码解决该问题。
三元表达式怎么用?三元表达式怎么就有用了?代码量会减少这是事实,配合箭头函数写函数式代码,哪个更易读这个就是主观判断了,见仁见智:
三元表达式,语法:* var 变量=表达式1?表达式2:表达式3;* 执行过程:* 表达式1的结果是true还是false,如果是true则执行表达式2,然后把结果给变量
JavaScript是一种非常容错的编程语言,许多在其他编程语言中不合法的表达式在JavaScript中都能正常工作。这导致了很多奇怪的代码。你想挑战它吗?
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!