- 一般来说,要把程序加载到内存才能运行
- 线程不是进程,线程是一种比进程更轻量的概念
- JS 只能单线程执行
- 双击 Chrome 快捷方式,会启动一个 Chrome 进程,这个进程会启动其他子进程
JS引擎的功能
-
编译 JS 代码为字节码或者机器码
-
优化字节码或者机器码
-
执行字节码或者机器码
-
垃圾回收
内存中,Stack 和 Heap 的区别
- Stack 必须顺序存储数据,让数据一个接一个排列
- Heap 随机存储数据
浏览器为JavaScript代码的执行创造了『运行环境』,提供一系列的API。
所以window实际上是浏览器提供的,并不存在于JS世界,window上这个对象面挂载了console、document、setTimeout……还有Object、Array和Function函数
一般来说,我们创建数组、对象和函数会这么写,其实是简写形式
var array = [1,2,3]
function f(x,y){return x+y}
它们等价于:
var array = new Array(1,2,3)
var f = new Funtion('x','y','return x+y')
prototype和__proto__是什么
首先看下面这段代码
let obj = {}
obj.toString()
复制代码
obj这个对象没有toString属性,为什么不会报错?
obj对象有个隐藏属性,也就是上图的__proto__,这个隐藏属性存储了Object.prototype对象的地址
代码执行到obj.toString(),发现obj身上没有toString,就会去隐藏属性对应的对象里面找,于是就找到了Object.prototype.toString
如果再创建一个新对象obj2呢?
let obj2 = {}
obj2.toString()
复制代码
也是不会报错的,和obj一样,都可以调用.toString()
那么,我们可以得出一个结论
每个对象都有一个隐藏属性
__proto__, 存储着其共有属性组成的对象的地址, 这个共有属性组成的对象叫做原型
prototype和__proto__区别是什么
都存着原型的地址
只不过prototype挂在函数上
___proto__挂在每个新生成的对象上
最后:
对象.__proto__ === 其构造函数.prototype
Object.prototype是所有对象的(直接或间接)原型
函数.__proto__ === Function.prototype