js基础

71 阅读4分钟

一、5大浏览器及其内核

浏览器内核
IEtrident
chromewebkit blink
safariwebkit
firefoxgecko
operapresto

二、浏览器的历史

年份大佬干了啥事
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年还有人使用该款浏览器
1996Brendan eich(网景公司)微软收购spy glass,在MOSIAC内核的基础上开发出trident内核,开发出IE1.0浏览器。同年发布IE3,出现了Jscript脚本语言,网页有了动态交互。Brendan eich在Netscape navigator基础上开发出来livescript。JAVA火起来,网景公司和SUN合作将livescript改名为javascript
2001IE6 XP诞生,IE6内核将渲染引擎中的js部分剥离出来,单独形成JS引擎
2003Mozilla公司根据Netscape navigator开发了Firefox
2008Google公司基于webkit blink gears(离线浏览)开发出Chrome浏览器,V8引擎,可以直接翻译机器码,独立于浏览器运行(node是基于Chrome V8引擎的js运行环境)
2009Oracle(甲骨文)收购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循环执行的步骤:

  1. 声明变量i
  2. if(i < 5) { console.log(i) }
  3. i++
  4. if(i < 5) { console.log(i) } 不满足条件,停止循环
  5. 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 的数,条件:

  1. () 中只能有一句,不能写判断语句
  2. {} 中不能写 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是一门解释型语言,它的工作流程如下:

  1. 检查通篇的语法错误
  2. 预编译
  3. 解释一行,执行一行