JS:

1. 原始值和引用值类型及区别

 

  19. JS中的String、Array和Math方法 

   Set和Map数据结构,防抖和节流

 

   数组,3. 类数组与数组的区别与转换。4. 数组的常见API 。JS的map()和reduce()方法.16. Array.sort()方法与实现机制

   数组:- 数组的存储性能比普通对象要好,开发中经常使用,来存储一些数据。数组中元素可以是任意的数据类型!

      - 索引,从0开始的整数 ,就是索引!

 

      创建数组: var arr= new Array() 。arr = new Arrar(10)。10个数组,

          使用字面量来创建数组: 语法[]; var arr = [];  arr=[10];创建一个数组,里面有10.

         向数组添加元素: 数组[索引] = 值。arr[0] = 10;

         读取数组的元素:数组[索引] 。

 

         数组的属性:获取数组的长度length。constructor,length,prototype(原型)。

        连续的数组:arr.length。可以获取数组的长度,(就是元素的个数)

        非连续的数组,使用length。会是最大的索引+1。尽量不要创建非连续的数组!

        修改的length大于原来的长度,多的部分会空出来。arr.length=10。

        修改的length小于原来的长度,会删除多余的。修改length,修改数组。

         向数组的最后一个位置添加元素。 arr[arr.length] = 70。永远在数组的最后一位添加元素。语法 a[a.length ]=

      数组的方法:(方法都会有返回值。)

        push。向数组的末尾添加一个或者多个元素。返回新数组的长度。 arr.push("1").

        pop。删除数组的最后一个元素。 返回删除元素作为返回值返回!

        unshift()。数组的开头,添加一个或者多个数组。(""),返回新数组的长度。

        shift()。数组可以删除第一个元素。返回删除元素作为返回值返回。

        

        slice(),splice()。 可以从数组中提取数据,并且作为新数组返回!slice(start,end) 包括左边,不包括右边!第二个参数可以不写,截取后面的。 splice。表示删除选中的元素,会印象到原来的数组,并且返回。替换元素。添加元素。arr.splice(3,0,"").arr.splice(0,1,"apple","caomei”)。arr.splice(1,1"arrple","caomei")。

        concat: arr.concat(arr);该方法不会对原数组产生影响。不会对原来的数组产生影响。返回一个新数组。

        join: 数组转化为一个字符串!方法不会对原数组产生影响,转化为字符串作为结果返回,join()可以指定一个字符串为参数,这个字符串会成为数组中元素的连接符。如果不能指定连接符,则默认使用','作为连接符。

        reverse(): 会对原数组产生影响。

        sort():对数组的元素进行排序。arr.sort。 按照Unicode编码进行排序。所有可能会产生错误。

            我们可以指定排序的规则:元素不确定,但是在数组中a一定在b前面。!回调函数:需要两个参数。

        浏览器分别使用数组中的元素作为参数调用回。如果返回是》0,交换位置,如果小于等于0,不交换位置!

 

      读取数组,遍历数组:

        1.for(let i =0; i<arr.length; i++) {console.log(arr[i] )}

          function getAdult(arr) { var newArr= [];  return newArr;//新数组返回!}

        2.forEach()方法。

          arr.forEach(); forEach()需要一个函数作为参数!(function(){})。

          数组有几个元素,就会执行几次!由我们创建,但是不由我们调用,我们成为回调函数。

          回调函数传递3个参数。(value,index,obj)第三个参数就是对象。

      

      去除数组的重复数组。 var arr = [1,1,2,2] for(i ; i<len;i++) {  for(j ) { arr.splic(j,1)}} 

 

 

 

  基础数据类型都是单一的值,“hello”,123,true,值和值都是没有联系的。

  引用数据类型:复合的数据类型,在对象中可以 保存多个不同的数据类型的属性!

      对象的分类:

        1 内建对象: 在ES标准定义的对象,在任何的ES的实现都是可以使用。

            Math String Number Boolean Function Object。

        2 宿主对象: 

            JS运行环境提高的对象,目前主要是浏览器提供的对象。

            比如DOM,BOM。

        3 自定义对象:

            由开发人员自己创建的对象。

            创建对象:使用new关键字调用的函数,是构造函数constructor。  

                 1 构造函数式专门用来创建对象的函数。 new Object()。

                 2 使用字面量,创建对象时,可以直接指定对象的属性。 语法:{属性名:属性值,}、属性名可以加引号,也可以不加引号。如果使用特殊的名字,则必须要引号。名和值使用:连接,多个名值之间必须要+引号!

            对象中保存的值叫:属性。添加一个属性:对象.属性名 = 属性值。obj.name ="caomei"

                        读取对象中的属性。对象.属性名。 

                        修改对象的属性名: 对象.属性名 = 新值。

                         删除对象的属性名: delete 对象.属性值。

                      特殊的属性名,不能采用.的方式。 使用另一种方式:语法:对象["属性名"] = 属性值。读取时候也需要采取[""]。 使用【】方式更加的灵活,obj[n],根据不同的变量值,会读取那个属性。  

                     属性值,JS对象的属性值,可以是任意的数据类型,可以是基础数据类型,也可以是一个对象,也可是一个函数,如果是一个函数就称为方法。 

                     in运算符:运算符在一个对象中,是否含有指定的属性,如果有返回true,没有返回false。语法: “属性名” in 对象。

                     

 

                     for( var n in obj ) { } for in 语法,对象中有几个属性,循环会执行几次。for ( var n in obj) {console.log(n)} n就是属性的名。 属性值怎么办? for(var n in obj ) { obj[n] }  []传入一个变量n。枚举对象的属性。

        对象: 模板字符串 , 解构赋值, 深拷贝与浅拷贝

 

 

 

              函数: 函数也是一个对象。函数可以封装一些代码,不同的时候使用。

                创建函数:

                      1new Function()。new Function("")封装的代码可以字符串的形式存储在参数。

                      2 使用函数声明来创建对对象。命名函数。 function +函数名(){} 

                      3 所谓的函数表表达式就是一个:匿名函数赋值给一个变量。let fun3 =function(){};

                调用函数:函数中封装的代码,会按照顺序执行。

                函数的参数。function sum(a,b){}。如果实参少于形参的数量,那么没有实参的形参是undefined。实参可以是任意的类型。可以传入对象,也可以传入参数!!!o。o.name,o.age,o.address。mianji() :调用函数,使用的是函数的返回值。 mianji:函数对象!

                函数传入的隐藏的参数:this。隐含的参数就是this,this指向的是一个调用它对象。这个对象旧函数执行的上下文对象!

                  this的指向是调用它的对象,和声明this的地方没有关系!

                  1以函数的形式调用,this永远都是window。

                  2 以方法的形式调用,this就是调用方法的那个对象。

                  this可以根据调用者不同,调用不同调用者里面的值。更加的灵活。

                函数的参数:arguments

                函数的返回值。return。return可以结束整个函数。return返回的可以是任意的数据类型。可以是对象,可以是函数。里面定义一个函数,然后返回一个函数。那么就是闭包!

                函数的类型:

                  1立即执行函数! (function(){}) 函数对象()()。函数()立刻调用!

                  2 构造函数(专门构造对象的)  

                    new的原理。new 原理?如何实现一个new ? new 原理?如何实现一个new ?

                    new和Object.create的区别。

                   

                函数对象的方法: 

                    构造函数的原型对象:原型和原型链。
                    prototype与__proto__的关系与区别

                    如何理解js原型链?为什么这样设计?

 

                函数柯里化及其通用封装

 

1  let、const和var的概念与区别

   检查变量类型: 1 typeof运算符 缺点:object不能检查出来。

   变量提升与暂时性死区
   变量的结构赋值

1 作用域:全局作用域。函数作用域。

作用域链。作用域链是什么时候确定的?

执行期上下文。

  函数定义时会确定哪些东西?预编译阶段会发生了什么?描述一下AST?

  闭包及其作用?

  如何正确判断this?

  bind、call、apply的区别

 JS的垃圾回收机制: 1 标记清楚。2 引用计数。BOM(c++里面使用)

 

  作用域:变量的作用范围。

      JS中两种作用域: 1全局作用域: 直接写script的代码,都是全局作用域。页面打开时候创建,关闭页面销毁。 页面的任意部分都可以访问的到!

                      全局对象windows,代表的是浏览器的窗口。

                      创建的变量都是作为window对象的属性保存。

                      创建的函数都是作为window对象的方法保存。

              变量的声明提升: var关键字声明的变量,在代码执行之前被执行,但是不会被赋值!

                      但是如果声明变量不适用var关键字,则不会被提前。

              函数的声明提升:函数声明形式创建的函数 在所有代码之前就被声明,而且被创建!function fun(){}。 函数声明前会被调用。

                      但是函数表达式创建的则不行!

               2函数作用域:调用函数时候,创建函数作用域。函数执行完毕,函数的作用域被销毁!

                      函数作用域可以访问到全局作用域变量!在全局作用域,无法访问到局部作用域。

                      函数作用域寻找变量,会在当前作用域找,如果找不到,如果未定义,则会到上一级。全局作用域还没有就会报错!

               函数作用域,也会有变量的提前声明!    

                      不适用var声明的变量,都会成为全局变量。 d=100。windows.d。

                      函数的形参相当于,局部创建变量。

 

                c = 1 。 var  c = 1  。 let c = 1 。 const c =1。

 

 

1  变量:  

  • 字面量: 不可以改变的值!字面量都可以直接使用。但是不太会使用字面量。数据类型,就是字面量的类型!
  • 变量: 变量可以保存 字面量。 x=1234。1234是字面量。x是变量。方便使用! =就是运算符。> <。

 声明变量。变量赋值。声明变量和赋值同事进行:

  2 标识符: JS自主命名的都是标识符,变量名,函数名,属性名。1 不能以数字开头。2 可以有字母,数字,_,$。3 xxxYyyZzz

  3 数据类型:就是字面量的类型。JS就有6中数据类型。

    String,Number,Boolean,Nul(空值),undefined(未定义)。基本数据类型的数据存储在栈中,栈内存是自动分配内存的。

    object。引用数据类型的数据存储在堆中,堆内存是动态分配内存的。用完对象设为null,减少无用的内存消耗!    

    string:

      引号引起来 字符串里面\作为转义字符!\n换行,\\表示\。

      输出字面量:alert("str"),输出变量:alert(str)

    Number:

      所有的数值都是number。包括整数和小数。

      Number.MAX_VALUE 。Number.MIN_VALUE。无穷大:Infinity。负无穷:-Infinity。(typeof=Infinity返回number)

      NaN:特殊数字。表示特殊数字not a Number。 typeof NaN = number

      数字的运算:JS浮点数运算。 var c = 0.1+0.2。2 进制不能精确表示1/10。console.log二进制-》十进制-》字符串。取近似值。

    布尔值Boolean:

      逻辑判断!typeof true =="boolean"

    null:类型只有一个,就是null。

      null这个值专门表示一个空对象。 typeof null == ”object“

    undefined: 当声明一个变量,但是不给变量赋值的时候,它的值就是undefined。

Symbol概念及其作用 ES6

     JS中数据类型的存储。不同的对象都是使用二进制存储,null的二进制都是0,   

 

    a. 判断数据类型typeof、instanceof、Object.prototype.toString.call()、constructor!

    b.数据类型的转化。 

        1 number->string: 方式调用 被转化数据类型 的toString(方法。)xxx.toString()

          1 a.toString()。该方法不会影响到原变量,需要赋值。var b = a.toString()。a = a.toString();

            a=null; a.toString()。 a=undefined. a.toString()。这两个没有toString,调用会报错!

          2 String(a)函数; 调用string()函数,将a转化为字符串。

          3  a = 1  +""。+隐式转化! 

        2 数据类型转换为Number():没有toNumber!

          1 Number()函数: 空串转化为0。有字母转化为数字NaN。布尔转数字:true 1 false0 null0 undefien->NaN

          2 专门用来对应字符串:parseInt()函数。parse解析,:把一个函数转化为Number。

          parseFloat(a): 转化为浮点型。

          对于非String使用parseInt(),会转化为string,然后转化。

          3如果需要16进制的数字,需要0x开头!

             16进制,0X。 8进制:0。2进制,需要0b开头。     

            parseInt(a,10);表示的 进制。

        3 将其他的数据类型转化为Boolean。使用Boolean

          1 调用Boolean()函数:

              数字-》boolean。 0,NaN-》false。 

              字符串-》boolean。空串-》false。非空串都是1。

              null和undefined都是false。

  4 运算符:  

    typeof运算符,运算的值以字符串形式返回。

    算数运算符:加法:

            当非Number运算的时候,会转化为Number,然后进行计算!(除了+)

          若对两个值会加法运算。

          若对两个字符串相加,如果字符串相加会拼接。

          若任何值和字符串相加,任何值都会转化为字符串,然后拼串。c=1 + ""。隐式转化,浏览器自动完成,也是调用String()

          console.log("c = " +c)

         减法:

           b= 100-'1'。转化为Number,100-1=99。    b-0 转化为Number。隐式转化!

    一元运算符:

        对于非Number值,会转化为number,然后进行转化。属于隐式类型的转换。

        + - 会对其他的数据类型使用+,则会转化为number!1++“2”+3 。 1+ "2"+ 3。

    自增运算符:

        a++表达式的值等于,原变量的值。++a的表达式的值,则是新值。a则会立刻增加。  

        d= 0。d = d++。

    逻辑运算符:

      布尔值得逻辑运算符: ! ||  &&。 !取两次反。!!做两次非运算,就可以转化为布尔值。&&会返回boolean。

      非布尔值的逻辑运算符:非布尔值进行 与或与那算,会先转化为布尔值,然后运算。返回原值。

          && 5&&6:都是true,返回后面的! 都是false,返回前的false。如果第一个true,则返回第二个!若为false,则直接返回。

    

    赋值运算符: = 运算符!符号右侧的值 给符号左侧的变量。+=,-=,*=,\=

    关系运算符:大小关系!关系成立,则会返回true,关系不成立返回false。 > ,<, >=,<=。 非数值的比较 1>true。true就是1.

          如果两边都是字符串,二回比较字符串中的Unicode。“a”>"b" ,"1">"b" a:0061,b: 0062,nul:000

    相等运算符:==两个值是否相等,

            ==:类型不同,则会转化为相同的类型!string -> Number。Boolean ->Number。 Null ==Undeined。

              Object == String,Number,Symbol -> Object 转化为原始类型

              NaN不和任何值相等,包括它本身!isNaN()函数判断是否是NaN。

            !=:

          ===:全等。

            ===:类型不同,直接返回false。    

            !==:

    条件运算符:三元运算符: 条件表达式?语句1:语句2;

            先对条件表达式进行求值,如果值为true,则执行1,若为false,执行fasle。

            条件表达式为非布尔值,"" ,会进行类型转化。

          a >b  ? alert("") :alter("");

          获取a,b中的最大值。 var max = a >b ? a:b。var max = a> b? (a>c ?a:c) :(b>c? b:c)

            

    ()> 自增 -->单目运算符> +,-。

 

 

 

2 循环语句:

  Iterator和for...of(Iterator遍历器的实现),循环语法比较及使用场景(for、forEach(数组)、for...in (对象)、for...of)
  

代码块:{},一个{}成为一个代码块,只有分组的作用,代码块的内容在外面是完全可以见!

   条件判断语句,没有冒号,有()

        if(true) alert();

  while,for()

 

 

 

3  面向对象:

  - es5几种继承方式 优缺点?es6继承?

   继承的实现方式及比较

   class基本语法及继承

 

4 EventLoop事件循环
  宏任务与微任务

  setTimeout用作倒计时为何会产生误差?

 

5 异步

12. Generator及其异步方面的应用
13. async函数
14. 几种异步方式的比较(回调、setTimeout、Promise、Generator、async)

9. Promise(手撕Promise A+规范、Promise.all、Promise相关API和方法)

- 如果要实现一个请求5s内没正常返回就返回我想要的,比如'超时',怎么用Promise实现?

- 一个异步请求,如果5s内有返回就正常返回,如果5s内没返回就输出'超时',如何用promise实现?

- promise几种状态?怎么实现promise.finally?

 

DOM常见的操作方式
  addEventListener和onClick()的区别
   DOM的location对象

   currentTarget和target区别?

 

BOM属性对象方法

 

8. Proxy 创建代理。
  Reflect对象

 

模块化:

  模块加载方案比较(CommonJS和ES6的Module)
  ES6模块加载与CommonJS加载的原理

   JS模块包装格式有哪些?