Javascript中几个看起来简单,却不一定会做的题
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中几个看起来简单,却不一定会做的题的更多相关文章
- 在JavaScript中闭包的作用和简单的用法
在JavaScript中闭包的作用和简单的用法 一.闭包的简介 作用域链:在js中只有函数有作用域的概念,由于函数内能访问函数外部的数据,而函数外部不能访问函数内部的数据,由上述形成一种作用域访问的链 ...
- Android与javascript中事件分发机制的简单比较
在前面两篇博客中,我们讨论了Android中的事件分发的相关内容,那么在本篇博客当中,我们就简单探讨一下html或javascript中的事件分发机制,并进行简单的对比. 在前端中,对事件进行绑定有三 ...
- Javascript中String对象的的简单学习
第十一课String对象介绍1:属性 在javascript中可以用单引号,或者双引号括起来的一个字符当作 一个字符对象的实例,所以可以在某个字符串后再加上.去调用String 对象 ...
- 关于Javascript中页面动态钟表的简单实现
1.问题并不繁琐,在于HTML中 DOM(文档对象模型)方法的掌握,我的钟表实现重点用到了三个函数和一个事件 A)setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式.s ...
- JavaScript 中的 this ,看着一篇就够了
tip 在 js 中,this 这个上下文总是变化莫测,很多时候出现 bug 总是一头雾水,其实,只要分清楚不同的情况下如何执行就 ok 了. 全局执行 首先,我们在全局环境中看看它的 this 是什 ...
- javascript中的闭包,超简单论述,保证小学生必懂
js中的闭包已经有很多论断了,大家伙有没有听懂了,先引用一片比较高端 的 ”汤姆大叔“ 深入理解JavaScript系列(16):闭包(Closures) 好了,为了引起大家的兴趣,先来小诗一首 v ...
- Javascript中DOM技术的的简单学习
第十四课DOM技术概述1:DOM概述 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节 ...
- 在 javascript 中,为什么 [1,2] + [3,4] 不等于 [1,2,3,4]?
在 stackoverflow 上有人提问:arrays - Why does [1,2] + [3,4] = "1,23,4" in JavaScript? 问题 我想将一个数组 ...
- 【转】JavaScript中,{}+{}等于多少?
原文链接:http://www.2ality.com/2012/01/object-plus-object.html 译文链接:http://www.cnblogs.com/ziyunfei/arch ...
随机推荐
- Activiti 实战篇 小试牛刀
原文地址:http://blog.csdn.net/qq_30739519/article/details/51166062 1:工作流的概念 说明: 1) 假设:这两张图就是华谊兄弟的请假流程图 ...
- Java利用递归算法统计1-6的数组排列组合数
Java利用递归算法统计1-6的数组排列组合数 1.设计源码 /** * @Title:ArrayCombination.java * @Package:com.you.data * @Descrip ...
- HighCharts之2D回归直线的散点
HighCharts之2D回归直线的散点 1.实例源码 ScatterLine.html: <!DOCTYPE html> <html> <head> <me ...
- Linux显示文件和目录的详细资料
Linux显示文件和目录的详细资料 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ls -l 总用量 56 -rw-r--r-- 1 youhaidong y ...
- 异常-----The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path。
1, 找到新建页面所在的工程名字,然后左键选中,右键弹出功能菜单,选择Build Path,进入配置路径. 2, 在java build path 页面的下选择Libraries栏目(默认选择),点击 ...
- I2C总线通讯协议
I2C总线通讯协议 1. I2C总线简介 I2C是Inter-Integrated Circuit的简称,读作:I-squared-C.由飞利浦公司于1980年代提出,为了让主板.嵌入式系统或手机用以 ...
- javax顶层接口分析
1.Servlet接口分析 此接口是Servlet的最顶层接口,其中定义了Servlet生命周期相关的方法,所有Servlet都必须实现.此接口中的方法有以下几个: public void init( ...
- python访问mysql和redis
1. 修改mysql配置文件 修改bind-address=0.0.0.0(允许通过远程网络连接) 2. 修改redis配置文件 修改bind-address=0.0.0.0(允许通过远程网络连接), ...
- [Luogu4174][NOI2006]最大获益
luogu sol 一周没摸键盘了回来刷刷水题练练手感 显然,最大化收益可以转化为最小化损失,从而建立最小割模型. 记\(tot=\sum_{i=1}^{m}C_i\),事先假设所有的获益都得到了,那 ...
- 【HNOI2012】永无乡(splay,启发式合并)
题解 Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过 ...