`

几道容易出错的JavaScript题目

阅读更多

下面这几道JavaScript题目大多来自于周五的一个小分享。都是很小的题目,但是很容易犯错。有一些是语言特性使然,有一些则是语言本身没有设计好而留下的陷阱。结果就是,遇到的人很容易陷进去骂娘,这些东西是略有些反直觉,感兴趣的不妨看看,平时我们还是尽量少些这样似是而非的代码。

1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function Container( properties ) {
    var objthis = this;
    for ( var i in properties ) {
        (function(){
                var t = properties[i];
                objthis[ "get" + i ] = function() {return t;};
                objthis[ "set" + i ] = function(val) {t = val;};
        })();
    }
}
 
var prop = {Name : "Jim", Age : 13};
var con = new Container(prop);
console.log(con.getName());
 
con.setName("Lucy");
console.log(con.getName());
console.log(prop.Name);

这段代码会输出什么?前面两行分别是“Jim”和“Lucy”,这不会有问题;但是第三行应该输出的是“Jim”,但是有的人会误认为prop对象已被修改,故输出“Lucy”。其实在匿名函数中,properties[i]的值已经赋给了临时变量t,之后闭包对于外部变量的引用完全由t这个媒介来完成,因此prop传入以后并未发生任何属性的更改。

2.

1
2
3
4
5
function a (x) {
    return x * 2;
}
var a;
console.log(a);

这段代码中,其实var a并没有任何影响,输出的是a(x)这样的方法签名。

3.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
c = 999;
var c = 888;
console.log(this.c); //①
function b (x, y, c) {
    c = 6;
    arguments[2] = 10;
    console.log(c); //②
    console.log(this.c); //③
     
    var c = 6;
    console.log(c); //④
    console.log(this.c); //⑤
}
b(1, 2, 3, 4);

这道题是比较变态的。

  • 第①处,this指的是window,在window下,c、this.c、var c在这里指的是同一个东西,看透这一点就好办了。打印的是888。
  • 第②处,方法体中,参数c和arguments[2]指的是同一个地址,所以把后者赋为10的时候,打印的是10,不是6。
  • 第③处,this指的是window,打印的是888。
  • 第④处,打印的是6。
  • 第⑤处,打印的是888。

4.

1
2
3
4
5
6
7
8
9
var start = new Date();
setTimeout(
    function(){
        var end = new Date();
        console.log(end - start);
    },
    1000
);
while(new Date() - start < 2000);

JavaScript因为是单线程工作的,因此虽然毁掉函数设置了1000毫秒后执行,事实上在1000毫秒的时候根本得不到执行,等待到while循环执行完毕后(因此已经是2000毫秒以后了),才去执行,因此输出应该是一个大于2000的数字。

5.

1
2
3
(function(){
    console.log(typeof arguments);
})();

很多人会说打印的是array,其实,arguments不是数组,打印的是object。

6.

1
2
function a(){return a;}
console.log(new a() instanceof a);

应该打印的是false,其实原因很简单,new a()的时候,因为return语句,得到的不是a的实例,而是a本身,a instanceof a当然是false啦。

最后,还有一个小题目是关于Function Invocation Pattern的,我在这篇文章里有写到,就不单独贴出来了。

文章系本人原创,转载请保持完整性并注明出自《四火的唠叨》

3
0
分享到:
评论
2 楼 RayChase 2013-07-08  
zhangyaochun 写道
第5个,其实是这样的:

typeof运算符返回的值如下:

1、undefined
2、boolean
3、number
4、string
5、object



嗯。
1 楼 zhangyaochun 2013-07-08  
第5个,其实是这样的:

typeof运算符返回的值如下:

1、undefined
2、boolean
3、number
4、string
5、object


相关推荐

    javascript预编译思考

    总的来说,JavaScript预编译是现代前端开发中不可或缺的一部分,它提升了代码的可读性和性能,同时也降低了出错的可能性。理解预编译的原理和应用,有助于我们编写更高效、更健壮的JavaScript代码。通过使用各种预...

    数学练习题目自动生成系统.zip

    它可以根据用户的需求生成不同数量的题目,如10道、20道、50道或100道,这适应了不同的学习场景,既可以用于课堂练习,也可以作为家庭作业的一部分。系统还能根据学生的实际水平调整题目的复杂度,使得学习更具针对...

    javascript经典特效---测试心算能力.rar

    在JavaScript中,我们可以利用Math对象来生成随机数字,并结合基本的算术运算符(如+,-,*,/)来构造各种心算题目。例如,我们可能生成两个1到100之间的随机数,然后让用户提供它们的和、差、积或商。同时,为了...

    javaScript有关练习作业及表单验证技术

    7. **错误提示和样式控制**:在验证失败时,JavaScript可以改变元素的样式(如添加红色边框或错误提示文字)以告知用户哪里出错,并提供纠正的指引。 8. **跨域资源共享(CORS)**:如果验证涉及到不同源的数据,理解...

    JavaScript习题(带答案).doc

    赋值语句x="今天天气真好"不会出错,JavaScript允许不同类型之间的转换。 8. 错误。表达式的类型不仅取决于运算符,也取决于操作数。 9. 错误。两个整数相除的结果是浮点数。 10. 正确。如果a=true且b未定义,a&&b的...

    每日100道加减题

    标题“每日100道加减题”暗示这是一个与编程练习相关的项目,目的是通过每日解决100道加减运算题目来提升编程技能,特别是算法和逻辑思维能力。描述中的内容提示这可能是一个初级水平的练习,初始设定是只需要完成6...

    javascript变量作用域使用中常见错误总结

    前言:javascript里变量作用域是个经常让人头痛抓狂的问题,下面通过10++个题目,对经常遇到又容易出错的情况进行了简单总结,代码样例很短很简单 题目一 代码如下: var name = ‘casper’; alert&#40;name&#41;; /...

    js-leetcode题解之157-read-n-characters-given-read4.js

    针对这个题目的 JavaScript 实现,通常需要考虑几种不同的情况,例如: 1. 输入数组长度小于 n:这意味着从文件中读取的数据已经足够。 2. 输入数组长度等于 n:需要继续读取文件直到读取了 n 个字符。 3. 输入数组...

    华为OD机试C卷- 出错的或电路(Java & JS & Python & C).md-私信看全套OD代码及解析

    ### 华为OD机试C卷 - 出错的或电路题目分析与解答 #### 题目背景 本题目来源于华为OD机试C卷,主要考察的是算法设计能力,特别是针对二进制数处理的理解与应用。题目背景是某生产门电路的厂商发现其生产的或门电路...

    2021-2022计算机二级等级考试试题及答案No.5038.docx

    23. **JavaScript语法**:题目23中,`a*b`不是合法的JavaScript标识符,因为它包含非法字符*。 24. **Windows设置**:题目24指出双击任务栏时间可以修改日期,这是正确的。 25. **文件删除**:在Windows中,从硬盘...

    js-leetcode题解之124-binary-tree-maximum-path-sum.js

    在探讨JS-leetode题解之124-binary-tree-maximum-path-sum.js这一特定主题时,我们首先要明白几个核心概念,其中包括JavaScript编程语言、LeetCode这个在线编程题库平台,以及与之相关的题目编号124,该题旨在解决...

    exercism_solutions:我对 exercism Javascript track https 问题的解决方案

    Exercism是一个在线平台,它提供了各种编程语言的练习题目,帮助开发者提升技能。在本案例中,"exercism_solutions"是一个针对JavaScript轨道问题的解决方案集合,用户在这个项目中分享了他们如何解决Exercism提供的...

    湖北华中科技 2013最新Java面试题之笔试题

    题目涉及到了`window`对象的几个常用属性:`opener`、`parent`、`top`、`self`。 **知识点:** - **`opener`**:指向打开当前窗口的窗口对象。 - **`parent`**:指向当前窗口的父窗口。 - **`top`**:指向最顶层的...

    基于ssm+mysql的编程类在线答题系统源码数据库.docx

    传统的教学管理模式下,学生信息管理和成绩记录等工作通常依赖于人工操作,这种方式不仅效率低下,而且容易出错。特别是在处理大量数据时,传统方法往往会暴露出诸多不足,如安全性差、准确性不高、灵活性不足等问题...

    微信考试小程序,答题小程序,刷题小程序

    此类小程序通常包含以下几个核心功能模块: 1. 用户登录与注册:为了保护用户数据的安全性和提供个性化服务,小程序需要用户进行登录注册。可以支持微信快捷登录,方便用户快速接入。 2. 题库管理:后台系统需维护...

    10-文本小节-解决问题的常见思路.md

    将复杂的代码段落拆解成最小的单元,这不仅有助于理解每一部分的作用,而且有利于在出错时快速定位问题。例如,对于JavaScript中的`['1','2','3'].map(parseInt)`问题,拆解代码并逐一检查,可以发现`parseInt`函数...

    2021-2022计算机二级等级考试试题及答案No.17070.docx

    - **题目**: Javascript中OnChange()事件产生于 i] Textbox中的内容发生变化 ii] Textarea中的内容发生变化 iii] 选择listbox中的项目 iv] 选中checkbox **正确答案**: D - **解析**: `onChange`事件通常...

    JavaScript_Practice_FizzBuzz:您可以使用输入的整数值来运行FizzBu​​zz问题(以升序显示在fizzNum中输入的值的倍数和在buzzNum中输入的值的倍数-显示fizz和buzz两者均为时的倍数。 fizzBu​​zz _显示最大两位数)在不输入整数值的情况下按执行按钮时显示错误(输入字符串_输入小数字时)_为空白时)

    FizzBuzz问题是一个经典的编程面试题目,它的目标是编写一个程序,打印从1到给定数n之间的所有数字,但有以下规则: 1. 当数字可以被3整除时,输出"Fizz"。 2. 当数字可以被5整除时,输出"Buzz"。 3. 当数字同时可以...

    code_quiz

    2. **用户界面**:JavaScript将用于创建一个用户友好的界面,展示题目、接收用户输入、显示结果和反馈。这可能涉及到DOM操作(Document Object Model),用于在网页上添加、修改或删除元素。 3. **逻辑处理**:当...

    2021-2022计算机二级等级考试试题及答案No.17696.docx

    这些题目涵盖了计算机科学和技术的多个方面,主要涉及到编程语言(Python、JavaScript)、数据库管理、CSS样式、数据处理(Excel公式)、多线程同步以及程序调试等知识点。下面将对每个题目进行详细的解释: 1. ...

Global site tag (gtag.js) - Google Analytics