把以下代码使用两种方法,来依次输出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
的值是指状态改变时传递给回调函数的值
resolve
和reject
两个参数,它们是两个函数,可以用于改变Promise
的状态和传入Promise
的值
resolve
和 reject
-
resolve
: 将Promise对象的状态从Pending(进行中)
变为Fulfilled(已成功)
-
reject
: 将Promise对象的状态从Pending(进行中)
变为Rejected(已失败)
-
resolve
和reject
都可以传入任意类型的值作为实参,表示Promise
对象成功(Fulfilled)
和失败(Rejected)
的值
Promise的then方法
Promise
对象的 then
方法接受两个参数:
promise.then(onFulfilled, onRejected)
参数可选
onFulfilled
和 onRejected
都是可选参数。
- 如果
onFulfilled
或onRejected
不是函数,其必须被忽略
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本身是同步的立即执行函数,
箭头函数和普通函数的区别?
普通函数和箭头函数的区别:
- 箭头函数没有
prototype
(原型) - 箭头函数的this在定义的时候继承自外层第一个普通函数的this。
- 如果箭头函数外层没有普通函数,严格模式和非严格模式下它的this都会指向
window
(全局对象) - 箭头函数本身的this指向不能改变,但可以修改它要继承的对象的this。
- 箭头函数的this指向全局,使用arguments会报未声明的错误。
- 箭头函数的this指向普通函数时,它的
argumens
继承于该普通函数 - 使用
new
调用箭头函数会报错,因为箭头函数没有constructor
- 箭头函数不支持
new.target
- 箭头函数不支持重命名函数参数,普通函数的函数参数支持重命名
- 箭头函数相对于普通函数语法更简洁优雅
主要分为这几个方面的区别: 1、this指向 2、arguments 3、箭头函数没有原型 4、箭头函数不能使用new来构造 5、不允许重命名参数 6、语法更优雅 7、 不支持new.target
箭头函数的注意事项:
- 箭头函数一条语句返回对象字面量,需要加括号
- 箭头函数在参数和箭头之间不能换行
- 箭头函数的解析顺序相对
||
靠前 - 函数体内的
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
}