10道JavaScript基础面试题,你能对几道(四)

176 阅读2分钟
第 1 题
var x = 10;
function fn() {
    console.log(x);
}
function show(f) {
    var x = 20;
    f();
}
show(fn);
​
//输出
10

解析:JavaScript 才有的是词法作用域,它规定了函数内访问变量时,是从函数声明的位置向外层作用域去查找,而不是从调用的位置开始向上查找

第 2 题
Object.prototype.bar = 1;
var foo = {
    goo: undefined
};
​
console.log(foo.bar);
console.log('bar' in foo);
​
console.log(foo.hasOwnProperty('bar'));
console.log(foo.hasOwnProperty('goo'));
​
​
//输出
1
true
false
true

解析:in操作符:检测指定对象(右边)原型链上是否有对应的属性值。

hasOwnProperty方法:检测指定对象自身上是否有对应的属性值两者的区别在于in会查找原型链,而hasOwnProperty不会

示例中对象foo自身上存在goo属性, 而它的原型链上存在bar属性。

通过这个例子要注意如果要判断foo上是否有属性goo,不能简单的通过if(foo.goo){}判断,因为goo的值可能为undefined或者其他可能隐式转换为false的值。

第3 题
Object.prototype.bar = 1;
​
var foo = {
    moo: 2
};
for (var i in foo) {
    console.log(i);
}
​
//输出
'moo'
'bar'

解析:for…in…遍历对象上除了Symbol以外的可枚举属性,包括原型链上的属性

第 4 题
function foo1() {
    return {
        bar: "hello"
    };
}
function foo2() {
    return 
    {
        bar: "hello"
    };
}
console.log(foo1());
console.log(foo2());
​
​
// 输出
{ bar: "hello" }
undefined

解析: 两个函数唯一区别就是return后面跟的值,一个换行一个不换行。

当我们书写代码时忘记在结尾书写;时,JavaScript解析器会根据一定规则自动补上;。

function foo2() {
    return 
    {
        bar: "hello"
    };
}
​
//会被解析成function foo2() {
    return;
    {
        bar: "hello"
    };
}

因此函数执行后会返回undefined。

第 5 题
console.log(
    (function() {
        return typeof arguments;
    })()
);
​
​
// 输出
'object'

解析:arguments 是一个对应于传递给函数的参数的类数组对象。 类型为object。因此typeof arguments = ‘object’。

第 6 题
console.log(Boolean(false));
console.log(Boolean('0'));
console.log(Boolean(''));
console.log(Boolean(NaN));
​
//输出
// false
// true
// false
// false

解析: 只有下面几种值在转换为布尔值时为false:

+0, -0, NaN, false, undefined, null, ''

除此之外的值在转换为布尔值的时候全部为true。

第 7 题
console.log(Array(3));
console.log(Array(2, 3));
​
​
// 输出
[empty × 3] 
[2,3]

解析: 使用Array()创建数组时,要注意传入的值的类型和数量。

image-20211223164936908

第 8 题
var a = [1, 2, 3];
console.log(a.join());
​
var b = [1, 2, 3];
console.log(b.join(','));
​
var c = [1, 2, 3];
console.log(c.join('|'));
​
//输出
1,2,3
1,2,3
1|2|3

解析: join方法如果省略参数,默认以,分隔。

第 9 题
console.log(0.1 + 0.2 == 0.3);
​
//输出
false

解析:浮点数运算

image-20211223165451136

第 10 题
var a = [3];
var b = [1];
console.log(a - b); 
​
//输出
2

解析: 当执行 - 运算符的时候,被减数,减数都要是number类型,所以会进行转换

[3].toSting() => '3' => Number('3') => 3, [2]同理

\