npm install http-server -g
http-server -p 8001
深拷贝:1.判断是不是引用类型和null(包括undefined) 2.判断是数组还是对象 3.遍历对象(for...in会遍历原型)判断是否是自身的属性,递归调用
typeof能判断哪些类型(区分所有值类型,识别函数,判断是否是引用类型)
返回 'string' 'undefined'
JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型,共有六种。(ES6 又新增了第七种 Symbol 类型的值,本教程不涉及。) symbol,bigInt+1 八种数据类型
const只声明不赋值/赋值undefined 会报错
**JS变量类型:值类型和引用类型的区别(场景题,会出什么样的题),怎么去做深拷贝,怎么判断是不是对象/数组**
**object** function(不用于存储数据) **null(引用类型)指向空内存地址**
基础类型:number,string,boolean,**undefined**
何时使用===,何时使用==
**强制类型转换:字符串拼接,if....else转换时**
值类型在栈(计算机内存结构)(key-value)中存储,栈从上往下排
在经典的操作系统中,栈总是向下增长的
引用类型在栈中的value是内存地址,实际放在堆中(堆的key也是内存地址),堆从下往上排
比较好的做法是程序向操作系统申请一块适当的堆空间,然后由程序的运行库根据算法管理堆空间的分配,当堆空间不够的时候再向操作系统申请堆空间(动态)。堆一般比栈大很多,可以有几十至数百兆字节的容量。
普通赋值操作只在栈中进行
为什么?性能、存储问题,值类型占用空间少,对象可能很大,直接复制可能很慢
堆比栈大,栈比堆的运算速度快,对象是一个复杂的结构,并且可以自由扩展,如:数组可以无限扩充,对象可以自由添加属性。将他们放在堆中是为了不影响栈的效率。而是通过引用的方式查找到堆中的实际对象再进行操作。
相对于简单数据类型而言,简单数据类型就比较稳定,并且它只占据很小的内存。
不将简单数据类型放在堆是因为通过引用到堆中查找实际对象是要花费时间的,而这个综合成本远大于直接从栈中取得实际值的成本。
所以简单数据类型的值直接存放在栈中。
我们是无法直接操纵堆中的数据的,也就是说我们无法直接操纵对象,我们只能通过栈中对对象的引用来操作对象
需要注意的是闭包中的基本数据类型变量不保存在栈内存中,而是保存在堆内存中。
变量计算-类型转换
**字符串拼接**
`100+parseInt('10') `
**==**
`100 == '100' //true`
原始类型的值会转换成数值再进行比较。
`0 == '' `
`0 == false`
`false == ''`
`null == undefined`
除了 `== null` 之外,其他一律用`===`,`if(obj.a == null)相当于if(obj.a === null || obj.a === undefined)`
undefined和null只有与自身比较,或者互相比较时,才会返回true;与其他类型的值比较时,结果都为false。
对象(这里指广义的对象,包括数组和函数)与原始类型的值比较时,对象转换成原始类型的值,再进行比较。
具体来说,先调用对象的valueOf()方法,如果得到原始类型的值,就按照上一小节的规则,互相比较;如果得到的还是对象,则再调用toString()方法,得到字符串形式,再进行比较。
**if语句和逻辑运算**(&&,||,!)
truly和falsely
`!!a === true`
0, null, undefined, NaN, "" false
对 undefined 进行数字型转换时,输出结果为 NaN,而非 0。
对 "0" 和只有空格的字符串(比如:" ")进行布尔型转换时,输出结果为 true。