零碎知识点
- 避免使用浮点数运算
- ===与 !==对等式两边的数据要求更严格,值与数据类型都要相等
- ==与 != 会对等式进行强制类型转换
- 一般把js链接放到html文本的后面,在加载完html文件后在调用js不会导致js堵塞html的加载
JS的运行过程
- 把代码下载到用户电脑(可能使用到压缩技术)
- 需要一些信息的时候,会从服务器下载,存储到服务器的一个内存空间中
- 存在交互的时候,交互代码会被存在另一个不可见的空间,当事件触发的时候,会从内存中调出代码运行
JavaScript的变量提升
console.log(web);
var web = "adsadf";
上面的代码是不会在浏览器中报错的,再代码执行之前js解释器把第二行的声明赋值中的声明提前到了第一行代码前面,因此结果是undefined,同样的,如果变量的声明赋值在if中并不执行,变量的声明一样会被提前。
let与const产生的临时性死区TDC
console.log(web);
let web = "adsadf";
- 会报错,let不会变量提前,const也是,推荐使用let以及const
- 同时,块作用域内部var声明的变量会污染到外部的变量,因此同样不推荐使用var
- const一般使用大写定义变量,在同一个作用域中不可更改,不可重复定义。同时const不可改变的意思是变量指向的内存地址不可改变
作用域与全局污染
- 函数内部定义的变量覆盖外部的同名变量,内部可以调用外部的变量,函数内部定义的变量外部不可见。
- 不用var、let、const也可以定义变量,但是容易造成全局污染,尽量使用上述定义方式,添加var、let、const,以及少定义全局变量
- "use strict"严格模式,表示开发人员一定要声明后使用变量
window对象的重复声明
window对象保存了一些我们使用var定义的变量以及参数,但是其中还包含一些与浏览器相关的属性,如果我们重复声明了同名变量,属性就会被覆盖导致我们无法获取
let不会把变量提升到window
变量冻结
- **Object.freeze()**函数会冻结变量,禁止一切改变,只读,严格模式下更改冻结变量会报错
传值与传址
let a = 1;
let b = a;
let a = {};
let b = a;
前面传值,后面传址,一般基本数据类型传值。
null与undefined
- null表示空的引用类型
- undefined表示空的基本类型