JS笔试题总结(一)

this指向问题?

var x=0;
        var foo={
            x=1,
            bar:function(){
                console.log(this.x);//this指foo
                var that=this;//this指foo
                return function(){
                    console.log(this.x);//this指的是wondow,相当于是匿名函数自调
                    console.log(that.x);
                }
            }
        }
        foo.bar();//调用bar,函数不调用不执行,this指向的是foo,输出1
        foo.bar()();//1 0 1

判断以下输出结果?

<h4>函数不调用不执行</h4>
    <script>
        function fun(){
            for(var i=0,arr=[];i<3;i++){
                arr[i]=function(){
                    console.log(i)
                }
            }
            return arr;
        }
        var funs=fun();//调用fun()
        funs[0]();//3
        funs[1]();//3
        funs[2]();//3
        //第一步运行函数后,循环for,结果返回的arr
        //arr[0]=function(){console.log(i)}
        //arr[1]=function(){console.log(i)}
        //arr[2]=function(){console.log(i)}运行三次的结果
        //arr=[function(){console.log(i)},function(){console.log(i)},function(){console.log(i)}]
        //执行funs=fun()相当于是funs=arr
        //因此funs[0]()等于是调用arr[0]的这个函数
        //此时调用进行执行,i=3;因此执行后,得3

判断输出结果?

function fun(n,o){
            console.log(o);
            return {
                fun:function(m){
                    return fun(m,n)
                }
            }
        }
        var a=fun(0);//console.log()结果是undefined,a={fun:function(m){
                    //return fun(m,n)}并且也运行了n=0;在a中有效
            a.fun(1);//0,n=1,但是没有变量接,释放了,a中依旧是0
            a.fun(2);//0,n=2,但是没有变量接,释放了,a中依旧是0
            a.fun(3);//0,n=3,但是没有变量接,释放了,a中依旧是0
        var b=fun(0)//undefined
            .fun(1)//0
            .fun(2)//1
            .fun(3); //2
        var c=fun(0).fun(1);//undefined 0
            c.fun(2);//1
            c.fun(3);//1
     //判断以上结果,主要是看前一个结果是否被接住

同样是判断输出结果?

		var a=2;
        var obj={
            a:4,
            fn1:(function(){
                this.a*=2;
                var a=3;
                return function(){
                    this.a*=2;
                    a*=3;
                    console.log(a);
                }
            })
        }
        var fn1=obj.fn1;//函数不调用不执行
        console.log(a);//2,函数不调用不执行,所以没有发生任何改变
        fn1();//function(){}//此处运行后改变了window的a的值
        obj.fn1();//此处改变的是obj的值
        console.log(a);//4
        console.log(obj.a);//8

判断

 		let a=3;
        let b=new Number(3);
        let c=3;
        console.log(a==b);//true  比较的是数值
        console.log(a===b);//false  比较的是数值和类型
        console.log(c===b);//false  比较的是数值和类型

深克隆

var lilei={
		sname:"Li Lei",
		sage:11,
		address:{
			city:"北京",
			street: "万寿路"
		}
	}
	function clone(oldObj){
		//在此填写作业代码,实现下方代码的要求
        var newobj={};
        for(var i in oldObj){
            if(typeof oldObj[i]=='object'){//此处判断类型
				console.log(oldObj[i])
               newobj[i]=clone(oldObj[i]);//如果是对象的话,再次调用clone函数,得的结果仍然需要变量去接,不接的话就会释放
            }else{newobj[i]=oldObj[i]};
        }
        return newobj;
	}
	var lilei2=clone(lilei);
	console.log(lilei)
	console.log(lilei2)//两个对象内容相同
	console.log(lilei==lilei2)//false,说明不是同一个对象
	//进一步: 修改lilei2
	lilei2.address.city="石家庄"
	lilei2.address.street="中山路"
	console.log(lilei);//lilei.address不受影响,保持不变,依然是北京万寿路。
    console.log(lilei2);

数组降维

二维数组降维

var arr=[1,2,3,[5,6],7,8,[9,5]]
	var arr=[].concat(...arr)
	//...arr先将数组打散成1 2 3 (2) [5, 6] 7 8 (2) [9, 5]
	//然后再拼接到[]中形成arr
	console.log(arr)

多维数组降维

		var arr=[1,2,3,[4,5],6,8,[9,4]];
        var arr=[].concat(...arr);//先将数组用...arr打散数组,然后使用concat拼接到[]中
        console.log(arr);
        //多维数组降维
        function fun(arr){
    //先降一次维
        arr=[].concat(...arr);
    //再检查降维后的数组中是否还包含子数组
        var hasArray=arr.some(function(elem){//some(function(){return 条件})用于判断是否包含符合条件的元素
            console.log(Array.isArray(elem));
        return Array.isArray(elem);
        // console.log(hasArray)
    })
    if(hasArray){ //如果包含子数组
       arr=fun(arr);//就只能再降维一次,直到检查不再包含子数组为止
    }
    return arr
}
console.log(fun(arr))

判断输出结果?

 var name = 'jerry';
function Person(name){
var name = 'haha'; //重新声明赋值了成haha,所以不管传什么值最好的结果都是haha
this.name = name;0//person.name
}
Person.prototype.getName=function(){
return this.name; 
}
Person.prototype.name='tomm';
var p1 = new Person();
var p2 = new Person('kite');
console.log(p1.getName());   //haha
console.log(p1.name);         //haha
console.log(p2.name);      //haha
console.log(p1);       //person:{}
console.log(p2);//person:{}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值