基本类型和引用类型
基本类型:存放在栈中。引用类型:同时保存在栈内存和堆内存中,在堆中存放了对象,在栈中存放了指针。
typeof可以区分几种
不能区分null和Object,typeof对于基本类型,除了null都可以区分,对于对象,除了函数都显示object1
2
3
4
5
6
7
8typeof Symbol(); // symbol 有效
typeof ''; // string 有效
typeof 1; // number 有效
typeof true; //boolean 有效
typeof undefined; //undefined 有效
typeof new Function(); // function 有效
typeof null; //object 无效
typeof [] ; //object 无效
类型相互转换
1 | 1、toString() |
四则运算符
只有当加法运算时,其中一方是字符串类型,就会把另一个也转为字符串类型。其他运算只要其中一方是数字,那么另一方就转为数字。
1 | 1 + '1' // '11' |
作用域
作用域就是一个独立的地盘,让变量不会外泄、暴露出去,不同作用域下同名变量不会有冲突。ES6 之前 JavaScript只有全局作用域和函数作用域。ES6的到来,为我们提供了‘块级作用域’。
未定义直接赋值的变量会自动声明为拥有全局作用域
1 | function outFun2() { |
作用域链
1 | var a = 100 |
执行上下文
执行上下文就是当前 JavaScript 代码被解析和执行时所在环境的抽象概念, JavaScript 中运行任何的代码都是在执行上下文中运行
执行上下文的类型
1、全局执行上下文:1. 创建一个全局对象,在浏览器中这个全局对象就是 window 对象。2. 将 this 指针指向这个全局对象。一个程序中只能存在一个全局执行上下文。
2、函数执行上下文:每次调用函数时,都会为该函数创建一个新的执行上下文。
3、Eval 函数执行上下文: 运行在 eval 函数中的代码也获得了自己的执行上下文,一般不常用。
执行上下文的生命周期
1、创建阶段:当函数被调用,但未执行任何其内部代码之前,做以下3件事:
创建变量对象:首先初始化函数的参数arguments,提升函数声明和变量声明。
创建作用域链:作用域链用于解析变量。当被要求解析变量时,JavaScript 始终从代码嵌套的最内层开始,如果最内层没有找到变量,就会跳转到上一层父作用域中查找,直到找到该变量。
确定this指向。
2、执行阶段:执行变量赋值、代码执行。
3、回收阶段:执行上下文出栈等待虚拟机回收执行上下文。
变量提升
函数声明和变量声明都会提升。函数声明优先级比较高,因此变量声明会被函数声明所覆盖,但是可以重新赋值。
1 | function test(arg){ |
this指向
1 | // 情况1:对于直接调用 foo 来说,不管 foo 函数被放在了什么地方,this 一定是 window |
1 | alert(a);//function a(){ alert('我是函数') } |
执行上下文栈
1 | var color = 'blue'; |
如何区分数组、对象4种方法
1 | let arr = [1,2,3] |
深拷贝
1 | function deepClone (obj) { |