js初级相关笔试题

1 以下代码执行的结果
for(var i=0;i<3;++i){
setTimeout(function(){
	console.log(i);
},100);
}

解答:这道题涉及了异步、作用域、闭包
settimeout是异步执行,100ms后往任务队列里面添加一个任务,只有主线上的全部执行完,才会执行任务队列里的任务,当主线执行完成后,i是3,所以此时再去执行任务队列里的任务时,i全部是3了。对于打印3次是:
每一次for循环的时候,settimeout都执行一次,但是里面的函数没有被执行,而是被放到了任务队列里面,等待执行,for循环了3次,就放了3次,当主线程执行完成后,才进入任务队列里面执行。
如果为var ,则打印3,3,3
如果为let ,则打印0,1,2

2 javascript 代码执行后, 浏览器 alert 出来的结果分别是:
var color = "green";
var test4399 = {
	color:"blue",
	getColor:function(){
		var color = "red";
		alert(this.color);
	}
}
var getColor = test4399.getColor;
getColor();    //green 相当于普通的函数调用,此时this指向window,this.color应该为全局变量的值
test4399.getColor();    //blue  此时this指向调用函数的对象test4399,因此this.color应该为对象的属性值

解答:题的重点只是this关键字的用法,指向运行时的对象
1、函数作为对象的方法被调用,this指向调用者!
2、用于构造函数,this指向新对象
3、ES6的箭头函数,箭头函数不会创造块作用域,无法生成一个独立的环境,this指向上层的this

3分析下面javascript代码,输出结果为:
<script>
	function out(x){
		 var temp = 2;
		 function inside(y){
		 	document.write( x + y + (temp--)); //10
	 }
		 inside(5);
	 }
	 out(3); 
</script>

解答:这道题有两个考点:
(1)var定义的变量有定义提升的问题。
(2)就是 a++ ; ++a;的问题。(a++就是等执行完改语句再加加; ++a 就是先加加再执行)这已经是先算括号里的了,我们单独把括号摘出来 (temp–) 这算是一个表达式,那么这个表达式的值是多少?是2,temp先计算再自减所以表达式的值是2。

4 如下代码输出的结果是什么:
console.log(1+ "2"+"2");
console.log(1+ +"2"+"2"); 
console.log("A"- "B"+"2");
console.log("A"- "B"+2);

解答:console.log(1+ “2”+“2”); //对于加法来说,如果只有一个操作数是字符串,则将另一个操作数也转换为字符串,然后将两者拼接,为122
console.log(1+ +“2”+“2”); //(+“2”)应用了一元加操作符,一元加操作符相当于Number()函数,会将 (+“2”)转换为2,1+2+“2”=32
console.log(“A”- “B”+“2”); //在减法中遇到字符串和加法相反,调用Number()函数将字符串转换为数字,不能转换则返回NaN,此时运用加法规则,NaN+“2”,"2"是字符串,则将两者拼接。
console.log(“A”- “B”+2); //这个与上面的不太相同,减法运算后依然为NaN,但是加号后面的为数字2,加法规则中,如果有一个操作数是NaN,则结果为NaN

5 以下代码执行后,a.x 和 b.x 的结果分别是
 function A(x){
	this.x = x;
}
A.prototype.x = 1;
function B(x){
	this.x = x;
}
B.prototype = new A();
var a = new A(2), b = new B(3);
delete b.x;

解答:var a = new A(2), //a.x首先要在自己的构造函数中查找,没有采取原型上找,这里有this.x = x.所以a.x = 2;(注:构造函数有x的时候不会再往原型链上找了
b = new B(3);//B.prototype = new A();形成原型链
delete b.x;//但是delete只能删除自己的x不能删除父级的x.
//b.x通过原型链找到构造函数A里面的this.x=x但是没有赋值,所以undefined

6 请问以下程序的输出是
function Foo(){
     var i=0;
     return function(){
         document.write(i++);
     }
}
var f1=Foo(),
f2=Foo();
f1();   //0
f1();	//1
f2(); 	//0

