ES6 让人惊喜的语法特性

314 阅读4分钟

ES6:

字符串的其他方法:

1.includes:判断字符串中是否包含某一个字符,如果有包含,则返回true,否则返回false;

 let str='hello';
 str.includes('h'); // true;

2.repeat(); 获取字符串重复n次;

let s='ha';
let newStr=s.repeat(3); // 'hahaha'

Set 数据结构:

在es6方法中,Set()本身是一个构造函数,用来生成set 数据结构,它类似于数组,但是成员是唯一的;

const set=new Set([1,2,3,4,4]);
console.log([...set]); // [1,2,3,4]

Set 数据结构可以接收一个数组[]作为参数,用来初始化; let items =new Set([2,3,3,4,5,6,6]); let arrItem=Array.from(items); console.log(arrItem); // [2,3,4,5] items.size // 5

现象级人物:“Promise”

Promise 是异步编程的解决方案,比传统的解决方案:回调函数和事件;更加合理,强大。
  • Promise 可以理解为一个容器,里面保存着未来才会结束的事件的结果。

  • 语法层面来讲,Promise对象是一个构造函数;通过 new Promise();创建一个实例对象,从它可以获取一个异步操作的消息;Promise 提供统一的API,各种异步操作都可以使用同样的方法进行处理;

  • Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。

  • Promise 新建后就会立即执行。

    let promise = new Promise(function(resolve, reject) { console.log('Promise'); resolve(); });

    promise.then(function() { console.log('resolved.'); });

    console.log('Hi!');

    // Promise // Hi! // resolved

上述代码中Promise 新建后,立即执行,所以首先输入Promise,then 方法指定的回调函数,将在当前脚本所有的同步任务执行完以后才会执行;所以resolved 最后输出;

Promise.all();

Promise.all方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。

const p = Promise.all([p1, p2, p3]);
上面代码中,Promise.all方法接受一个数组作为参数,p1、p2、p3都是 Promise 实例,如果不是,就会先调用下面讲到的Promise.resolve方法,将参数转为 Promise 实例,再进一步处理。(Promise.all方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例。)

p的状态由p1、p2、p3决定,分成两种情况。

(1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。

(2)只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
【面试套路1】

手写一个promise

    var promise=new Promise((resolve,reject)=>{
		if(err){
			reject();
			}
			resolve();

	});
	promise
		.then((val)=>{
	
	})
		.catch((err)=>{
	
	})

**Issue:**jQuery的 ajax 返回的是promise 对象吗?

答: ajax 返回的是deferred 对象,通过promise的resolve()方法,将其转换为promise 对象; var jsPromise=Promise.resolve($.ajax(''));

**Issue:**promise只有2个状态,成功和失败,怎么让一个函数无论成功还是失败都能被调用? 使用promise.all()

Promise.all方法用于将多个Promise实例,包装成一个新的Promise实例。

Promise.all方法接受一个数组作为参数,数组里的元素都是Promise对象的实例,如果不是,就会先调用下面讲到的Promise.resolve方法,将参数转为Promise实例,再进一步处理。(Promise.all方法的参数可以不是数组,但必须具有Iterator接口,且返回的每个成员都是Promise实例。)

示例:
var p =Promise.all([p1,p2,p3]);
p的状态由p1、p2、p3决定,分为两种情况。
当该数组里的所有Promise实例都进入Fulfilled状态:Promise.all**返回的实例才会变成Fulfilled状态。并将Promise实例数组的所有返回值组成一个数组,传递给Promise.all返回实例的回调函数**。

当该数组里的某个Promise实例都进入Rejected状态:Promise.all返回的实例会立即变成Rejected状态。并将第一个rejected的实例返回值传递给Promise.all返回实例的回调函数。

**Issue: **分析下列程序代码,得出运行结果,解释其原因

Promise.resolve(1)
  .then((res) => {
console.log(res)
return 2
  })
  .catch((err) => {
return 3
  })
  .then((res) => {
console.log(res)
  })

结果:
1,2;

分析:promise 可以使用链式调用,promise每次调用.then()/.catch() 都会返回一个新的promise,从而实现链式调用;

**Issue:**分析下列程序代码,得出运行结果,解释其原因

process.nextTick(() => {
  console.log('nextTick')
})
Promise.resolve()
  .then(() => {
console.log('then')
  })
setImmediate(() => {
  console.log('setImmediate')
})
console.log('end')



运行结果:
	end 
nextTick
	then
	setImmediate;

process.nexTick()
pormise.then() 都属于microtask;
setImmediate() 属于macrotask,在事件循环的check 阶段执行;
事件循环的每一个阶段macrosoft之间都会执行microsoft;事件循环的开始,先执行一次microtask;