map函数的第一个参数callback,这个callback一共可以接收三个参数,其中第一个参数代表当前被处理的元素,而第二个参数代表该元素的索引。
parseInt则是用来解析字符串的,使字符串成为指定基数的整数。接收两个参数,第一个表示被处理的值(字符串),第二个表示为解析时的基数。
parseInt(string, radix)
const promise = new Promise((resolve, reject) => {
console.log(1)
resolve()
console.log(2)
})
promise.then(() => { console.log(3) })
console.log(4) //输入结果 1 2 4 3
promise构造函数是同步执行的,then方法是异步执行的;<br />Promise new的时候会立即执行里面的代码,then是微任务, 会在本次任务执行完的时候执行 ,setTimeout是宏任务, 会在下次任务执行的时候执行;
<a name="7wHMT"></a>
## 3.考察promise,async ,await
<a name="a2fBS"></a>
###### 示例1:
```javascript
async function async1() {
console.log("async1 start");
await async2();
console.log("async1 end");
}
async function async2() {
console.log("async2");
}
console.log("script start");
setTimeout(function() {
console.log("setTimeout");
}, 0);
async1();
new Promise(function(resolve) {
console.log("promise1");
resolve();
}).then(function() {
console.log("promise2");
});
console.log("script end");
输出结果:
script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout
示例二:
async function testFun(){
console.log("function start");
await Promise.resolve(()=>{
console.log("promise1");
})
console.log("function test");
return "function end"
}
console.log("test start");
testFun().then(res=>console.log(res));
console.log("test end");
输出结果:
//test start
//function start
//test end
//function test
//function end
const fn = () => new Promise((resolve, reject) => {
console.log(1)
const p = new Promise((resolve, reject) => {
console.log(2)
setTimeout(() => {
console.log(3)
resolve(4)
}, 0)
resolve(5)
})
p.then(m => console.log(m))
resolve(6)
})
fn().then(n => console.log(n))
console.log(7)
//打印顺序
1
2
7
5
6
3
var foo = { n: 1 };
var bar = foo;
foo.x = foo = { n: 2 };
console.log(foo.x); // undefined
关键点在于它的返回值,简单解释就是说:如果有表达式foo.x,则它的返回值是一个指向foo对象x属性的引用。根据这一点,开始分析:
首先是两个变量的声明和初始化,var foo = { n: 1 }; var bar = foo; ,这个很好理解,就是foo和bar同时指向了一个相同的对象 { n: 1 }。
接下来,对于表达式 foo.x = foo = { n: 2 }; ,实际上等于是 foo.x = (foo = { n: 2 }) 。虽然赋值运算符具有右结合性,然而它首先做的是得到表达式foo.x的值,它返回一个指向对象{ n: 1}的x成员的引用,需要注意的是,这个时候foo并没有改变引用的指向。
继续,开始计算右边的结果,就是让foo指向另外的一个对象{n: 2},返回值就是其右边运算式的结果,即对象{n: 2}。
那么现在应该清楚了,赋值语句中foo.x的结果是指向对象一成员x的引用,而下面的console.log(foo.x)中的foo指向的是对象二,所以这里foo.x返回undefined就理所当然了。
所以试着输出对象一,即bar(因为它从始至终指向的是对象一):{ n: 1, x: { n: 2 } }
//LazyPig("Peggy")输出: Hello,I’m Peggy!
//LazyPig("Peggy").sleep(10).eat("dinner")输出: Hello,I'm Peggy!
//等待10秒..
//Wake up after 10
//Eat dinner
//LazyPig("Peggy").eat("dinner").eat("supper")输出:
//Hello,I'm Peggy!
//Eat dinner
//Eat supper
function LazyPig(name){
return new Lazy(name)
}
function Lazy(name){
this.name = name;
this.task = [];
console.log('Hi, 我是' + name)
let _this = this;
let fn = (function(){
return function(){
_this.next()
}
})()
this.task.push(fn)
setTimeout(()=>{
_this.next()
},0)
}
Lazy.prototype = {
next: function(){
var fn = this.task.shift()
fn && fn()
},
sleep: function(time){
let _this = this;
let fn = (function(time){
return function(){
setTimeout(()=>{
console.log(_this.name + ' Wake up !')
_this.next()
}, time * 1000)
}
})(time)
this.task.push(fn)
return this;
},
eat: function(smt){
let _this = this;
let fn = (function(smt){
return function(){
console.log(_this.name + ' is eating ' + smt);
_this.next()
}
})(smt)
this.task.push(fn)
return this;
}
}
LazyPig('哼哼').sleep(5).eat('早饭')