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
function map(arr, mapCallback) {
if(!Array.isArray(arr) || !arr.length || typeof mapCallback !== 'function') {
return [];
} else {
let result = [];
for (let i = 0, len = arr.length; i < len; i++) {
result.push(mapCallback(arr[i], i, arr));
}
return result;
}
}
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。
const myFirstPromise = new Promise((resolve, reject) => {
setTimeout(function(){
resolve("成功!");
}, 250);
});
myFirstPromise.then((data) => {
console.log("Yay! " + data);
}).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 语法来捕获。
隐式和显式转换有什么区别
隐式强制转换是一种将值转换为另一种类型的方法,这个过程是自动完成的,无需我们手动操作。
console.log(1 + '6'); // 16
console.log(false + true); // 1
console.log(6 * '2'); // 12
显式强制是将值转换为另一种类型的方法,我们需要手动转换。
console.log(1 + parseInt('6'));
如何判断值是否为数组
Array.isArray
console.log(Array.isArray([])); // true
AJAX
异步的JS和XML,快速创建动态网页的技术,使用Ajax不需要重载整个网页,实现部分内容更新。
用到AJAX的技术:
- HTML - 网页结构
- CSS - 网页的样式
- JavaScript - 操作网页的行为和更新DOM
- XMLHttpRequest API - 用于从服务器发送和获取数据
-
有哪些方法可以处理 JS 中的异步代码?
回调
- Promise
- async/await
- 还有一些库:async.js, bluebird, q, co
new 关键字有什么作用
new关键字与构造函数一起使用以创建对象
function Employee(name, position, yearHired) {
this.name = name;
this.position = position;
this.yearHired = yearHired;
};
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构造属性和方法