前端面试经典问题

1. js原声基础,创建原声方法

给字符串定义一个方法,当传入一个正整数N时,结果返回N次字符串。
例如:console.log('hello'.repeatify(3));
控制台打印结果:hellohellohello。

需注意指定方法名称,但字符串自身不带有repeatify方法。

答案

可能不够标准,仅供参考.
String.prototype.repeatify = String.prototype.repeatify || function (N) {
    var str = '';
    for (var i = 0; i < N; i++) {
        str += this;
    }
    return str;
}
console.log('hello'.repeatify(5));

控制台结果
总结:现在的问题测试开发者有关JavaScript继承和prototype的知识点。这也验证了开发者是否知道该如何扩展内置对象(尽管这不应该做的)。

这里的另一个要点是,你要知道如何不覆盖可能已经定义的功能。通过测试一下该功能定义之前并不存在,所以:

 String.prototype.repeatify = String.prototype.repeatify || function (N){/* code here */};

2. 声明提升

如下,输出结果是什么呢

function test() {
   console.log(a);
   console.log(foo());
   var a = 1;
   function foo() {
	   return 2;
	}
}
test();

相信基础扎实的小伙伴肯定可以答对。

答案

undefined
2

第二题
解释:
原因是,变量和函数的声明都被提前了(移到了函数的顶部),但变量不分配任何值。因此,在打印变量的时候,它在函数中存在(它被声明了),但它仍然是 undefined 。表示换句话说,上面的代码等同于以下内容:

function test() {
    var a;
	function foo() {
	   return 2;
	}
	console.log(a);
	console.log(foo());
	a = 1;
}
 test();

3. this在JavaScript中是如何工作的

下面代码输出结果是什么?

var fullname = 'John Doe';
var obj = {
	fullname: 'Colin Ihrig',
	prop: {
	   fullname: 'Aurelio De Rosa',
	   getFullname: function() {
	      return this.fullname;
	   }
     }
};
console.log(obj.prop.getFullname());
var test = obj.prop.getFullname;
console.log(test());

需注意这题主要考察this的指向问题。

答案

Aurelio De Rosa
John Doe

原因是,在一个函数中,this的行为,取决于JavaScript函数的调用方式和定义方式,而不仅仅是看它如何被定义的。
在第一个 console.log()调用中,getFullname() 被调用作为obj.prop对象的函数。所以,上下文指的是后者,函数返回该对象的fullname。与此相反,当getFullname()被分配到test变量时,上下文指的是全局对象(window)。这是因为test是被隐式设置为全局对象的属性。出于这个原因,该函数返回window的fullname,即定义在第一行的那个值。

回答正确的同学请看附加题。

附加题:
同样是上面的代码,如何使最后的console.log() 打印 Aurelio De Rosa?

需注意这题主要考查的是如何改变this的指向。

答案

console.log(test.call(obj.prop));

没错,当我们需要改变this指向是我们可以使用call(),apply()以及bind方法,但这种情况我们通常使用call()。

最后一个思考题
call()和apply()的区别是什么?

慢慢思考…

如有错误请指出,谢谢,希望在找工作的朋友们,早日找到满意的工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值