这个题集是关于JS一些有点深度,且容易让人犯错的题目,每日更新一道,相信你们也能从中学到知识。
1.如下代码的输出结果:
console.log(1 + "2" + "2");
console.log(1 + +"2" + "2");
console.log("A" - "B" + "2");
console.log("A" - "B" + 2);
console.log('3' - '2') // 1
知识点:隐式强制类型转换。
2.下面关于块内声明函数的做法哪些是正确的?
A: if(x){
function foo(){
// ...
}
}
B: if(x){
var foo=function(){
// ..
}
}
C: if(x){
foo=function(){
//..
}
}
D: ECMAScript明确规范了块内函数,javascript实现了这个规范。
答案:B
解:一般我们尽量不要在if语句内声明函数,当必须声明函数时使用函数表达式,不要用函数声明方式。不用函数声明方式是为了防止函数声明提升,导致if条件没有起作用。选项A中的foo函数就是提升到全局中了。
3.如何判断一个js对象是否是Array,arr是Array实例,请用最准确的方法判断:
let arr = ["小李"];
A: typeof arr
B: arr instanceof Array
C: arr.toString === "[object Array]"
D: Object.prototype.toString.call(arr) === "[object Array]"
console.log(typeof arr);
console.log(arr instanceof Array);
console.log(arr.toString === "[object Array]");
console.log(Object.prototype.toString.call(arr) === "[object Array]");
答案:D
在常规数组中,B、D都可以判别数组,但D是最准确的。
分析:
- A: typeof(arr)返回的是一个Object
- B: instanceof 在跨frame对象构建的场景下会失效
- C: 这是个错误用法,且不能判断是否为数组,Arrays.toString()才是正确用法,返回一个字符串。
4.以下立即执行函数的执行结果:
(function (foo) {
console.log(foo.bar);
console.log(typeof foo.bar);
})({
foo: {
bar: 1
}
});
这个答案有可能会有人认为是this指针造成的,但仔细看传入的参数就会得出正确结果。
传入后的参数,实际为
参数:foo={
foo:{
bar:1
}
};
所以正确调用是:
console.log(foo.foo.bar);
console.log(typeof foo.foo.bar);
5.下面代码中a在什么情况下会打印1:
var a=?;
if(a==1&&a==2&&a==3){
console.log(1);
}
答案:
var a = {
i: 1,
toString: function () {
return a.i++;
},
};
if (a == 1 && a == 2 && a == 3) {
console.log