theme: juejin
写在前面
前端工程师在工作中不可避免要死磕js,但你真的精通js了吗,今天分享10个js笔试题,你能全部答对吗?
题目详情
题目一
(function () {
return typeof arguments;
})();
答案:“object”
arguments是对象,也是伪数组,伪数组拥有 length 属性,其它属性(索引)为非负整数(对象中的索引会被当做字符串来处理,伪数组不具有数组所具有的方法。
伪数组转换成数组
[...arguments] // 使用数组拓展运算符
Array.prototype.slice.call(arguments) // 使用call绑定数组上的slice方法
题目二
var y = 1,
x = y = typeof x;
x;
答案:“undefined”
重新写下以上代码
var y = 1,
y = typeof x;
var x = y;
x;
题目三
(function foo(f) {
return typeof foo();
})(function () {
return 1;
});
答案:”number”
为了便于理解我们继续分解;
第一部分:
var baz = function(){ return 1; };
第二部分:
(function foo(f) {
return typeof foo();
})(baz);
函数foo接受一个参数是另一个函数, foo函数内部执行这个实参函数并且返回类型。函数接受本身作为自己的参数,然后调用,参数的优先级更高,实际执行的是return typeof 1。
题目四
var f = function g() {
return 1;
};
typeof g();
答案: ReferenceError: g is not defined
function g(){ return 1; }是函数表达式,事实上只有事一个名字,不是一个函数声明,
函数实际上是绑定到变量f,不是g。
题目五
var foo = {
bar: function () {
return this.baz;
},
baz: 1
};
(function () {
return typeof arguments[0]();
})
(foo.bar);
答案:”undefined”
题目六
var f = (function f() {
return "1";
},
function g() {
return 2;
})();
typeof f;
答案:****“number”
逗号操作符的使用可以很混淆,但这段说明它的行为:
var x = (1, 2, 3);
x;
x的值是3,这表明,当你有一系列的组合在一起,并由逗号分隔的表达式,它们从左到右进行计算,但只有最后一个表达式的结果保存。由于同样的原因,这个问题可以改写为减少混乱:
var f = (function g(){ return 2; })();
typeof f;
题目七
function f() {
return f;
}
new f() instanceof f;
**答案:**false
怎样去理解?
new f(), 首先这个操作会创建一个新对象并调用构造函数函数这一新的对象作为它的当前上下文对象。简单的说就是:
new f();
依稀记得高级程序设计里面是这么说的:
1 创建空对象。
2 将类的prototype中的属性和方法复制到实例中。
3 将第一步创建的空对象做为类的参数调用类的构造函数
默认如果没有覆盖这个空对象的话,返回this。
var a = new Object;
a instanceof Object //为true
我们在看 f() 返回了 return f;那么也就是说这个新的对象是是自身,构造函数本身在 new 的过程中会返回一个表示该对象的实例。但是函数的返回值覆盖了这个实例,这个new 就形同虚设。果f的形式为 function f(){return this}或function f(){}就不一样。
var a = new f();
a instanceof f // false
值得注意的是 instanceof 检测的是原型。
题目八
var x = [typeof x, typeof y][1];
typeof typeof x;
答案:****“undefined”
这题目比较简单,注意下返回类型即可。x = [,][1];即 x = typeof y = ‘undefind’。
typeof 返回的是string类型就可以了 ,typeof typeof必然就是’string’了。
题目九
(function(x){
delete x;
return x;
}
)(1);
答案:1
题目十
var x = 1;
if (function f() {}) {
x += typeof f;
}
x;
答案:****“1undefined”
这里有个难点,if 中的 function f(){} 要如何处理?函数声明的实际规则如下:
函数声明只能出现在程序或函数体内。从句法上讲,它们 不能出现在Block(块)({ … })中,例如不能出现在 if、while 或 for 语句中。因为 Block(块) 中只能包含Statement语句, 而不能包含函数声明这样的源元素。另一方面,仔细看一看规则也会发现,唯一可能让表达式出现在Block(块)中情形,就是让它作为表达式语句的一部分。但是,规范明确规定了表达式语句不能以关键字function开头。而这实际上就是说,函数表达式同样也不能出现在Statement语句或Block(块)中(因为Block(块)就是由Statement语句构成的)。
假设代码我们不妨变一下:
var x = 1;
if (function () {}) {
x += typeof f;
}
x;
var x = 1;
x += typeof f;
x;
f在这了没有被定义,所以typeof f 是字符串”undefined” ,字符与数字相加结果也是一个字符串,所以最后的x就是”1undefined”了。
网友评论