变量与作用域
基本类型的值不可以修改 引用类型可以
基本类型的值不可以设置属性与方法 引用类型可以
基本类型保存在栈内存中 引用类型在堆内存中 引用类型的地址保存在栈内存中
引用类型作比较时 只有他们的引用地址相同 他们才相等
基本类型的值 在复制的值被修改后 被复制的值不会改变
引用类型则会改变 因为指向同一地址
浅拷贝: 引用类型栈内存中使用同一地址
函数调用传参时 引用类型与基本类型都传的是值
js没有块级作用域
直接访问不存在的变量会报错 比如 console.log(person)
而如果 console.log(window.person) 则会返回 undefined
instanceof
查看前面是否是后面的实例
[ ] instanceof Array
基本类型不能使用
预解析
变量提升
预解析首先读取 var 与function定义的变量与函数
将var定义的变量置为 undefined
将函数整个解析
不通过var声明的变量为全局变量 不会被预解析
如果变量与函数同名则忽略变量
同名变量与同名函数则保留后面的
在不同的script标签中的 先预解析先写的script标签
console.log不存在的变量或函数会报错;不存在的属性或方法,返回undefined
不要在if 与for之中定义函数 (有些浏览器无法进行预解析)
部分例题
输出 [4] [4, 44]
第一个b被a赋值 a随后被改变指向 [4, 44] 但是b没有改变 只有a[0] = 1 a与b才会一起改变
2.
输出 xm
刚开始函数中obj引用与person一致 后来指向{} 所以再次修改与person无关
3.
输出 1 报错
x是局部变量 外部无法访问 y是全局变量
4.
输出 函数a2 1 报错
预解析后 a = 第二个函数
然后 所以第一个a 是第二个函数
然后运行 a被赋值为1
第二个a为1
此时a为一个变量
调用a函数后报错