这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战
一、值类型和引用类型
1.首先讲一下值类型是什么,即String、Number、Symbol、Boolean、Undefined、BigInt;而引用类型包括对象和数组、函数,其中由于函数是不储存数据的,我们在这里不讲函数。这是最简单的描述。
2.然后是两者的区别:
(1)值类型是存放在栈中,以键值对的形式即(值类型变量名:对应的值)不会涉及到堆。
(2)而引用类型是涉及到堆和栈,当我们声明了一个引用类型时,会在栈中准备一个空间储存我们引用类型的变量名,对应的值是一个内存地址,这个内存地址是指向堆中对应的地址,堆中对应的地址是真正的引用类型的值。
(3)其次,值类型的拷贝是直接复制,复制完成后的值类型变量们并没有什么交集,谁的改动都不会影响谁。
(4)而引用类型的拷贝分为浅拷贝和深拷贝,浅拷贝就是直接复制,也就仅仅是把地址复制一份给拷贝的引用类型,后果就是由于两者的地址是一样的,指向堆中同一个对象,如果这个对象修改的话,两者的值都会发生改变,这个很容易引起数据的混乱。所以我们提出了深拷贝,深拷贝的话是把被拷贝的引用类型上的内容完完全全的复制下来给另一个变量,好处就是复制之后两者就再也没有关联了,一个引用类型的改变不会引起另一个引用类型的改变。
二、逻辑运算
1.先讲== 和 ===的区别,前者是只需要值相等即可,会尽力帮我们把对比双方转化成相同类型,后者是需要值和类型都相等,这个一般情况下都是采用后者,除非是和null做判断。
2.然后是字符串拼接,这个遇上字符串的运算,基本上都是被转换成字符串类型再做运算,不管是boolean还是number类型。
3.关于truly和falsely变量,这个其实没有什么,就是在一般的变量前面加上!!只需要记住下面这些都是falsely变量,其余为truly变量即可:
!!0 == flase
!!NaN == false
!!'' == false
!! null == false
!! undefined == false
!! false == false
4.关于||和&&,||的话是要求返回true的值如果没有则返回最后一个,&&相反,是要求返回false的值,如果没有则返回最后一个。