JS基础知识(二)

== vs ===

== 会进行类型转换,假如我们需要判断x == y是否相同,就会进行如下判断:
1.首先会判断两张是否类型相同,相同的话就会比较大小了。
2.类型不相同的话就会进行类型转化
3.作类型转化时,会先判断是否在对比underfined和null,是的话就会返回true。
4.判断两者类型是否为string和number,是的话会将字符串转化为number。
5.判断其中一方是否为boolean,是的话就会把boolean转为number再判断。
对于===来说就很简单了,判断两者类型并比较值是否相同。

闭包

什么是闭包?
闭包的定义其实很简单:函数A内部有一个函数B,函数B可以访问到函数A内部的变量,那么函数B就是闭包。
闭包存在的意义就是可以让我妈间接访问函数内部的变量。
经典问题:循环中使用闭包解决'var'定义的函数的问题,解决方法有三种:
1.使用闭包的方式
2.setTimeout传入第三个参数
3.使用let替代var声明的方式,为什么let可以解决问题?——函数内部访问与函数同级的变量,那么该变量是常驻内存的。

深浅拷贝

什么是浅拷贝?如何实现浅拷贝?
什么是深拷贝?如何实现深拷贝?
在JS基础知识(一),我们了解了对象类型在赋值的过程中其实是复制了地址,从而会导致改变了一方其他也都会被改变的情况,这通常在开发中是要避免的。可以使用浅拷贝。

  • 浅拷贝
    1.使用Object.assign来解决这个问题,Object.assign只会拷贝所有的属性值到新的对象中,如果属性值是对象的话,拷贝的是地址,所有它并不是深拷贝。
    2.通过展开运算符...实现浅拷贝
    通过浅拷贝就能解决大部分问题了,但有时也需要使用深拷贝

  • 深拷贝
    浅拷贝只能解决第一层的问题,如果对象接下去的属性值还有对象的话,就又回到开始的话题了,两者享有相同的地址,此时需要使用深拷贝
    1.使用JSON.parse(JSON.stringify(object))来解决。但该方法也是有局限的:

    • 会忽略underfined
    • 会忽略symbol
    • 不能序列化函数
    • 不能解决循环引用对象
      该方法会忽略掉underfined、symbol和函数

原型

如何理解原型?如何理解原型链

  • Object是所以对象的爸爸,所以对象都可以通过_proto_找到它
  • Function是所以函数的爸爸,所以函数都可以通过_proto_找到它
  • 函数的prototype是一个对象
  • 对象的_proto_属性指向构造函数的原型对象prototype,然后prototype也会存在一个_proto_指向它的上一级构造函数,如此层层递进就构成了原型链

你可能感兴趣的:(Javascript,javascript基础)