前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >几道容易出错的 JavaScript 题目

几道容易出错的 JavaScript 题目

作者头像
四火
发布2022-07-15 21:20:16
发布2022-07-15 21:20:16
28500
代码可运行
举报
文章被收录于专栏:四火的唠叨四火的唠叨
运行总次数:0
代码可运行

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

1.

代码语言:javascript
代码运行次数:0
运行
复制
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”。其实在匿名函数中,propertiesi 的值已经赋给了临时变量 t,之后闭包对于外部变量的引用完全由 t 这个媒介来完成,因此 prop 传入以后并未发生任何属性的更改。

2.

代码语言:javascript
代码运行次数:0
运行
复制
function a (x) {
    return x * 2;
}
var a;
console.log(a);

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

3.

代码语言:javascript
代码运行次数:0
运行
复制
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 和 arguments2 指的是同一个地址,所以把后者赋为 10 的时候,打印的是 10,不是 6。
  • 第③处,this 指的是 window,打印的是 888。
  • 第④处,打印的是 6。
  • 第⑤处,打印的是 888。

4.

代码语言:javascript
代码运行次数:0
运行
复制
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.

代码语言:javascript
代码运行次数:0
运行
复制
(function(){
    console.log(typeof arguments);
})();

很多人会说打印的是 array,其实,typeof 根本不会打印 array 的啊,打印的是 object。

6.

代码语言:javascript
代码运行次数:0
运行
复制
function a(){return a;}
console.log(new a() instanceof a);

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

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

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《四火的唠叨》

×Scan to share with WeChat

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档