随便写写的

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
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值