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