前端面试

1.call,apply,bind —>更改this指向
* call方法和apply方法,第一个参数是this所要指向的那个对象,如果设为null或undefined或者this,则等同于指定全局对象。
* 第二个参数有所不同

fun.call(thisArg, arg1, arg2, …)
fun.apply(thisArg, [argsArray])


猫吃鱼,狗吃肉,奥特曼打小怪兽。
有天狗想吃鱼了
猫.吃鱼.call(狗,鱼)
狗就吃到鱼了
猫成精了,想打怪兽
奥特曼.打小怪兽.call(猫,小怪兽)

var cat={
    add(a,b){
        return a+b
    },
    eatFish(){
        console.log('eat fish')
    }
}
var dog={}
cat.add.apply(dog,[3,4]) //7
cat.add.call(dog,3,4) //7
cat.eatFish.call(dog) //'eat fish'
cat.eatFish.apply(dog) //'eat fish'
cat.add.bind(dog) //返回add函数,函数没有执行
cat.add.bind(dog)(4,6) //返回add函数的执行结果 => 10

Math.min.call(null,1,4,2,4,8,0) //0
Math.min.apply(null,[1,4,2,4,8,0]) //0

2.Cookie,sessionStorage,localStorage的有什么区别
* sessionStorage,loacalStorage 是HTML5提供的两种存储在客户端的新方法。
* cookie在浏览器和服务器间来回传递,数据不能超过4k

sessionStorage:仅在当前浏览器窗口关闭前有效,自然也就不可能持久保持;
localStorage:始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据;

3.去除两个字符串中相同的字符

var a_str='abcdefgsadfasdfasd';
var b_str='dfsfauyiuykyy';
var a_Set=new Set(a_str); //set去重
var b_Set=new Set(b_str); //set去重
var [a_newStr,b_newStr]=['',''];
for(let item of a_Set.values()){
    a_newStr+=item; //重新拼接字符串
}
for(let item of b_Set.values()){
    b_newStr+=item; //重新拼接字符串
}

for(let i=0,l=a_newStr.length;i<=l;i++){
    for(let j=0,len=b_newStr.length;j<=len;j++){
        if(a_newStr[i]===b_newStr[j]){ //相同字符删除
            a_newStr=a_newStr.replace(a_newStr[i],'');                          
            b_newStr=b_newStr.replace(b_newStr[j],'');
        }
    }
}

4.class继承

class Parent{
    constructor(x, y) {
       this.x = x;
       this.y = y;
    }
    print(){
        console.log(`${this.x}---${this.y}`);
    }
}
class Child extends Parent{ //继承父
    constructor(x,y,z){//子的构造器
        super(x,y);
        this.z='zi';
    }
    child(){
        console.log(this.x+'----'+this.y+'----zi')
    }
}
new Child(3,5,'zi').print();//调用父方法
new Child(3,5,'zi').child();//调用子方法

5.原型继承和构造继承

function fu(name){
    this.name=name||'父';
}
fu.prototype.print=function(){
    console.log('----'+this.name);
}
function zi(){};
zi.prototype=new fu();
zi.prototype.name='子';
new zi().print();

-----
function zi(name){
    fu.call(this);
    this.name=name||'子';
}
new zi('zi').print();

6.下面结果是什么?

var [a,b,c]=[[1,2],[3,4],5];
function test(a,b,c){
    a=[];
    b[0]=6;
    c=7;
    console.log(a,b,c);
}
test(a,b,c);// [] [6,4] 7 传址 传值 b变量中数组的第二个元素的值未改变


var a; //声明未赋值 
a===window.a; //true 顺序执行
if('a' in window){
    a='hello';
    console.log('先执行:'+a)
}
console.log('后执行:'+a)
先执行:hello  //变量提升,js是同步执行代码。
后执行:hello
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值