1.请给出如下代码的输出结果
function Foo(){
Foo.a = function(){
console.log(1);
}
this.a = function(){
console.log(2);
}
}
Foo.prototype.a = function(){
console.log(3);
}
Foo.a = function(){
console.log(4);
}
Foo.a();
let obj = new Foo();
obj.a();
Foo.a();

2.请给出如下代码的输出结果
function changeObjProperty(o){
o.siteUrl = 'http://www.baidu.com';
o = new Object();
o.siteUrl = 'http://';
}
let webSite = new Object();
changeObjProperty(webSite);
console.log(webSite.siteUrl);

3.编写一个程序将数组扁平化并去除其中重复的数据,最终得到一个升序且不重复数组
var arr = [[1,2,2],[3,4,5,5],[6,7,8,9,[11,12,[12,13,[14]]]],10];
arr = arr.toString().split(','); //扁平化
arr = Array.from(new Set(arr)); //去重
arr = arr.sort((a,b) => { return a - b }); //排序
console.log(arr);

4.在数组A中找出数组B的位置
/*
要求:元素必须是连续的(也就是在A中找出连在一起的5,8,7),返回符合这种情况的B的第一个元素在A的位置(也就是5的位置,第3位),如果没有返回一个负数。
*/
var A = [1,2,3,5,8,7,6,5,9,1,1,6,9,8];
var B = [5,8,7];
A = A.join('');
B = B.join('');
console.log(A.indexOf(B));

5.如下循环是否打印出0,1,2,3,4,如果不是该如何修改,并说明理由。
for(var i = 0;i < 5; ++i){
setTimeout(function(){
console.log(i);
},100)
}
//因为setTimeout是异步的,等for循环执行完后才会执行,所以当执行setTimeout时,for循环已经执行完了,i的值此时为5,打印的值为5个5。
//方法一(闭包)
for(var i = 0; i < 5; ++i){
(function(i){//这个匿名函数生成了闭包的效果,新建了一个作用域,这个作用域接收到每次循环的i值保存了下来,即使循环结束,闭包形成的作用域也不会被销毁。
setTimeout(function(){
console.log(i);
},100)
})(i)
}
//利用闭包的原理,闭包使一个函数可以继续访问它定义时的作用域。而这个新生成的作用域将每一次循环的当前i值单独保存了下来。
//方法二(let关键字)
for(let i = 0; i < 5; ++i){
setTimeout(function(){
console.log(i);
},100)
}
//因为let关键字劫持了for循环的块作用域,产生了类似闭包的效果。并且在for循环中使用let来定义循环变量还会有一个特殊效果:每一次循环都会重新声明变量i,随后的每个循环都会使用上一个循环结束时的值来初始化这个变量i。
//方法三(try...catch)
for(var i = 0; i < 5; ++i){
try{
throw(i);
}
catch(j){
setTimeout(function(){
console.log(j);
},100)
}
}
//这是因为try...catch语句的catch后面的花括号是一个块作用域,和let的效果一样。所以在try语句块里抛出循环变量i,然后在catch的块作用域里接收到传过来的i,就可以将循环变量保存下来,实现类似闭包和let的效果。