加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营 > 正文

JavaScript面试题

发布时间:2021-07-12 11:35:58 所属栏目:运营 来源:网络整理
导读:h1 id="js相关问题"JS相关问题 h3 id="数组去重"数组去重 function uniq(array){ var temp = []; //一个新的临时数组 for(var i = 0; i var aa = [1,2,4,9,6,7,5,3,5]; console.log(aa) console.log(uniq(aa)) h3 id="谈一谈javascript作用域链"1、谈一谈Jav
副标题[/!--empirenews.page--]

<h1 id="js相关问题">JS相关问题
<h3 id="数组去重">数组去重

function uniq(array){
    var temp = []; //一个新的临时数组
    for(var i = 0; i < array.length; i++){
        if(temp.indexOf(array[i]) == -1){
            temp.push(array[i]);
        }
    }
    return temp;
}

var aa = [1,2,4,9,6,7,5,3,5];
console.log(aa)
console.log(uniq(aa))


<h3 id="谈一谈javascript作用域链">1、谈一谈JavaScript作用域链

  • 当执行一段JavaScript代码(全局代码或函数)时,JavaScript引擎会创建一个作用域又称为执行上下文(Execution Context),在页面加载后会首先创建一个全局的作用域,然后每执行一个函数,会建立一个对应的作用域,从而形成一条作用域链。每个作用域都有一条对应的作用域链,链头是全局作用域,链尾是当前函数作用域。
  • 作用域链的作用是用于解析标识符,当函数被创建时(不是执行),会将this,arguments,命名参数和该函数中所有局部变量添加到该当前作用域中,当JavaScript需要查找变量X的时候(这个过程称为变量解析),它首先会从作用域链中的链尾也就是当前作用域进行查找是否有X属性,如果没有找到就顺着作用域链继续查找,直到查找到链头,也就是全局作用域链,仍未找到该变量的话,就认为这段代码的作用域上不存在x变量,并抛出引用错误(ReferenceError)的异常。

  • JavaScript中每个对象都有一个prototype属性,我们称之为原型,而原型的值也是一个对象,因此它也有自己的原型,这样就串联起来了一条原型链,原型链的链头是object,它的prototype.__proto__,值为null。
  • 原型链的作用是用于对象继承,函数A的原型属性(prototype property)是一个对象,当这个函数被用作函数来创建实例时,该函数的原型属性被作为原型赋值给所有对象实例,比如我们新建一个数组,数组的方法便从数组的原型上继承而来。
  • 当访问对象的一个属性时,首先查找对象本身,找到则返回;未找到则继续查找原型对象的属性(如果还找不到实际上还会沿着原型链向上查找,直至到根)。只要没有被覆盖的话,对象原型的属性就能在所有的实例中找到,若整个原型链未找到则返回undefined。

  • 原型对象也是普通的对象,是对象一个自带隐式__proto__属性,原型也有可能有自己的原型,如果一个原型对象的原型为null的话,我们就称为原型链。
  • 原形链是由一些用来继承和共享属性的对象组成的(有限的)对象链。

  • 构造函数.prototype 查看构造函数的原型属性
  • 实例对象 .__proto__查看实例对象的构造函数的原型
  • 实例对象.__proto__.constructor查看实例对象的构造函数

  • 构造继承
  • 原型继承
  • 实例继承
  • 拷贝继承
  • 原型prototype机制或apply和call方法去实现较简单,建议使用构造函数与原型混合方式

      function Parent(){
          this.name = 'wang';
      }
    

    function Child(){
    this.age = 28;
    }
    Child.prototype = new Parent();//继承了Parent,通过原型
    var demo = new Child();
    alert(demo.age);
    alert(demo.name);//得到被继承的属性

  • 思路:在子类构造函数的内部调用超类型构造函数。可以通过使用apply()和call()方法在新创建的对象上执行构造函数。
  • 缺点:方法都在构造函数中定义,函数的复用就无从谈起。在超类型的原型中定义的方法,对子类而言也是不可见的,结果所有的类型都只能使用构造函数模式。

      function SuperType() {
      this.colors = ["red","blue","green"];
      }
      function SubType() {
      SuperType.call(this);//继承了SuperType
      }
      var instance1 = new SubType();
      instance1.colors.push("black");
      console.log(instance1.colors);//"red","green","black"
      var instance2 = new SubType();
      console.log(instance2.colors);//"red","green"

  • 思路:借助原型可以基于已有的对象创建对象,同时还不必因此创建自定义类型
  • 在object()函数内部,先创建一个临时的构造函数,然后将传入的对象作为这个构造函数的原型,最后返回了这个临时类型的一个新实例==原型链继承的思想可用以下函数来说明

      function object(o) {
          function F(){}
          F.prototype = o;
          return new F();
      }

    例子

      var person = {
          name:"EvanChen",friends:["Shelby","Court","Van"];
      };
      var anotherPerson = object(person);
      anotherPerson.name = "Greg";
      anotherPerson.friends.push("Rob");
      var yetAnotherPerson = object(person);
      yetAnotherPerson.name = "Linda";
      yetAnotherPerson.friends.push("Barbie");
      console.log(person.friends);//"Shelby","Van","Rob","Barbie"

  • 指的是将原型链和借用构造函数的技术组合在一起,从而发挥二者之长。
  • 思路:使用原型链实现对原型属性和方法的继承,通过借用构造函数来实现实例属性的继承
  • 优点:即通过在原型上定义发法实现了函数复用,又能保证每一个实例都有它自己的数组。
  • 组合继承避免了原型链和借用构造函数的缺陷。融合了他们的优点。成为JavaScript中常用的继承模式

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读