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

Javascript面试的完美指南(开发者视角)

发布时间:2019-02-22 02:08:20 所属栏目:建站 来源:前端小智
导读:为了说明 JS 面试的复杂性,首先,请尝试给出以下结果: onsole.log(2.0==2==newBoolean(true)==1) 十有八九的会给出false, 其实运行结果是true,原因请看 这里。 1) 理解 JS 函数 函数是 JavaScript 的精华,是 JS 一等公民。JS 函数不仅仅是一个普通的

在传统 JavaScript 中,有一种伪装的继承概念,它是通过使用原型技术来实现的。在ES5、ES6中看到使用 new 的语法只是底层原型OOP的语法糖。创建类是使用 JavaScript 中的函数完成的。

  1. var animalGroups = { 
  2.   MAMMAL: 1, 
  3.   REPTILE: 2, 
  4.   AMPHIBIAN: 3, 
  5.   INVERTEBRATE: 4 
  6. }; 
  7. function Animal(name, type) { 
  8.   this.name = name; 
  9.   this.type = type; 
  10. var dog = new Animal("dog", animalGroups.MAMMAL); 
  11. var crocodile = new Animal("crocodile", animalGroups.REPTILE);  

这里我们为类创建对象(使用 new 关键字),可以使用如下方式对类追加方法:

  1. Animal.prototype.shout = function() { 
  2.   console.log(this.name+'is'+this.sound+'ing...'); 
  3. }  

这里你可能会有疑问。类中并没 sound 属性。是的,它打算由继承了上述类的子类传递。

JavaScript中, 如下实现继承:

  1. function Dog(name, type) { 
  2. Animal.call(this, name, type);  
  3. this.sound = 'bow';  
  4. }  

我定义了一个更具体的函数,叫做 Dog。在这里,为了继承 Animal 类,我需要call传递this和其他参数。使用如下方式来实例化一只德国牧羊犬。

  1. var pet = Dog("德国牧羊犬", animalGroups.MAMMAL);  
  2. console.log(pet); // returns Dog {name: "德国牧羊犬", type: 1, sound: "bow"}  

我们没有在子函数中分配 name 和 type 属性,我们调用的是超级函数 Animal 并设置相应的属性。pet 具有父类的属性(name、type)。但是方法呢。他们也继承的吗? 来看看:

  1. pet.shout(); // Throws error 

为什么会这样? 之所以发生这种情况,是因为没有指定让 JavaScript来继承父类方法。 如何解决?

  1. // Link prototype chains 
  2. Dog.prototype = Object.create(Animal.prototype); 
  3. var pet = new Dog("germanShepard", animalGroups.MAMMAL); 
  4. // Now shout method is available 
  5. pet.shout(); // 德国牧羊犬 bowing...  

现在可以使用 shout 方法。 我们可以使用 object.constructor 函数检查 JavaScript 中给定对象的类 来看看 pet 是什么类:

  1. pet.constructor; // returns Animal 

这是模糊的,Animal 是一个父类。但是 pet 到底是什么类型的呢? pet 应该是 Dog 的类型。之所以是 Animal 类型,是因为 Dog 类的构造函数:

  1. Dog.prototype.constructor; // returns Animal 

它是 Animal 类型的。我们应该将它设置为 Dog 本身,这样类的所有实例(对象)才能给出正确的类名。

  1. Dog.prototype.constructor = Dog; 

关于原型继承, 我们应该记住以下几条:

  • 类属性使用 this 绑定
  • 类方法使用 prototype 对象来绑定
  • 为了继承属性, 使用 call 函数来传递 this
  • 为了继承方法, 使用 Object.create 连接父和子的原型
  • 始终将子类构造函数设置为自身,以获得其对象的正确类型

7)理解 callback 和 promise

回调是在 I/O 操作完成后执行的函数。一个耗时的I/O操作会阻塞代码, 因此在Python/Ruby不被允许。但是在 JavaScript中,由于允许异步执行,我们可以提供对异步函数的回调。这个例子是由浏览器到服务器的AJAX(XMLHettpRequest)调用,由鼠标、键盘事件生成。如下:

  1. function reqListener () { 
  2.   console.log(this.responseText); 
  3.  
  4. var req = new XMLHttpRequest(); 
  5. req.addEventListener("load", reqListener); 
  6. req.open("GET", "http://www.example.org/example.txt"); 
  7. req.send();  

这里的 reqListener 是一个回调函数,当成功响应 GET 请求时将执行该回调函数。

Promise 是回调函数的优雅的封装, 使得我们优雅的实现异步代码。在以下给出的这篇文章中讨论了很多 promise,这也是在 JS 中应该知道的重要部分。

8)理解正则表达

正则表达式有许多应用地方,处理文本、对用户输入执行规则等。JavaScript 开发人员应该知道如何执行基本正则表达式并解决问题。Regex 是一个通用概念,来看看如何从 JS 中做到这一点。

(编辑:核心网)

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

热点阅读