h246802 / 30-days-challenge Goto Github PK
View Code? Open in Web Editor NEW30天每日打卡
30天每日打卡
写出一个函数 fn
,使得 fn
满足以下条件:
fn() === fn
fn.fn === fn
写一个 throttle
函数,可以按照如下方式调用,实现的效果是:当连续滚动窗口的过程中,每100ms至多执行一次 print
function throttle(fn, time) {
// your code
}
function print() {
console.log('print')
}
window.addEventListener('scroll', throttle(print, 100))
以下代码中出现的所有的``this` 分别指代什么
<!DOCTYPE html>
<html>
<head>
<script src="//code.jquery.com/jquery-1.9.1.min.js"></script>
<meta charset="utf-8">
<title>This</title>
</head>
<body>
<div class="father">
<div class="child"></div>
</div>
<script>
$('.child').on('click', function(){
console.log(this)
})
$('.father').on('click', '.child' function(){
console.log(this)
})
$('.child')[0].onclick = function() {
console.log(this)
}
var app = {
init: function() {
this.$father = $('.father')
this.$child = $('.child')
this.bind()
},
bind: function() {
var _this = this
this.$father.on('click', this.sayHi)
this.$child.on('click', function() {
_this.sayHello()
})
this.$child.on('click', this.sayBye.bind(this))
},
sayHi: function() {
console.log(this)
},
sayHello: function() {
console.log(this)
},
sayBye: function() {
console.log(this)
}
}
app.init()
</script>
</body>
</html>
const obj = { a: 1, b: 2, c: 3 };
function select(obj, arr) {
// your code
}
select(obj, ["a", 'c'])
// 输出 { a: 1, c: 3 }
写一个 byField
函数,实现数组按姓名、年纪任意字段排序
var users = [
{ name: 'John', age: 20, company: 'Baidu' },
{ name: 'Pete', age: 18, company: 'Alibaba' },
{ name: 'Ann', age: 19, company: 'Tencent' }
];
users.sort(byField('company'))
// 输出
/*
[
{ name: 'Pete', age: 18, company: 'Alibaba' },
{ name: 'John', age: 20, company: 'Baidu' },
{ name: 'Ann', age: 19, company: 'Tencent' }
];
*/
users.sort(byField('name'))
// 输出
/*
[
{ name: 'Ann', age: 19, company: 'Tencent' },
{ name: 'John', age: 20, company: 'Baidu' },
{ name: 'Pete', age: 18, company: 'Alibaba' },
];
*/
写一个方法,给定一个排序数组,在原数组上删除重复出现的元素,使得每个元素只出现一次,返回删除重复元素后的数组的长度
要求:
O(1)
额外空间的条件下完成示例:
给定数组 nums = [1, 1, 2, 3, 2, 5]
,函数应该返回新的长度 4,并且原数组 nums
去除了重复出现的数字
var removeDuplicates = function(nums) {
// your code
}
写一个函数 execTimes
,用于测试一个函数执行一定次数的时长
如:execTimes(sort, 1000)('hello')
表示执行sort函数1000次,sort的参数是'hello'
function execTimes() {
// your code
}
function sort(str) {
return str.split('').sort().join('')
}
// 执行sort1000次,sort的参数是'hello'
execTimes(sort, 1000)('hello')
// 输出:‘执行1000次,耗时43ms’
封装一个 jsonp
方法,可以使用如下方式调用
jsonp(url[, data][, callbackName])
// ?jsoncallback=fn&page=1&cate=recommend
jsonp('http://photo.sina.cn/aj/index',
{
page: 1, cate: 'recommend'
}, 'jsoncallback')
.then(data => {
console.log(data)
})
写一个对象 Bus
,提供 on
、emit
方法,on
实现监听,emit
实现触发,使用方式如下:
Bus.on('event', function(data) {
console.log(data)
})
Bus.on('hi', function(data) {
console.log(data)
})
Bus.emit('event', {name: 'hello'})
Bus.emit('hi', {to: 'hunger'})
Bus.emit('hi', {to: 'valley'})
以下代码输出什么?为什么?
var app = {
fn1: function() {
console.log(this)
},
fn2: function(){
return function() {
console.log(this)
}
},
fn3: function() {
function fn() {
console.log(this)
}
fn()
},
fn4: function() {
return {
fn: function() {
console.log(this)
}
}
},
fn5() {
setTimeout(function() {
console.log(this)
}, 10)
},
fn6() {
setTimeout(()=> {
console.log(this)
}, 20)
},
fn7() {
setTimeout((function(){
console.log(this)
}).bind(this), 30)
},
fn8: () => {
setTimeout(() => {
console.log(this)
}, 40)
}
}
app.fn1()
app.fn2()()
app.fn3()
app.fn4().fn()
app.fn5()
app.fn6()
app.fn7()
app.fn8()
以下代码输出的结果是什么?
var a = 1
function fn1 () {
function fn3 () {
function fn2 () {
console.log(a)
}
var a
fn2()
a = 4
}
var a = 2
return fn3
}
var fn = fn1()
fn() // 输出什么
以下代码输出什么?为什么?
setTimeout(() => {
console.log(4)
}, 0)
new Promise(resolve => {
console.log(1)
for (var i = 0; i < 10000; i++) {
i == 9999 && resolve()
}
console.log(2)
}).then(() => {
console.log(5)
Promise.resolve(7)
.then(v => console.log(v))
}).then(() => {
console.log(6)
})
console.log(3)
给定整数 n
和 m
,写一个函数 dispatch(n, m)
,把 1~n 尽量平均地分成 m
个组
dispatch(6, 3)
// [[1, 2], [3, 4], [5, 6]]
dispatch(9, 2)
// [[1, 2, 3, 4, 5], [6, 7, 8, 9]]
请用 JavaScript
实现一个方法,该方法能够判断两个字符串是否 匹配,如:
function isMatch(str1, str2){
// your code
}
isMatch('something', 'gnihtemos') // true
isMatch('aaa', 'aa') // false
isMatch('abb', 'baa') // false
isMatch('hello', 'olelh') // true
使用上一章节的 execTimes
方法测试你的方案执行10000次的时长,该方案是否是最优方案?如果不是,请给出最优方法,并说明时间复杂度
写一个 debounce
函数,可以按照如下方式调用,实现的效果是:当连续滚动窗口时,滚动停下300ms后才执行 print
函数
function debounce(fn, time) {
// your code
}
function print() {
console.log('print')
}
window.addEventListener('scroll', debounce(print, 300))
创建一个对象 obj
,使得 obj.obj.obj.obj.obj === obj
,即,不管出现多少次 .obj
,都得到 obj
写一个 execTime
函数,要求
t
:时间毫秒数callback
:回调函数function execTime(t, callback) {
// some code
}
console.log(1)
execTime(3000, function(){
console.log(3)
})
console.log(2)
写出一个可以再页面上随意拖动的圆形div
效果预览
写一个排序函数 sort
,满足以下条件:
sort
接收一个数组(数组里面只会含有正整数,最大数字约为200)sort
将该数组安从小到大的顺序排列sort
返回排序后的数组要求:
思考
let arr = [1, 2, 3];
arr.push(arr)
let arr2 = deepCopyArray(arr)
写一个函数 fn
,使得 fn
满足以下条件
fn() == 'a'
fn()() == 'b'
fn()()() == 'c'
写一个 execTime
函数要求如下
参数:时间毫秒数
作用:什么都不做,但函数执行消耗的时间为参数传递的毫秒数
function execTime(t) {
// 补全代码
}
console.log(1) // print 1
execTime(3000) // execute cost 3s
console.log(2) // print 2
以下代码输出的顺序是什么?为什么
setTimeout(() => {
console.log(4)
Promise.resolve(8).then(v => {
console.log(v)
}).then(() => {
console.log(9)
})
}, 0)
setTimeout(() => {
console.log(10)
Promise.resolve(11).then(v => {
console.log(v)
}).then(() => {
console.log(12)
})
}, 0)
new Promise(resolve => {
console.log(1)
for (var i = 0; i < 10000; i++) {
i == 9999 && resolve()
}
console.log(2)
}).then(() => {
console.log(5)
Promise.resolve(7)
.then(v => console.log(v))
}).then(() => {
console.log(6)
})
console.log(3)
写一个函数 fn
,使得 fn
满足一下条件
fn()
打印出 'a'
fn()()
打印出 'b'
fn()()()
打印出'c'
简单模拟 Vue
的 computed
功能:
function Vue(options) {
// your code
}
let app = new Vue({
data: {
firstName: 'Frank',
lastName: 'Fang'
},
computed: {
name() {
return this.firstName + ' ' + this.lastName
}
}
})
console.log(app.name) // 'Frank Fang'
app.firstName = 'Jack'
console.log(app.name) // 'Jack Fang'
// 不要求实现 app.name 的赋值操作
写一个曝光组件 Expourse
,实现当 dom
元素出现在浏览器窗口视野中时,执行回调函数,只执行一次。其中回调函数中的 this
代表 dom
元素
var expourse = new Expourse(node)
expourse.once(function() {
console.log(this) // this 代表 node
console.log('world') // node 曝光时执行,且只执行一次
})
写出一个 once
函数,满足以下条件
once
函数只接受一个参数 fnParam
,这个参数必须是一个函数once
函数返回一个函数 fnResult
fnResult
,则执行一次 fnParam
fnResult
,也只会执行一次 fnParam
示例如下
function once(fnParam) {
// your code
}
let log = once(function() {
console.log(1)
})
log() // print 1
log() // nothing or undefined
log() // nothing or undefined
log() // nothing or undefined
小明成绩不好,每次考试都靠瞎。小明的老师对他说:“小明,如果考不到60分你继续考,直到考到60分,我实现你的愿望让你和凯丽坐到一起”
function exam() {
var score = Math.floor(Math.random() * 101)
if (score >= 60) {
console.log('及格,和凯丽坐到一起')
} else {
console.log('不及格,继续考试')
setTimeout(exam, 1000)
}
}
exam()
对上述代码使用 Promise
改写,能用以下方式调用
exam().then(score => {
console.log('及格,和凯丽坐到一起', score)
})
简单模拟 Vue
的数据代理功能
function Vue(options) {
// your code
}
let app = new Vue({
data: {
message: 'hi'
}
})
console.log(app.message) // 'hi'
某个应用模块由文本框input,以及按钮A,按钮B组成。点击按钮A,会向地址urlA发出一个ajax请求,并将返回的字符串填充到input中(覆盖掉input中原有的数据),点击按钮B,会向地址urlB发出一个ajax请求,并将返回的字符串填充到input中(覆盖input中原有数据)。
当用户依次点击按钮A、B时,预期的效果是input依次被urlA、urlB返回的数据填充,但是由于urlA的请求返回比较慢,导致urlB返回的数据被urlA的数据覆盖了,与用户预期的顺序不一致。
问:应该如何设计代码,解决这个问题
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.