前端乱弹99日之"奇怪"的操作符们

今天还是从一个奇怪的例子看起吧


上面这四段代码,你觉得会输出结果是多少?

嗯,给你2分钟,然后再看答案哈

嗯,结果如下:

true
false
false
true

如果你已经把答案答对了,并且能说出为什么,那么就不用看下面了,哈哈

如果要想解释清楚上面这四句话的输出,就必须提到两个Javascript的概念

1、动态类型
2、强制类型转化

对于动态类型,我想稍有点经验的JavaScript的程序员都能说出一二,比如在代码中并不指定变量的类型,在执行过程中,根据上下文推断出,同一个变量在一段程序中,可以是不同的事实类型(比如开始赋值是一个数字,后面又赋成一个字符串等,都是合法的)

那么如果两个不同类型的变量进行操作的时候会怎么样呢?比如我们常见的加号,看下这样一段代码

var a = 9
var b = "9"
console.log(a+b)
b = 9
console.log(a+b)

这段输出还是很明显的

99
18

在JavaScript的执行引擎最终执行这段代码的时候,当发现两个变量是不同类型的,就会进行一个强制类型转换,比如上面就是把a这个变量由数字变成了字符串,然后进行的字符串相加,而得到了99这个结果,后面我们又给b赋值为数字型,那么这时的加号就是变成了普通数学意义上的加法了,等到了结果18

这里,我们理解操作符的时候,可以把他想象为一个函数,而不是我们数学意义上的操作符。【这也是一个可以聊的话题,不过时间和篇幅原因,就先不展开了,其实是我有点懒。。。】

那么有了上面的知识,我们再来看下开头的那四行代码

第一行:console.log(1<2<3);
我们知道小于号是的运算顺序是从左到右的,肯定会优先计算1<2,等到结果是true,那么我们可以把上面这段代码替换为 true < 3

嗯,这个时候操作符的两边的类型是不一样的,那么就需要进行强制类型转换,这里是需要从布尔型转换为数值型。
JavaScript的有一个内置的Numbers的方法可以来做这件事:
Number(true) 的结果是1,而Number(false)的结果是0。

根据这个结果那么我们可以很轻松的把true < 3 替换为 1 < 3 这里显然,返回的结果应该是true。

那么如果有了这样的分析结果,去分析后面三行代码的执行结果来看,并不是一件难事了。

嗯,那么最后我们再看一个算是JavaScript也有点特殊的两个操作符

==
===

这里还是以例子来看下吧

var x = 3
var y = "3"
console.log(x == y)
console.log(x === y)

一般我们称===为严格比较,在网上也有相当多的资料,对于我们日常工作上来说,能够理解到==在比较的时候可以转换数据类型,===严格比较,只要类型不匹配就返回flase。也就先够了,一般比较的情况下都是建议使用严格比较的,而也有一些特殊的值,比如null\undefined等,需要根据情况考虑,再次受限于篇幅,今后会有机会继续去拓展这部分内容的。

嗯,已经都“弹”了四天,没想到还是有点坚持的,哈哈

你可能感兴趣的:(前端乱弹99日之"奇怪"的操作符们)