持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情
目录
今日题
题目
for(var i = 0; i < 5; i++) {
(function(i) {
setTimeout(function() {
console.log(i);
}, 1000);
})(i)
}
分析
一个for循环,for循环里面为一个匿名函数,且该函数为自调用,需要注意的是,这个匿名函数在每次调用时,都会将本轮所循环的变量i作为实参传递进去,且这个匿名函数中声明了形参i来接收这个循环变量i,这个匿名函数的功能为执行一个定时器,这个定时器会在1秒钟之后输出变量i。这里我们需要注意执行顺序(同步任务与异步任务),以及定时器中的i来自哪里,如果这个匿名函数会记住每次循环时的i,那么定时器输出时,里面的i便是每次循环时的i,如果这个匿名函数没有记住每次循环时的i,那么1秒钟之后定时器中输出的i为for循环最初的i还是循环结束之后的i呢,如果将本题中的var换为let,那最后的输出结果还会一样吗,如果一样,又是为什么呢。
昨日题
题目
var p1 = '蟑螂恶霸'
var p2 = String('蟑螂恶霸')
var p3 = new String('蟑螂恶霸')
console.log(p1 == p2)
console.log(p1 === p3)
console.log(p2 === p3)
答案
true,false,false
解析
p1使用字面量
的形式创建,毫无疑问p1是肯定为String类型的,且值为'蟑螂恶霸';p2虽然使用的是String
函数,我们知道toString
与String
两者皆是将其它数据类型转为字符串类型,但前者不可以转换null
与undefined
类型,而后者可以,此处String函数中的值已然是字符串,所以这个String函数可有可无,因此p2为字符串类型且值同样为'蟑螂恶霸';再来看p3,p3则选择了使用String构造函数
来创建值,而使用new调用构造函数时会返回一个对象,此处返回的这个对象被p3接收了,所以p3是String构造函数的实例对象,既然都已经是实例对象了,那么p3的数据类型便是Object类型了。好了,类型确定完成,这下就好办了。我们接着往下看p1 == p2
,由上可知,两者类型与值全部相同,所以会返回true
;而p1 === p3
,p1为字符串类型,p3为Object对象,又因为是全等运算符,且两者数据类型不相同,所以此处返回false
;同理,p2 === p3
同样也会返回false
结语
此文章已收录至《JavaScript每日一题》专栏,如果你对本专栏有任何建议,欢迎反馈。如果你对此文章中的题目还有不懂的地方,那么请在评论区留言与大家一起讨论吧。创作不易,少年,就请留个赞再走吧!