Javascript每日一学-几个看起来简单,却不一定会做的题

前言

Javascript作为前端开发必须掌握的一门语言,因为语言的灵活性,有些知识点看起来简单,在真正遇到的时候,却不一定会直接做出来,今天我们就一起来看看几道题目吧。

题目1

首先,我们来看一道稍微简单的题目,题目代码如下。

题目1

这道题考察的知识点是运算符的优先级。

首先,小括号()的优先级是最高的,所以首先会做判断,val与smtg相等返回true。因此最后这道题等价于判断是执行下面的语句1还是语句2。

判断

根据运算符的优先级我们知道,连接运算符+的优先级要高于条件运算符?的优先级,因此实际执行的是语句2,所以最终结果返回'Something'。

题目2

我们再来看看下面这道题。

题目2

这道题考擦的是数组的初始化和filter方法。

第一眼看上去,很多人会以为结果会输出[undefined, undefined, undefined],但是实际输出确是undefined,为什么会这样呢?

这是因为在Javascript里存在稀疏数组的概念,数组在初始化时,只会对已经确定索引的选项进行初始化,对于不存在索引的选项不进行初始化,通过以下代码可以确定。

判断

对数组使用in运算符时,是通过枚举数组的索引,通过3和4返回false可以知道,ary[3]和ary[4]实际是不存在的,未进行初始化。

filter源代码

在filter方法的源代码中,我们发现使用了in运算符,而ary数组没有对索引为3,4,5的值进行初始化,因此会直接跳过执行,所以结果最终返回undefined。

题目3

直接通过代码来看题目吧。

题目3

乍一看,很多人会以为答案输出'Case A',但是实际结果输出为'Do not know'。这是为什么呢?

这道题考察的知识点是:switch和string。我们需要知道以下两点:

Javascript中switch执行的是严格相等(===)。

字符串和String的实例不一样。

关于第2点我们可以测试一下。

测试代码

因此针对题目中的'A'与new String('A')并不严格相等,最终会返回''Do not know'。

题目4

针对上面的题目3,我们稍作一点改动,成为下面的题目4,再看看结果输出什么?

题目4

题目4相对于题目3,只是在最后调用的时候传入的参数是String('A'),它的结果就变成了'Case A'。这是为什么呢?

其实很简单,String(X)返回的是一个字符串而不会生成一个新的String实例,因此与'A'是严格相等的。

总结

看了上面的几道题目,是不是觉得Javascript确实有很多神奇之处,如果认真看完了能一下子全做对的话,说明基础还是不错的,后续还会总结出更多Javascript中的容易做错的题目。

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180616G1IHDN00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券