解答:1.当函数被创建时,内部[scope]属性被存储,在这个属性中保存一个包含全局变量对象的作用域链。2.当函数被调用时,会创建一个执行环境及相应的作用域链,argument和实参为其进行初始化。
f1(),f2()分别创建了自己的执行环境,所以它们两个是相互独立的,执行之后都会返回一个匿名函数,这个匿名函数的作用域链被初始化为其包含函数的活动对象(这里也就是i)和全局变量对象,f1执行之后i并不会销毁,因为返回的匿名函数还要引用i,i仍然在内存中,所以执行两次之后i的值变成了1,而f2执行之后i为0

7 以下代码执行后, num 的值是?
var foo=function(x,y){
	return x-y;
}
function foo(x,y){
	return x+y;
}
var num=foo(1,2)	 //-1

解答:1. 变量声明、函数声明都会被提升到作用域顶处;
2. 当出现相同名称时,优先级为:变量声明(foo#1) < 函数声明(foo#2) < 变量赋值(foo#3)

8 在浏览器中运行的结果是
var foo = {n:1};
(function(foo){            //形参foo同实参foo一样指向同一片内存空间,这个空间里的n的值为1
    var foo;               //优先级低于形参,无效。
    console.log(foo.n);    //输出1
    foo.n = 3;             //形参与实参foo指向的内存空间里的n的值被改为3
    foo = {n:2};           //形参foo指向了新的内存空间,里面n的值为2.
    console.log(foo.n);    //输出新的内存空间的n的值
})(foo);
console.log(foo.n);        //实参foo的指向还是原来的内存空间,里面的n的值为3.
9 控制台的输出结果是:
console.log(1);
let a = setTimeout(() => {console.log(2)}, 0);
console.log(3);
Promise.resolve(4).then(b => {
console.log(b);
clearTimeout(a);
});
console.log(5);

解答:执行顺序是先执行同步的任务–输出1,3,5
在执行异步任务:其中异步任务分为宏任务和微任务,微任务优先级高于宏任务。promise.then执行的微任务,输出4,然后clearTimeout(a)清除了定时器,于是不再打印2。
结果输出:1,3,5,4

10 写出下面代码的运行结果
var a,b;
 (function(){
	 alert(a);   //这是第一个输出的,先在局部没找到a变量,然后去全局找,找到了但没定义,输出undefined
	 alert(b);    //这是第二个输出的,其他同上
	 var a=b=3;    //定义一个局部变量a=3,然后给全局变量b赋值 b=3;
	 alert(a);     //这是第三个输出,局部变量a=3
	 alert(b);     //这是第四个输出,全局变量b=3
 })();            //这个函数体已经执行完毕,里面的内存已经被垃圾回收器回收,局部变量a销毁
	 alert(a);        //这是第五个输出,全局变量a=undefined
	 alert(b);        //这是第六个输出,全局变量b=3

相关练习,看看你对上面题目的掌握

1 下列代码输出结果正确的是
var val = 12;
function fun1(){
    console. log(val);
    var val = 20;
    console.log(val);
}
fun1();
2 以下代码执行后,console 输出的信息是?
for(var i = 0; i < 5; i++){
	requestAnimationFrame(() => console.log(i));
}
3 执行以下程序段后,x的值是
var x=0;
switch(++x)
{
case 0: ++x;
case 1: ++x;
case 2: ++x;
}
4下面这段JS程序的执行结果是:
var user = {
 count : 1,
 getCount: function(){
  return this.count;
 }
}
var func = user.getCount
console.log(func())
5 x 的值是:
function A() {
	this.do=function() {return ‘foo’;};
}
A.prototype=function() {
    this.do=function() {return ‘bar’};
};
var x=new A().do();

注意以上说法有不对的地方,欢迎大家下方留言,答案也可以在下方留言哦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值