js部分知识点小结

157 阅读4分钟

1,js数据类型分为:基本类型和对象

基本类型包含:null,undefined,boolean,string,number,symbol

注意:NAN属于number类型,但NAN不等于本身

基本类型数据不可修改,一般是固定大小的,所以一般是保存在栈中引用类型数据是可修改的,大小不固定,所以保存在堆中。引用类型数据的地址存储在栈中,访问栈时,如果发现,是一个地址,则去访问对应地址的对象


2,js 在进行相对比较的时候,会进行强制类型转化

3,原型:每个函数都有prototype属性,除了Function.prototype.bind(),,该属性指向原型

每个对象都有 __proto__ 属性,指向了创建该对象的构造函数的原型。

对象可以通过 __proto__ 来寻找不属于该对象的属性,__proto__ 将对象连接起来组成了原型链。

4,new 

 首先新生成一个对象,然后链接到原型,绑定this,返回新对象

5,this

this只依赖于调用函数前的对象

箭头函数没有this,只取决于他外面的第一个不是箭头函数的函数的this

6,var 声明会存在变量提升

     在ES6中引入let,let不能在声明前使用,并不是常说的let不存在变量提升,let提升了声明但没有赋值,因为临时死区(TDZ)导致不能在声明前使用

7,闭包

   闭包的概念 : 当内部函数保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成内存泄漏(内存占用)

8,立即执行函数

此类函数没有声明,在一次执行后即释放。适合做初始化工作。

立即执行函数的两种写法:

//第一种
(function(){}())  //w3c建议

//第二种
(function(){})()

   对于非匿名的立即执行函数,js解释器在遇到时,会创建一个辅助的特定对象,然后函数名称作为这个对象的属性,因此函数内部才可以访问这个函数,但是,这个值又是只读的,所以对他赋值并不生效

9,浅拷贝

如果给一个变量赋值一个对象,那么两者会是同一个引用,其中一方改变另一方也改变,有时候我们不希望出现这样的情况,就可以使用浅拷贝解决

两种方法:

  a1:通过Object.assign来解决

//借用其他来源的案例
let a= {
   name:'xiaodi'
}

let b = Object.assign({},a)

a.name = 'xiaoneng';

console.log(b.name); //xiaodi
console.log(a.name); //xiaoneng

a2:通过展开运算符(...)来解决

let a = {
    name:'xiaodi'
}
let b = {...a}

a.name = 'xiaoneng'

console.log(b.name); //xiaodi
console.log(a.name); //xiaoneng


10,深拷贝

可以通过JSON.parse(JSON.stringify(object))来解决

该方法的缺陷:

  • 会忽略undefined和symbol
  • 不能序列化函数
  • 不能解决循环引用的对象

11,防抖和节流

防抖和节流的作用都是方式函数多次调用

区别在于:假设一个用户一直触发这个函数,并且每次触发函数的间隔小于wait,防抖的情况下只会调用一次,而节流的情况是每隔一定时间(参数wait)调用一次函数

防抖动是将多次执行变为最后一次执行,节流是将多次执行变成每隔一段时间执行。

12,call,apply,bind的区别

call和apply可以改变this指向,作用相同,传参数的方式不同

除了第一个参数外,call可以接受一个参数列表,apply只能接受一个参数数组


bind返回的是一个新的函数,必须调用才可以执行

var name = '小张',sex='man'
var obj = {
    name:'小宋',
    objSex:this.sex,
    myFun:function(from,to) {
        console.log(this.name + '性别' + this.sex,'来自'+ from + '到'+ to)
}
}
var db = {
    name:'张力',
    sex:'女'
}

obj.myFun.call(db,'山东','江苏');  //张力女来自山东到江苏
obj.myFun.apply(db,['山东',‘江苏’]); //张力女来自山东到江苏
obj.myFun.bind(db,'山东','江苏')();  //张力女来自山东到江苏
obj.myFun.bind(db,['山东','江苏'])(); //张力女来自山东到undefined

call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数差别就来了:

call 的参数是直接放进去的,第二第三第 n 个参数全都用逗号分隔,直接放到后面 obj.myFun.call(db,'成都', ... ,'string' )。

apply 的所有参数都必须放在一个数组里面传进去 obj.myFun.apply(db,['成都', ..., 'string' ])。

bind 除了返回是函数以外,它 的参数和 call 一样。

当然,三者的参数不限定是 string 类型,允许是各种类型,包括函数 、 object 等等!


以上是个人梳理,如有不正确的地方,请指正