JS基础回顾

本篇来源:像天天骑共享单车同样,不知道本身为何可以掌握平衡,也不记得是如何学会的。曾经还有一些特殊技能(以下图),如今也不会了。只会慢悠悠的骑着。。。JS基础也有这种用进废退的感受,这种感受很是很差。碰巧翻出了一本老书《Javascript核心概念及实践》,因而便结合笔记以及一些曾经记录的碎片知识总结了这篇JS基础。html

Javascript简述

一丶语言特性

Javascript是一门动态的、弱类型、基于原型的脚本语言。

  • 动态性:对象在声明时不须要定义属性及类型。能够随时更改对象结构。
  • 弱类型:变量在声明时不须要指定数据类型。类型和值是关联的而不是和变量关联。
  • 基于原型:每一个对象都有prototype属性,即原型。

二丶基本概念

1.数据类型

  • Javascript中数据类型分为两种:
    • 基本数据类型(string,number,boolean,underfined,null)
    • 对象类型(object,array,function)
  • 数据类型间的转换:
    • 手动:Object.stringify(OBJ)、Object.parse(str)、valueOf()、toString()等方法
    • 自动:例如:if(判断条件)时,判断条件若是不是布尔值会自动转换为布尔值。
  • 检测数据类型:typeof、instanceof

2.变量

  • 变量的定义:变量是对值在存储空间的引用。
  • Javascript中数据类型分为两种:
    • 基本类型:变量直接访问数据值(栈)
    • 引用类型:变量是其引用地址,指向数据存储的位置(堆)

三丶对象和原型

1.JS中的对象

  • 定义:对象是属性的集合(以及一个原型对象)
  • 对象的属性:K-V对
    • K:属性的名字,是一个字符串
    • V:属性的值,任意JS对象
  • 全局对象
           JS引擎在初始化时,会构建一个全局对象。在浏览器环境中,这个全局对象就是window对象。全部在顶级做用于下生命的变量均可以看做window对象的属性。

2.原型

  • 原型对象和原型链
    • prototype: 每一个对象都有一个prototype属性,叫作原型对象.它是一个对象或null,
    • __ proto : 每一个实例函数都有一个 proto __属性,叫作原型.它其实就是构造函数的prototy.
    • constructor 每一个原型对象都有一个constructor属性,叫作构造函数.也就是咱们进行面向对象编程过程当中定义的构造函数.
  • 原型链:
            在 JavaScript 中,若是想访问某个属性,首先会在实例对象的内部寻找,若是没找到,就会在该对象的原型(__ proto __)上找,咱们知道,对象的原型也是对象,它也有原型,若是在对象的原型上也没有找到目标属性,则会在对象的原型的原型上寻找,以此内推,直到找到这个属性或者到达了最顶层null。在原型上一层一层寻找,这便就是原型链了。
  • 继承
            因为原型链查找是之下而上的,返回最早遇到的属性。经过这个机制能够完成继承和重载

3.面向对象:

       面向对象的思想是将待解问题抽象为程序中的对象。而后经过对象间的协同合做完成功能,经过功能的集合完成整个项目
编程

  • JS实现面向对象:
           JavaScript也是一门面向对象的语言,但在 ES6 以前,JavaScript 中没有 class 语法。 那么JavaScript是如何建立实例对象的呢?这就须要引入构造函数(constructor)了。经过使用 new 关键字来调用构造函数生成实例对象.
    数组

  • 实例化过程:浏览器

    • 引擎会建立一个空对象{}。
    • 这个空对象的原型的contructor上下文指向构造函数
      obj.__proto__.contructor= Class;
      等同于
      obj.__proto__ = Class.prototype;
      复制代码
    • 执行构造函数
    • 返回建立的这个对象

四丶函数

       在Javascript中函数自己也是对象,与其余任何内置的对象同样.

1.函数对象

  • 建立函数是什么?
           在全局做用域下,建立函数的过程其实就是对全局对象添加一个属性的过程,只不过属性的值是一个函数类型的对象.其余做用域也是如此.
  • 建立的方法
    • var fuc=new Function()
    • function fuc(){}
    • var fuc = function(){}

2.函数的参数

  • 函数对象在生成时,产生一个类数组对象--arguments.不管函数是否有形参,实参都会以数组的形式,保存在这里.

3.函数做用域

  • Javascript中的做用域为词法做用域,即在定义(预编译)阶段就肯定下来了,并不是在执行阶段肯定的.详情
  • Javascript的函数在局部做用域内运行,若内部对变量没有定义,能够访问外部变量.
  • 调用对象:在一个函数执行的时候,函数的参数和其局部变量最做为函数调用对象(this指向)的属性就行存储.能够理解为存储做用域信息的对象
  • 做用域链能够看作调用对象组成的链式结构.全局做用域下的函数做用域链上就会有两个对象--自身的调用对象+全局对象

JS执行过程

js中的函数做用域及预编译的理解 事件循环主要介绍JS解释执行过程当中同步,异步的执行过程
bash

JS预编译执行过程 做用域、做用域链闭包

1.语法分析

定义: 代码在执行前会被通篇扫描一遍,这个过程就作语法分析.app

2.预编译

  • 预编译阶段发生变量声明和函数声明,但没有初始化行为(赋值).匿名函数不参与预编译, 只有在解释执行阶段才会进行变量初始化异步

  • 全局在这个阶段:函数

    • 建立GO对象(global object),就是window对象
    • 查找函数声明,函数名做为全局对象的属性,值为函数引用
    • 查找全局变量声明(包括隐式全局变量声明,省略var声明),变量名做全局对象的属性,值为undefined
  • 函数在这个阶段oop

    • 建立AO(Activation object)对象,也就是做用域,也叫执行期上下文
    • 找形参和变量声明,将变量和形参做为AO对象的属性名,值为undefined
    • 将实参和形参进行对应赋值
    • 在函数体里面找函数声明,值赋予函数体

3.解释执行

  • 事件循环: 在JavaScript执行时,同步任务会被放入执行栈中依次执行.异步任务挂起,在返回结果时(一般是回调函数),放入任务队列.当执行栈的同步任务已经执行完成时,将最早进入任务队列的任务加入到执行栈中执行。去任务队列读取任务到执行栈中去执行,这个过程是循环往复的,这即是 Event Loop,事件循环。

  • 执行栈:浏览器执行队列

  • 任务队列:异步回调暂存

this相关

关于 this 的解释说明

定义:this关键字是一个对象.取决于当前调用该函数的对象,也就是执行时的对象。

  • 使用 call 和 apply 时,若是给 this 传的不是对象,JavaScript 会使用相关构造函数(例如:new String())将其转化为对象
  • bind 方法会建立一个新函数,新函数的 this 会永久的指向 bind 传入的第一个参数
  • 箭头函数会从做用域链的上一层继承 this。同 bind 同样,箭头函数也很“顽固”,咱们没法经过 call 和 apply 来改变 this 的指向

闭包

做用域和上下文环境
闭包

很是不巧端午期间生病了,6.8日吐了整整一天,脱水有些严重.6.9晚上好不少了.不少东西没来得及整理细化.又得烂尾了,难受!!!!

相关文章
相关标签/搜索