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

题目1

var val = 'smtg';

console.log(' Value is' + (val === 'smtg') ? 'Something' : 'Nothing');

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

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

//语句1

'Value is' + (true ? 'Something' : 'Nothing');

//语句2

'Value is true' ? 'Something' : 'Nothing';

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

'Something'.

题目2

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

var ary = [0,1,2];

ary[6] = 6;

var result = ary.filter(function(x){

  return x === undefined;

});

console.log(result);

这道题考察的时候数组的初始化和filter方法。

第一眼看上去,以为会输出[undefined,undefined,undefined],但是实际输出却是undefined,为什么会这样?

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

0 in ary;//true

1 in ary;//true

3 in ary;//false 

4 in ary;//false

6 in ary;//true 

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

我们再来看看 Array.prototype.filter方法和polyfill,注意代码中标注的地方。

Array.prototype.filter = function(fun /*thisArg*/){

  if(this === void 0 || this === null){

    throw new TypeError();

  }

  var t = Object(this);

  var len = t.length >>> 0;

  if(typeof fun !== 'function'){

    throw new TypeError();

  }

  var res = [];

  var thisArg = arguments.length >=2 ? arguments[1]:void 0;

  for(var i = 0;i<len;i++){

    if(i in t){  //注意这里,使用的是in运算符

      var val = t[i];

      if(fun.call(thisArg,val,i,t)){

        res.push(val);

      }

    }

  }

  return res;

}

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

题3

function caseshow(val){

  switch(val){

    switch(value){

      case 'A':

        console.log('A');

   break;

       case 'B':

        console.log('B');

   break;

         case 'C':

        console.log('C');

   break;

      default:
        console.log('do not know!');

    }  

  }

}

caseshow(new String('A'));

咋一看,很多人会以为输出'case A',但实际输出'do not know'。why?
这道题考察的知识点是:switch和string,我们需要知道一下两点:

1,JavaScript中switch执行的是严格相等(===)。
2,字符串和string的实例不一样。

第二点我们可以测试下。

var s_p = 'foo';
var s_o = new String(s_p)

console.log(typeof s_p) //'string'
onsole.log(typeof s_o) //'object'
onsole.log(s_p === s_o) //'false'

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

题4
针对上面的题目3,我们稍作一点改动,成为下面的题目4,再看看结果输出什么?
function caseshow2(val){
switch(val){
  case 'A':
    console.log('A');
    break;
  case 'B':
    console.log('B');
    break;
  case undefined:
    console.log('undefined');
    break;
  default:
    console.log('do not know!');
}
}
caseshow2(String('A'));
题目4相对于题目3,只是在最后调用的时候传入的参数是String('A'),它的结果就变成了'Case A'。这是为什么呢?

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

Javascript中几个看起来简单,却不一定会做的题的更多相关文章

  1. 在JavaScript中闭包的作用和简单的用法

    在JavaScript中闭包的作用和简单的用法 一.闭包的简介 作用域链:在js中只有函数有作用域的概念,由于函数内能访问函数外部的数据,而函数外部不能访问函数内部的数据,由上述形成一种作用域访问的链 ...

  2. Android与javascript中事件分发机制的简单比较

    在前面两篇博客中,我们讨论了Android中的事件分发的相关内容,那么在本篇博客当中,我们就简单探讨一下html或javascript中的事件分发机制,并进行简单的对比. 在前端中,对事件进行绑定有三 ...

  3. Javascript中String对象的的简单学习

    第十一课String对象介绍1:属性    在javascript中可以用单引号,或者双引号括起来的一个字符当作    一个字符对象的实例,所以可以在某个字符串后再加上.去调用String    对象 ...

  4. 关于Javascript中页面动态钟表的简单实现

    1.问题并不繁琐,在于HTML中 DOM(文档对象模型)方法的掌握,我的钟表实现重点用到了三个函数和一个事件 A)setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式.s ...

  5. JavaScript 中的 this ,看着一篇就够了

    tip 在 js 中,this 这个上下文总是变化莫测,很多时候出现 bug 总是一头雾水,其实,只要分清楚不同的情况下如何执行就 ok 了. 全局执行 首先,我们在全局环境中看看它的 this 是什 ...

  6. javascript中的闭包,超简单论述,保证小学生必懂

    js中的闭包已经有很多论断了,大家伙有没有听懂了,先引用一片比较高端 的 ”汤姆大叔“  深入理解JavaScript系列(16):闭包(Closures) 好了,为了引起大家的兴趣,先来小诗一首 v ...

  7. Javascript中DOM技术的的简单学习

    第十四课DOM技术概述1:DOM概述 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节 ...

  8. 在 javascript 中,为什么 [1,2] + [3,4] 不等于 [1,2,3,4]?

    在 stackoverflow 上有人提问:arrays - Why does [1,2] + [3,4] = "1,23,4" in JavaScript? 问题 我想将一个数组 ...

  9. 【转】JavaScript中,{}+{}等于多少?

    原文链接:http://www.2ality.com/2012/01/object-plus-object.html 译文链接:http://www.cnblogs.com/ziyunfei/arch ...

随机推荐

  1. 【php】PHP环境整合

    很久没装环境, 今天重新装了一次.遇到不少问题.记录下方便以后查看 修改apache的配置文件httpd.conf #apache 解析phpLoadFile "C:/phpeve/php5 ...

  2. CSS3之Border-radius

    1.属性介绍 border-radius:none|12.3px,取值不可为负数,表示边框圆角 相关属性:border-top-right-radius , border-bottom-right-r ...

  3. Java之Iterator

    Java之Iterator 1.实例源码 /** * @Title:IteratorJava.java * @Package:com.you.model * @Description:Iterator ...

  4. Errors running buider 'DeploymentBuilder' on project 'HFMS'

    1.错误描述 2.错误原因 HFMS项目不是利用MyEclipse创建的,但是用MyEclipse打开的 3.解决办法 (1)关闭MyEclipse,找到HFMS项目,删除"com.genu ...

  5. python实现简单排序算法

    算法 递归两个特点: 调用自身 有穷调用 计算规模越来越小,直至最后结束 用装饰器修饰一个递归函数时会出现问题,这个问题产生的原因是递归的函数也不停的使用装饰器.解决方法是,只让装饰器调用一次即可,那 ...

  6. java SpringWeb 接收安卓android传来的图片集合及其他信息入库存储

    公司是做APP的,进公司一年了还是第一次做安卓的接口 安卓是使用OkGo.post("").addFileParams("key",File); 通过这种方式传 ...

  7. 【JDK1.8】JUC.Lock综述

    一.前言 前段时间结束了jdk1.8集合框架的源码阅读,在过年的这段时间里,一直在准备JUC(java.util.concurrent)的源码阅读.平时接触的并发场景开发并不很多,但是有网络的地方,就 ...

  8. 【BZOJ2049】洞穴勘测(Link-Cut Tree)

    [BZOJ2049]洞穴勘测(Link-Cut Tree) 题面 题目描述 辉辉热衷于洞穴勘测. 某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别 ...

  9. Android中Activity.this,getApplicationContext(),getBaseContext()和this详解

    转自:http://android.tgbus.com/Android/tutorial/201103/346236.shtml 在使用Android上下文参数的时候经常分不清Activity.thi ...

  10. java设计模式单例模式 ----懒汉式与饿汉式的区别

    常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...