浏览器的功能:
1、向浏览器发起请求,如地址栏输入baidu.com
2、下载HTML、解析HTML、下载CSS、解析CSS
3、这个过程合起来,显示到屏幕上,称为渲染界面
4、下载JS、解析JS、执行JS
浏览器的页面模块有用户界面、渲染引擎、JS引擎、存储等,前端关注渲染引擎和JS引擎。
每个页面都会开启一个渲染线程和JS线程,JS是单线程的。如果JS需要去修改HTML或CSS,它不能直接修改,需要通过线程之间的通信来通知渲染引擎,这个过程叫做跨线程通信。
(DOM操作慢,因为是跨线程通信)
JS引擎的主要功能是编译代码、优化代码、执行代码、垃圾回收。
内存的数据区,分为stack栈区和heap堆区,它们只存数据,不存变量名。
- stack:每个数据顺序存放
- heap:每个数据随机存放
- 非对象数据(数字、字符串、布尔值)都存在stack
- 对象数据(数组、函数)都存在heap ∵随机存放,如果对象有新增属性,可以随机占内存添加,更高效。
“=”总是把右边东西复制到左边
var p2 = p
相当于把p的地址复制给p2
console.dir 可以查看结构
console.dir(window.Array)
console.dir(window.Object)
window变量 ≠ window对象
window变量是一个容器,存放window对象的地址,window对象是heap里的数据
同理,console属性 ≠ console对象,Object ≠ Object函数对象
前者是内存地址,后者是一坨数据
一层可以篡改,两层以上不能篡改
var a = {name:'jack'}
var b = a
b.name = 'frank'
console.log(a.name) //'frank'
obj = {name:'jack'}
obj2 = {name:'frank'}
obj.toString = 'xxx'
obj2.toString 不会改变
xxx.prototype存储了xxx对象的共有属性——原型
每个对象都有一个隐藏属性,指向原型(对象)
prototype和__proto__的区别:
都存着原型的地址
prototype挂在构造函数上
__proto__挂在每个新生成的对象上
如果尝试篡改共有属性,是改不到的,只能读到共有属性
var a = [1,2,3]
var b = a
b.push = 'xxx'
a.push(4) //报错
这里篡改不会改__proto__里的push,而是直接加对象上的属性