最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 可以用它来面试潜在候选人的 5 个 JavaScript 面试题(一)|8月更文挑战

    正文概述 掘金(gyx_这个杀手不太冷静)   2021-08-05   388

    1. ES6 的类和 ES5 的构造函数有什么区别?

    让我们来看一个例子:

    // ES5 构造函数
    function Person(name) {
      this.name = name;
    }
    
    // ES6 类
    class Person {
      constructor(name) {
        this.name = name;
      }
    }
    

    对于简单的构造函数而言,他们看起来很相似。

    他们的主要区别体现在类继承上。如果我们想要创建一个继承于 Person 父类的 Student 子类,并且添加一个 studentId 字段,我们需要做的修改如下:

    // ES5 构造函数
    function Student(name, studentId) {
      // 调用父类的构造函数来初始化父类的成员变量
      Person.call(this, name);
    
      // 初始化子类自己的成员变量
      this.studentId = studentId;
    }
    
    Student.prototype = Object.create(Person.prototype);
    Student.prototype.constructor = Student;
    
    // ES6 类
    class Student extends Person {
      constructor(name, studentId) {
        super(name);
        this.studentId = studentId;
      }
    }
    

    从上面的例子我们可以看出来,使用 ES5 构造函数来实现继承特别麻烦,而使用 ES6 类的方式来实现就特别容易理解和记忆。

    2. 你能给出一个使用箭头函数的例子吗,箭头函数与其他函数有什么不同?

    一个很明显的优点就是箭头函数可以简化创建函数的语法,我们不需要在箭头函数前面加上 function 关键词。并且箭头函数的 this 会自动绑定到当前作用域的上下文中,这和普通的函数不一样。普通函数的 this 是在执行的时候才能确定的。箭头函数的这个特点对于回调函数来说特别有用,特别对于 React 组件而言。

    3. 在构造函数中使用箭头函数有什么好处?

    在构造函数里使用箭头函数的主要优点是它的 this 只与箭头函数创建时的 this 保持一致,并且不会修改。所以,当用构造函数去创建一个新的对象的时候,箭头函数的 this 总是指向新创建的对象。比如,假设我们有一个 Person 构造函数,它接受一个 firstName 参数,并且它有两个方法去调用 console.log 这个 firstName,一个是正常的函数,而另一个则是箭头函数:

    const Person = function (firstName) {
      this.firstName = firstName;
      this.sayName1 = function () {
        console.log(this.firstName);
      };
      this.sayName2 = () => {
        console.log(this.firstName);
      };
    };
    
    const john = new Person("John");
    const dave = new Person("Dave");
    
    john.sayName1(); // John
    john.sayName2(); // John
    
    // 普通函数的 this 可以被修改,而箭头函数则不会
    john.sayName1.call(dave); // Dave (因为 "this" 现在指向了 dave 对象)
    john.sayName2.call(dave); // John
    
    john.sayName1.apply(dave); // Dave (因为 "this" 现在指向了 dave 对象)
    john.sayName2.apply(dave); // John
    
    john.sayName1.bind(dave)(); // Dave (因为 "this" 现在指向了 dave 对象)
    john.sayName2.bind(dave)(); // John
    
    var sayNameFromWindow1 = john.sayName1;
    sayNameFromWindow1(); // undefined (因为 "this" 现在指向了 Window 对象)
    
    var sayNameFromWindow2 = john.sayName2;
    sayNameFromWindow2(); // John
    

    这里主要的区别是,正常函数的 this 是可以在执行过程中被改变的,而箭头函数的 this 则会一直保持一致。所以在使用箭头函数的时候,你就不需要担心它的上下文被改变了。

    这在 React 的类组件里非常有用。如果你使用普通的函数来定义一个类方法,比如一个点击处理函数,然后你将这个点击处理函数通过 prop 的形式传递给子节点,你将必须在父组件的 constroctor 里使用 fn.bind(this) 的形式来确保该函数能正常工作。但是如果你使用箭头函数的话,你就不需要手动去绑定 this 了,因为箭头函数会自动绑定创建时的 this

    4. 高阶函数(higher-order)的定义是什么?

    高阶函数是将一个或多个函数作为参数的函数,它用于数据处理,也可能将函数作为返回结果。高阶函数是为了抽象一些重复执行的操作。一个典型的例子是map,它将一个数组和一个函数作为参数。map使用这个函数来转换数组中的每个元素,并返回一个包含转换后元素的新数组。JavaScript 中的其他常见示例是forEachfilterreduce。高阶函数不仅需要操作数组的时候会用到,还有许多函数返回新函数的用例。Function.prototype.bind就是一个例子。

    Map 示例:

    假设我们有一个由名字组成的数组,我们需要将每个字符转换为大写字母。

    const names = ['irish', 'daisy', 'anna'];
    

    不使用高阶函数的方法是这样:

    const transformNamesToUppercase = function (names) {
      const results = [];
      for (let i = 0; i < names.length; i++) {
        results.push(names[i].toUpperCase());
      }
      return results;
    };
    transformNamesToUppercase(names); // ['IRISH', 'DAISY', 'ANNA']
    

    使用.map(transformerFn)使代码更简明

    const transformNamesToUppercase = function (names) {
      return names.map((name) => name.toUpperCase());
    };
    transformNamesToUppercase(names); // ['IRISH', 'DAISY', 'ANNA']
    

    5. 请给出一个解构(destructuring)对象或数组的例子。

    解构是 ES6 中新功能,它提供了一种简洁方便的方法来提取对象或数组的值,并将它们放入不同的变量中。

    5.1 数组解构

    // 变量赋值
    const foo = ['one', 'two', 'three'];
    
    const [one, two, three] = foo;
    console.log(one); // "one"
    console.log(two); // "two"
    console.log(three); // "three"
    
    // 变量交换
    let a = 1;
    let b = 3;
    
    [a, b] = [b, a];
    console.log(a); // 3
    console.log(b); // 1
    

    5.2 对象解构

    // 变量赋值
    const o = {p: 42, q: true};
    const {p, q} = o;
    
    console.log(p); // 42
    console.log(q); // true
    

    起源地下载网 » 可以用它来面试潜在候选人的 5 个 JavaScript 面试题(一)|8月更文挑战

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元