1 原始值和引用值类型及区别
: 原始数据类型有 string number boolean null undefined,原始数据类型存储在栈里,变量能直接访问到值。
引用数据类型有Object,array,function等,它们的值存储在堆里,变量存储在栈中,变量存储的值是数据在堆的地址。
复制原始数据类型,被复制的值和原来的值无关。
复制引用数据类型复制的是在堆中的地址,两个变量ab 指向同一个地址,a修改堆中的数据,b所指向的数据也发生了变化,因为它们指向的是同一个地址。
2 bind call apply 区别?
apply接受两个参数,第一个参数是this的指向,第二个参数是函数接受的参数,以数组的形式传入,且当第一个参数为null、undefined的时候,默认指向window(在浏览器中),使用apply方法改变this指向后原函数会立即执行,且此方法只是临时改变thi指向一次。
call方法的第一个参数也是this的指向,后面传入的是一个参数列表(注意和apply传参的区别)。当一个参数为null或undefined的时候,表示指向window(在浏览器中),和apply一样,call也只是临时改变一次this指向,并立即执行。
bind方法和call很相似,第一参数也是this的指向,后面传入的也是一个参数列表(但是这个参数列表可以分多次传入,call则必须一次性传入所有参数),但是它改变this指向后不会立即执行,而是返回一个永久改变this指向的函数。
apply,call,bind三者的区别
- 三者都可以改变函数的this对象指向。
- 三者第一个参数都是this要指向的对象,如果如果没有这个参数或参数为undefined或null,则默认指向全局window。
- 三者都可以传参,但是apply是数组,而call是参数列表,且apply和call是一次性传入参数,而bind可以分为多次传入。
- bind 是返回绑定this之后的函数,便于稍后调用;apply 、call 则是立即执行 。
3 this 的指向问题
this指向问题,js的this指向有这一篇就足够了_前端小白的逆袭的博客-CSDN博客
1.以函数的形式(包括普通函数、定时器函数、立即执行函数)调用时,this 的指向永远都是 window。比如fun();相当于window.fun();
2.以方法的形式调用时,this 指向调用方法的那个对象
3.以构造函数的形式调用时,this 指向实例对象
4.以事件绑定函数的形式调用时,this 指向绑定事件的对象
5.使用 call 和 apply 调用时,this 指向指定的那个对象
1.普通和箭头函数
1)非严格模式—普通函数的this指向windows
2)严格模式—普通函数的this指向undefined
3 )箭头函数this指向
箭头函数排在第一个是因为它的 this 不会被改变,所以只要当前函数是箭头函数,那么就不用再看其他规则了。箭头函数的 this 是在创建它时外层 this 的指向。这里的重点有两个:
创建箭头函数时,就已经确定了它的 this 指向。
箭头函数内的 this 指向外层的 this。
2)示例:一层对象中的箭头函数
var name = "windows";
var obj = {
name: "objFun",
arrawFun: () => {
console.log(this.name); // 结果:windows
}
}
obj.arrawFun(); // 结果:windows
// 原因:箭头函数的this取决于父级作用域,父级是对象没有自己独立的作用域而是位于全局,所以向上延申,找到了window
window.name = 'win';
const obj1 = {
name: 'joy',
getName: () => {
console.log(this); //window 调用前this是什么函数里面的this就是什么
console.log(this.name); //win
}
};
obj1.getName();
var name = "windows";
var arrowFun=()=>{
console.log(this.name);
}
arrowFun(); // 结果:windows
// 原因:箭头函数this指向取决于它定义时的父级作用域
2.对象中的函数
1)示例:一层对象中的普通函数
var name = "windows";
var obj = {
name: "obj",
fun: function () {
console.log(this.name);
}
}
obj.fun(); // 结果:obj。
// 因为是obj调用了fun(),所以this指向obj
4 、 深拷贝 浅拷贝
浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。
深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
5、new的原理?
创建一个对象;
将构造函数的this指向该对象;
执行构造函数的方法,使该对象继承构造函数的方法和属性;
返回该对象。
6 prototype与__proto__的关系与区别?
①所有引用类型都有一个__proto__(隐式原型)属性,属性值是一个普通的对象
②所有函数都有一个prototype(原型)属性,属性值是一个普通的对象
③所有引用类型的__proto__属性指向它构造函数的prototype