JavaScript题

一道关于 Promise 的面试题

要求: 使用以下代码实现:首先输出 1,等待 3 秒后才输出 3

console.log(1)
await delay(3000)
console.log(3)
async function fn() {
console.log(1)
await delay(3000)
console.log(3)
}


fn()

function delay(time) {
if (typeof time !== 'number') {
throw new Error('请输入数值类型')
}

return new Promise(resolve => {
setTimeout(resolve, time)
})
}

输出结果

var a = 0,
b = 0

function A(a) {
A = function (b) {
console.log(a + b++)
}
console.log(a++)
}

A(1)
A(2)

1

4

输出结果

let a = {},
b = '0',
c = 0

a[b] = '唐诗'

a[c] = '宋词'

console.log(a[b])

宋词

js对象中的key通常是字符串或Symbol类型。使用其他类型作为键,js会自动转换为字符串或Symbol。

输出结果

let a = {},
b = Symbol('1'),
c = Symbol('1')

a[b] = '唐诗'

a[c] = '宋词'

console.log(a[b])

唐诗

Symbol是唯一的。

输出结果

let a = {},
b = {
n: '1'
},
c = {
m: '2'
}

a[b] = '唐诗'

a[c] = '宋词'

console.log(a[b])

宋词

对象作为key时会调用toString()转换为字符串,最终为:[object Object]。

var test = (function (i) {
return function () {
alert((i *= 2))
}
})(2)

test(5)

弹出框中显示4,注意alert只会输出字符串类型,所以准确回答是:字符串4。

test函数是立即执行函数,返回一个函数,其中的内容为:alert(4)。

调用test(5),其实5没有用,立即函数中的i是后面调用的2,所以test(5)传递的参数无效。

输出结果

console.log(1)

const promise = new Promise((resolve, reject) => {
console.log(2)

setTimeout(() => {
resolve(3)
reject(4)
}, 0)
})

promise
.then(data => {
console.log(data)
})
.catch(error => {
console.log(error)
})

console.log(5)

1

2

5

3

  • console.log(1),输出 1。
  • const promise = new Promise((resolve, reject) => {...}), 创建一个 Promise。
  • console.log(2),输出 2。
  • setTimeout(() => {...}, 0),添加到宏任务队列中。
  • promise.then((data) => {...}).catch((error) => {...}),添加到微任务队列中。
  • console.log(5),输出 5。
  • setTimeout 内部的代码执行,输出 6。
  • resolve(3):Promise 被解决,传递了数据 3。
  • reject(4):这行代码不会被执行,因为 Promise 已经被解决了。

输出结果

for (i = 0; i < 3; i++) {
setTimeout(() => console.log(++i), 0)
}

4

5

6

输出结果

var fullname = 'a'

var obj = {
fullname: 'b',
prop: {
fullname: 'c',
getFullname: () => {
return this.fullname
}
}
}

console.log(obj.prop.getFullname())

var test = obj.prop.getFullname

console.log(test())

a

a

写一个函数根据参数输出对应的棱形

function createDiamondByParam(count) {
if (!(count - 1)) {
return console.log('*');
}
// 输出上面部分
const rows = 2 * count - 1
for (let i = 1; i < rows; i += 2) {
const num = (rows - i) / 2
console.log(' '.repeat(num) + '*'.repeat(i));
}
// 输出下面部分
for (let i = rows; i > 0; i -= 2) {
const num = (rows - i) / 2
console.log(' '.repeat(num) + '*'.repeat(i));
}
}
createDiamondByParam(3)