• 纯js面试题


    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 对象。
                         
                         对象的比较,==,是比较对象的地址是否相同。obj2 =null ,会断开,obj1不受影响。基本数据类型和引用数据类型: 栈内存,堆内存。引用数据类型,栈内存中保存的是对象的地址,在堆内存中创建。
     
                         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:

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

          输出字面量: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模块包装格式有哪些?

  • 相关阅读:
    基于Text-CNN模型的中文文本分类实战 流川枫 发表于AI星球订阅
    SQL Server 定时执行SQL语句的方法
    linq 根据指定条件返回集合中不重复的元素
    asp.net mvc ChildActionOnly 和ActionName的用法
    C# 让枚举返回字符串
    EF中使用SQL语句或存储过程
    Sql Server系列:视图
    C# 获取web.config配置文件
    C# 在EF中直接运行SQL命令
    c# mvc 获取 HtmlHelper 表达式值和时间格式化 去边框
  • 原文地址:https://www.cnblogs.com/hacker-caomei/p/14465460.html
Copyright © 2020-2023  润新知