ES5中基本数据类型有五种:Undefined,Null,Boolean,Number和String,还有一种复杂数据类型Object。
ES6引入新的原始数据类型Symbol,表示独一无二的值。
有递增递减操作符、布尔操作符、乘性操作符、加性操作符、关系操作符和相等操作符等。
注意隐式转换。
delete 操作符,用来删除对象的属性(不能用来操作变量
if,while,do-while,for,for-in,label,with等
基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象。
可以为引用类型的值添加、改变、删除属性和方法,对基本类型这样不会出错,但是无效。
复制变量的方式:基本类型会建立一个完全独立的新变量,把值复制过去;而引用类型复制的是指向原对象的指针,结束后两个变量将引用同一个对象。
传递参数:按值传递,引用类型复制指向原对象的指针,当把参数名指向新的内存空间,则和原对象无关了。
执行环境(execution context,EC)定义变量或函数有权访问的其他数据,决定其各自行为。每个执行环境有个与之关联的变量对象(variable object,VO),环境中定义的所有变量和函数都保存在这个变量中。
全局执行环境:在Web 浏览器中,全局执行环境被认为是window 对象,因此所有全局变量和函数都是作为window 对象的属性和方法创建的。
全局执行环境中有变量、函数表达式,this,函数声明这样几种数据,函数执行环境中还包括arguments和自由变量(在该函数中使用却不是在该函数中声明的变量)的取值作用域。
函数作用域在定义时确定。函数的执行环境在执行时确定。
JS引擎在进入一段可执行代码时,需要完成三个初始化工作:
当执行函数A时,JS引擎需要完成:
参考 ECMA-262-3 in detail. Chapter 1. Execution Contexts. ECMA-262-3 in detail. Chapter 2. Variable object.
因为在函数执行时,刚进入函数就会初始化变量和函数声明,变量赋值为undefined,函数声明为它本身,所以,在函数中变量定义前就可以访问到变量了。
this是在函数执行时确认值的。全局范围的this指向window对象。
函数调用时确认this指向的方式是:
js引擎是单线程的,但是浏览器中还有别的web APIs(如DOM,ajax,setTimeout),当执行这些代码时,js引擎会把操作交给相应的web API,然后继续执行以后的代码,web API执行完相应操作后,将结果放入callback queue,当js引擎空闲时event loop会去callback queue查看是否有待执行的回调函数,如果有的话js引擎会去依次执行这些回调函数。