25

把以下代码使用两种方法,来依次输出0到9?

 var funcs = []
 for (var i = 0; i < 10; i++) {
    funcs.push(function() { console.log(i) })
 }
 funcs.forEach(function(func) {
    func()
 });
 
  • 利用ES5 闭包解决这个问题
 var funcs = []
 for (var i = 0; i < 10; i++) {
    funcs.push((function(value) {
        return function() {
            console.log(value)
        }
    }(i)))
 }
  funcs.forEach(function(func) {
    func()
 });
  • ES6 let
 var funcs = []
  for (let i = 0; i < 10; i++) {
    funcs.push(function() {
        console.log(i)
    })
 }
  funcs.forEach(function(func) {
    func()
 });

ES6的模板字符串有哪些新特性?

  • 基本的字符串格式化。将表达式嵌入字符串中进行拼接。用${}来界定
  • 在ES5时我们通过反斜杠()来做多行字符串或者字符串一行行拼接。ES6反引号(``)直接搞定。

箭头有哪些新特点?

  • 不需要function关键字来创建函数
  • 省略return关键字
  • 继承当前上下文的 this 关键字

以下代码依次输出内容是?


 setTimeout(function() {
  console.log(1)
}, 0);
new Promise(function executor(resolve) {
  console.log(2);
  for( var i=0 ; i<10000 ; i++ ) {
    i == 9999 && resolve();
  }
  console.log(3);
}).then(function() {
  console.log(4);
});
console.log(5);

首先先碰到一个 setTimeout,于是会先设置一个定时,在定时结束后将传递这个函数放到任务队列里面,因此开始肯定不会输出 1 。 然后是一个 Promise,里面的函数是直接执行的,因此应该直接输出 2 3 。 然后,Promise 的 then 应当会放到当前 tick 的最后,但是还是在当前 tick 中。 因此,应当先输出 5,然后再输出 4 。 最后在到下一个 tick,就是 1 。 “2 3 5 4 1”

promise的原理?jquery的ajax返回的是promise对象吗?

promise 只有2个状态,成功和失败,怎么让一个函数无论成功和失败都能被调用? Promise.all() 是干什么用的,怎么用?

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返回实例的回调函数。

map 和 forEach 的区别/filter和some的区别??

map和forEach的区别:

  • map 的返回值为数组,forEach的返回为undefined
  • map 不会改变原数组,forEach 可以改变

filter和some的区别

  • filter 返回满足回掉函数返回true的元素数组
  • some 检查是否有满足回掉函数的数据,回掉函数返回true 则some返回true

生动形象解释forEach、filter、map、some、every、find、findIndex、reduce间的区别

promise 原理?

为什么会有promise:

  • 不能捕捉异常(错误处理困难)——回调函数的代码和开始任务代码不在同一事件循环中;
  • 回调地域问题(嵌套回调);
  • 处理并行任务棘手(请求之间互不依赖);

promise有三种状态:

  • Pending(进行中)
  • Fulfilled(已成功)
  • Rejected(已失败)

状态只能由Pending变为Fulfilled或由Pending变为Rejected,且状态改变之后不会在发生变化,会一直保持这个状态。

Promise的值是指状态改变时传递给回调函数的值

resolvereject两个参数,它们是两个函数,可以用于改变Promise的状态和传入Promise的值

resolvereject

  • resolve : 将Promise对象的状态从 Pending(进行中) 变为 Fulfilled(已成功)
  • reject : 将Promise对象的状态从 Pending(进行中) 变为 Rejected(已失败)
  • resolvereject 都可以传入任意类型的值作为实参,表示 Promise 对象成功(Fulfilled)和失败(Rejected)的值

Promise的then方法

Promise 对象的 then 方法接受两个参数:

promise.then(onFulfilled, onRejected)

参数可选

onFulfilledonRejected 都是可选参数。

  • 如果 onFulfilledonRejected 不是函数,其必须被忽略

onFulfilled 特性

    如果 onFulfilled 是函数:

  • promise 状态变为成功时必须被调用,其第一个参数为 promise 成功状态传入的值( resolve 执行时传入的值)
  • promise 状态改变前其不可被调用
  • 其调用次数不可超过一次

onRejected 特性

    如果 onRejected 是函数:

  • promise 状态变为失败时必须被调用,其第一个参数为 promise 失败状态传入的值( reject 执行时传入的值)
  • promise 状态改变前其不可被调用
  • 其调用次数不可超过一次

多次调用

    then 方法可以被同一个 promise 对象调用多次

  • promise 成功状态时,所有 onFulfilled 需按照其注册顺序依次回调
  • promise 失败状态时,所有 onRejected 需按照其注册顺序依次回调

返回

then方法必须返回一个新的promise对象

promise2 = promise1.then(onFulfilled, onRejected);

Promise实现原理
面试

promise 是异步还是同步?

Promise本身是同步的立即执行函数

箭头函数和普通函数的区别?

普通函数和箭头函数的区别:

  1. 箭头函数没有prototype(原型)
  2. 箭头函数的this在定义的时候继承自外层第一个普通函数的this。
  3. 如果箭头函数外层没有普通函数,严格模式和非严格模式下它的this都会指向window(全局对象)
  4. 箭头函数本身的this指向不能改变,但可以修改它要继承的对象的this。
  5. 箭头函数的this指向全局,使用arguments会报未声明的错误。
  6. 箭头函数的this指向普通函数时,它的argumens继承于该普通函数
  7. 使用new调用箭头函数会报错,因为箭头函数没有constructor
  8. 箭头函数不支持new.target
  9. 箭头函数不支持重命名函数参数,普通函数的函数参数支持重命名
  10. 箭头函数相对于普通函数语法更简洁优雅

主要分为这几个方面的区别: 1、this指向 2、arguments 3、箭头函数没有原型 4、箭头函数不能使用new来构造 5、不允许重命名参数 6、语法更优雅 7、 不支持new.target

箭头函数的注意事项

  1. 箭头函数一条语句返回对象字面量,需要加括号
  2. 箭头函数在参数和箭头之间不能换行
  3. 箭头函数的解析顺序相对||靠前
  4. 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。

不适用场景:箭头函数的this意外指向和代码的可读性。

普通函数和箭头函数的区别

获取箭头函数参数

/*---------获取func1中的所有参数-----------*/
const func1 = () => {
  // 获取func1中的所有参数。
  // your code here
   console.log(reset)
}

将箭头函数转换为普通函数

/*----------将下面的函数转化成为es5-----------*/
const func = (a, ...b) => ({a, b});

实现es6 类似模板变量替换

/*
* 实现template函数,用于对指定格式的字符串进行格式化。
* example:
* const str = "my name is {name} and I am {age} years old";
* const data = {name: 'peter', age: '20'}
* format(str, data);
* 输出 my name is peter and I am 20 years old
*/
function format(str, data) {
 // your code here
}

谈谈async/await 和 promise

谈谈ES6 Generator/await?


我们不动
794 声望44 粉丝

知耻而后勇


« 上一篇
JS 面试题总结
下一篇 »
CSS 布局方式