一、5大浏览器及其内核
浏览器 | 内核 |
---|---|
IE | trident |
chrome | webkit blink |
safari | webkit |
firefox | gecko |
opera | presto |
二、浏览器的历史
年份 | 大佬 | 干了啥事 |
---|---|---|
1990 | 蒂姆·博纳斯·李 | 使用超文本分享资讯。world wide web移植到C libwww/nexus。允许别人浏览他人编写的网站 |
1993 | 马克·安德森(美国伊利诺大学NCSA组织) | MOSIAC浏览器,可以显示图片。至此浏览器可以图形化 |
1994 | 马克·安德森和吉姆·克拉克(硅图公司,简写SGI,做数据的) | 成立MOSIAC(内核) communication corporation公司。MOSIAC的商标属于伊利诺大学,在马克·安德森离开时转让给spy class公司(做数据的)。后MOSIAC改名为Netscape communication corporation公司。网景公司开发Netscape navigator浏览器,直到2003年还有人使用该款浏览器 |
1996 | Brendan eich(网景公司) | 微软收购spy glass,在MOSIAC内核的基础上开发出trident内核,开发出IE1.0浏览器。同年发布IE3,出现了Jscript脚本语言,网页有了动态交互。Brendan eich在Netscape navigator基础上开发出来livescript。JAVA火起来,网景公司和SUN合作将livescript改名为javascript |
2001 | IE6 XP诞生,IE6内核将渲染引擎中的js部分剥离出来,单独形成JS引擎 | |
2003 | Mozilla公司根据Netscape navigator开发了Firefox | |
2008 | Google公司基于webkit blink gears(离线浏览)开发出Chrome浏览器,V8引擎,可以直接翻译机器码,独立于浏览器运行(node是基于Chrome V8引擎的js运行环境) | |
2009 | Oracle(甲骨文)收购SUN公司,js的所有权归甲骨文所有 |
三、ECMA-欧洲计算机制造联合会
ECMA-262脚本语言的规范,也就是ECMAScript。ES5、ES6是规范化脚本语言
编程语言:
语言类型 | 翻译过程 | 优点 | 缺点 |
---|---|---|---|
编译型 | 源码-编译器-机器语言-可执行的文件 | 运行速度更快,适用于大型程序 | 不同的系统下移植性不高 |
解释型 | 源码-解释器-解释一行执行一行 | 不需要根据不同的系统平台进行移植 | 对于大型的复杂的项目不适用 |
js:动态语言 - 脚本语言 - 解释型语言 - 弱类型语言
java:静态语言 - 编译型语言 - 强类型语言
四、JavaScript
核心模块 | 解释 |
---|---|
ECMAScript | 语法、变量、关键字、保留字、值、原始类型、引用类型、对象、继承、函数 |
DOM | 文档对象模型,w3c规范。针对html元素进行增删改查 |
BOM | 浏览器对象模型,没有规范。窗口大小、滚动条、事件(注册/移出事件、事件冒泡/事件捕获、键盘/鼠标事件) |
- js引擎是单线程的,但是可以通过
轮转时间片
模拟多线程 轮转时间片
:短时间内轮流执行多个任务的片段- 任务1 任务2
- 切分任务1 任务2
- 随机排列这些任务片段,组成队列
- 按照这个队列顺序将任务片段送进js进程
- js线程执行一个又一个的任务片段
五、原始值和引用值
- 原始值:Number、String、Boolean、undefined、null。存在栈内存中,当将a赋值给b时是在栈内存中将a的值拷贝一份赋值给b;如果给a重新赋值,是在栈内存中重新开辟一块空间命名为a,值为新赋值的值。
- 引用值:object、array、function、date、RegExp等。值存在堆内存中,变量名(地址)存在栈内存中,栈内存中的地址指向堆内存中的值,如果将arr1赋值给arr2,其实是在栈内存中开辟了一块空间命名为arr2,但是arr2的指针指向和arr1保持一致,所以arr1进行push的时候arr2的值会跟着改变,如果给arr1重新赋值,那么会在栈内存中销毁之前的arr1重新开辟一块空间命名为arr1,堆内存中重新开辟一块空间存储新的值,栈中的指针指向这个新值。
六、for循环和while循环
for循环
for (let i = 0; i < 5; i++) {
console.log(i)
}
for循环执行的步骤:
- 声明变量i
- if(i < 5) { console.log(i) }
- i++
- if(i < 5) { console.log(i) } 不满足条件,停止循环
- i++
由此,可以将上面的for循环改写成
let i = 0
for (; i < 5; ) {
console.log(i)
i++
}
那么,这种结构和while就很像了,只是while循环不需要多写那两个 ;
let j = 0
while (j < 3) {
console.log({ j })
j++
}
跳出for循环
let i = 1
for (; i; ) {
console.log(i)
i++
// 如果在for后面的括号中没有写判断语句,那么这个循环将会是一个死循环;可以在循环体中加上if判断,通过break或者重置i为0,都可以跳出循环
if (i > 10) {
// break
i = 0
}
}
测试题:打印 0-10 的数,条件:
- () 中只能有一句,不能写判断语句
- {} 中不能写 i++/i--
let i = 10
for (; i--; ) {
console.log(i) // 9 8 7 ... 0
}
let j = 0
for (; ++j; ) {
if (j > 10) break
console.log({ j }) // 1 2 3 ... 10
}
let i = 0
while (++i) {
console.log(i)
if (i === 10) i = -1
}
七、预编译
js是一门解释型语言,它的工作流程如下:
- 检查通篇的语法错误
- 预编译
- 解释一行,执行一行