IIFE

(function(){})()

Function.prototype.apply

apply() 方法调用一个具有给定this值的函数,以及作为一个数组(或类似数组对象)提供的参数。

Function.prototype.call

call() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。

call()方法的作用和 apply() 方法类似,区别就是call()方法接受的是参数列表,而apply()方法接受的是一个参数数组。

Function.prototype.bind

bind() 方法创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。

函数式编程

函数式编程(通常缩写为FP)是通过编写纯函数,避免共享状态、可变数据、副作用 来构建软件的过程。
函数式编程是一种编程范式。

JavaScript支持闭包和高阶函数是函数式编程语言的特点。

高阶函数只是将函数作为参数或返回值的函数。
function higherOrderFunction(param,callback){
return callback(param);
}

一等公民

在JS中,函数可以相简单值一样赋值、传参、返回,拥有一切传统函数的使用方法(声明和调用)。

手动实现Array.prototype.map

  1. function map(arr, mapCallback) {
  2. if(!Array.isArray(arr) || !arr.length || typeof mapCallback !== 'function') {
  3. return [];
  4. } else {
  5. let result = [];
  6. for (let i = 0, len = arr.length; i < len; i++) {
  7. result.push(mapCallback(arr[i], i, arr));
  8. }
  9. return result;
  10. }
  11. }

ES6或ECMAScript 2015有哪些新特性?

  • 箭头函数
  • 模板字符串
  • 加强的对象字面量
  • 对象解构
  • Promise
  • 生成器
  • 模块
  • Symbol
  • 代理
  • Set
  • 函数默认参数
  • rest 和展开运算符
  • 块作用域


var,let和const的区别

  • var声明的变量会挂载在window上,而let和const声明的变量不会
  • var声明变量存在变量提升,let和const不存在变量提升
  • let和const声明形成块作用域
  • 同一作用域下let和const不能声明同名变量,而var可以


箭头函数

箭头函数比一般的函数表达式更加简洁,没有自己的的this/super/arguments或者new.target。更适用于那些本来需要匿名函数的地方,并且它不能用作构造函数。
匿名函数可以实现闭包,模拟块级作用域,减少全局变量。

Class类

类class是在JS中编写构造函数的新方法。是语法糖,是原型和基于原型的继承。

模板字符串

``

对象解构

ES6 模块

模块使我们能够将代码基础分割成多个文件,以获得更高的可维护性,并且避免将所有代码放在一个大文件中。在 ES6 支持模块之前,有两个流行的模块。

  • CommonJS-Node.js
  • AMD(异步模块定义)-浏览器

基本上,使用模块的方式很简单,import用于从另一个文件中获取功能或几个功能或值,同时export用于从文件中公开功能或几个功能或值。

Set

Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。

回调函数

一段可执行的代码段,作为一个参数传递给其他的代码,
在需要的时候方便调用这段代码。

Promise

Promise 是异步编程的一种解决方案:
语法上讲,promise是一个对象,从它可以获取异步操作的消息;
从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。
promise有三种状态:pending(等待态),fulfilled(成功态),rejected(失败态);状态一旦改变,就不会再变。创造promise实例后,它会立即执行。

如果我们在回调内部有另一个异步操作,则此方法存在问题。我们将有一个混乱且不可读的代码。此代码称为“回调地狱”

pending 状态的 Promise 对象会触发 fulfilled/rejected 状态,在其状态处理方法中可以传入参数/失败信息。当操作成功完成时,Promise 对象的 then 方法就会被调用;否则就会触发 catch。

  1. const myFirstPromise = new Promise((resolve, reject) => {
  2. setTimeout(function(){
  3. resolve("成功!");
  4. }, 250);
  5. });
  6. myFirstPromise.then((data) => {
  7. console.log("Yay! " + data);
  8. }).catch((e) => {...});

Promsie的原型对象含有then,catch这两个方法

  • then这个方法可以接受两个参数,一个成功的回调,一个失败的回调。也就是onResolved和onRejected
  • catch这个方法只可以接受一个参数,失败的回调,也就是onRejected
  • 并且then这个方法,是返回一个新的promise对象,它里面的执行方法也是异步的
  • 触发then的时候,也会有三个可能,一个是状态为resolved时,一个是状态为rejected时,一个是状态为pending时
  • Promise的结果根据执行的结果返回


async/await

async/await是 JS 中编写异步非阻塞代码的新方法。它建立在Promise之上,相对于 Promise 和回调,它的可读性和简洁度都更高。

在async/await,我们使用 try/catch 语法来捕获。

隐式和显式转换有什么区别

隐式强制转换是一种将值转换为另一种类型的方法,这个过程是自动完成的,无需我们手动操作。

  1. console.log(1 + '6'); // 16
  2. console.log(false + true); // 1
  3. console.log(6 * '2'); // 12

显式强制是将值转换为另一种类型的方法,我们需要手动转换。

  1. console.log(1 + parseInt('6'));

如何判断值是否为数组

Array.isArray

  1. console.log(Array.isArray([])); // true

AJAX

异步的JS和XML,快速创建动态网页的技术,使用Ajax不需要重载整个网页,实现部分内容更新。

用到AJAX的技术:

  • HTML - 网页结构
  • CSS - 网页的样式
  • JavaScript - 操作网页的行为和更新DOM
  • XMLHttpRequest API - 用于从服务器发送和获取数据
  • PHP,Python,Nodejs - 某些服务器端语言

    有哪些方法可以处理 JS 中的异步代码?

  • 回调

  • Promise
  • async/await
  • 还有一些库:async.js, bluebird, q, co

new 关键字有什么作用

new关键字与构造函数一起使用以创建对象

  1. function Employee(name, position, yearHired) {
  2. this.name = name;
  3. this.position = position;
  4. this.yearHired = yearHired;
  5. };
  6. const emp = new Employee("Marko Polo", "Software Developer", 2017);

new关键字做了4件事:

  • 创建一个空对象:var obj = {}
  • 将空对象分配给 this 值:this = obj
  • 将空对象的proto指向构造函数的prototype:this.proto = Person().prototype
  • 返回this:return this

习惯用首字母命名、用来创建实例对象、普通函数直接调用,构造函数需要用new、内部用this构造属性和方法