浏览器的功能
-
渲染引擎是下载HTML、JS和解析HTML、JS
-
JS引擎是解析、执行JS
(进程假如是车间,那么线程就是车间里的流水线)
JS是单线程的,JS如果要渲染,要跨线程通信
JS引擎的主要功能
- 编译 : 把JS代码翻译为 机器能执行的 字节码 或 机器码(二进制)
- 优化 : 改写代码,使其更高效
- 执行 : 执行上面的字节码或者机器码
- 垃圾回收 : 把JS用完的内存挥手,方便之后再次使用
内存图
1. Stack和Heap举例
- 两者区别
- Stack必须顺序存储数据
- Heap随机存储数据
var a = 1
var b = a
var p = {name:'jk',child:{name:'jc'}}
var p2 = p
- 对象被篡改
var p = {name:'jk'}
var p2 = p
p2.name = 'hi'
console.log(p.name)
// 'hi'
p 和 p2 都保存了同一个对象的地址,所以修改 p2.name 会影响 p.name
左边是变量,右边是对象
1.1 规律
- 数据分两种:非对象(数字、字符串、bool)和对象(数组、函数)
- 非对象都存在Stack
- 对象都存在Heap
- = 号 总是会把右边的东西复制到左边(不存在什么传值和传地址)
JS一开始就有的属性window , 除此之外还有什么
还有:
1. console
2. document
3. 对象= Object = window.Object
var p = {} 等价于 var p = new Object()
4. 数组 = Array = window.Array
var a = [1,2,3] 等价于 var a = new Array(1,2,3)
5. 函数 = Function = window.Function
function f(){} 等价于 var f = new Function()
- 第一个字母大写,一般都有prototype属性
Object 和 object 的区别是什么?
- Object 是一个全局函数,可以用来生成对象,var obj = new Object() ,可以简写成 var obj = {};而 object 什么也不是,除非我声明一个 var object
JS原型链
- prototype 是干嘛的
- 假设我创建一个
var obj2 = obj, 然后篡改obj里面的tostring = f1,请问obj2里面的tostring会被篡改成f1吗,答案是不会,只能改一层,不能改两层
每个属性都有一个隐藏属性__proto__
- prototype挂载在大写的 Object 上
- __proto__挂载在小写的 obj 上
关于原型(共有属性)
- Object.prototype 保存了一个对象的地址,这个对象包含了所有普通对象的共有属性,叫做对象的原型
- Array.prototype 保存了一个对象的地址,这个对象包含了是所有数组的共有属性,叫做数组的原型
- Function.prototype 保存了一个对象的地址,这个对象包含了是所有函数的共有属性,叫做函数的原型
- 每个对象都有一个隐藏属性,用来保存其原型的地址,这个隐藏属性的名字叫做
__proto__