1.判断对象或数组类型。
let isArray = arrfn => Object.prototype.toString.call(arrfn)==='[object Array]'
console.log(isArray([]))
console.log(isArray({name:"hello"}))
// console.log(Object.prototype.toString.call({name:"hello"})==='[object Object]')
true
false
[Finished in 0.1s]
2.实现map方法
Array.prototype.selfMap = function(fn,context){
if(!(fn instanceof Function)){
throw new TypeError("第一个参数需为函数")
}
let arr = [].slice.call(this)//将this转化为数组
let mappedarr = []
for(let i = 0 ; i < arr.length; i++){
if(!arr.hasOwnProperty(i)) continue
mappedarr.push(fn.call(context,arr[i],i,arr))//context对象,调用context的fn方法,fn传入三个参数
}
return mappedarr
}
var arr = [1,2,3]
var newarr = arr.selfMap(function(item,index,arr){
return item**2;
})
console.log(newarr) //=>[1,4,9]
3.实现filter()
Array.prototype.selfFilter = function(fn,context){
let arr = [].slice.call(this)//this指代实例化的数组
let filterarr = []
for(let i = 0 ;i < arr.length;i++){
if(fn.call(context,arr[i],i,arr))
filterarr.push(arr[i])
}
return filterarr;
}
var arr = [1,5,4]
var newarr = arr.selfFilter(function(item,index,arr){
return item%2 == 1;//返回奇数
})
console.log(newarr) //=>[1,4,9]
4.函数柯里化
实质就是将一次传入多个参数的一个函数改写成每次传一个参数的多层函数
var add = function(x,y){
return x+y;
}
console.log(add(1,23))
var curringadd=function(x){
return function(y){
return x+y;
}
}
console.log(curringadd(1)(23))
function curry(fn){
if(fn.length<=1) return fn;
var generator = (...args)=>{
if(fn.length == args.length){
return fn(...args);
}else{
return (...args2)=>{
return generator(...args,...args2)
}
}
}
return generator;
}
let addr = (a,b,c,d)=>a+b+c+d
var curriedadd = curry(addr)
console.log(addr(1,2,4,5))
console.log(curriedadd(1)(2)(4)(5))
function add() {
// 第一次执行时,定义一个数组专门用来存储所有的参数
var _args = [].slice.call(arguments);
// 在内部声明一个函数,利用闭包的特性保存_args并收集所有的参数值
var adder = function () {
var _adder = function() {
[].push.apply(_args, [].slice.call(arguments));
return _adder;
};
// 利用隐式转换的特性,当最后执行时隐式转换,并计算最终的值返回
_adder.toString = function () {
return _args.reduce(function (a, b) {
return a + b;
});
}
return _adder;
}
return adder.apply(null, [].slice.call(arguments));
}
// 输出结果,可自由组合的参数
console.log(add(1, 2, 3, 4, 5).toString()); // 15
console.log(add(1, 2, 3, 4)(5).toString()); // 15
console.log(add(1)(2)(3)(4)(5).toString()); // 15
5.实现一个打点计时器,要求
1、从 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一个数字,每次数字增幅为 1
2、返回的对象中需要包含一个 cancel 方法,用于停止定时操作
3、第一个数需要立即输出
function count(start, end) {
console.log(start++);
var timer = setInterval(function(){
if(start<=end){
console.log(start++);
}else{
clearInterval(timer);//停止运行
}
},100);
return {
cancel: function(){
clearInterval(timer);
}
}
}
6.
已知函数 fn 执行需要 3 个参数。请实现函数 partial,调用之后满足如下条件:
1、返回一个函数 result,该函数接受一个参数
2、执行 result(str3) ,返回的结果与 fn(str1, str2, str3) 一致
fn(str1,str2,str3) = partial(fn,str1,str2)(str3)
function partial(fn, str1, str2) {
var result;
result=function(str3){
return fn(str1,str2,str3);
}
return result;
}
var sayIt = function(greeting, name, punctuation) {
return greeting + ', ' + name + (punctuation || '!');
};
var t = partial(sayIt, 'Hello', 'Ellie')('!!!');
console.log(t);
7.所有输入参数求和
apply;数组
call:类数组
function useArguments() {
var argarr = [].slice.call(arguments);
var sum = argarr.reduce(function(prev,cur,index,array){
return cur+prev;
});
return sum;
}
8.函数柯里化
9. 求 a 和 b 相乘的值,a 和 b 可能是小数,需要注意结果的精度问题
10.
题目描述
找出对象 obj 不在原型链上的属性(注意这题测试例子的冒号后面也有一个空格~)
1、返回数组,格式为 key: value
2、结果数组不要求顺序
示例1
输入
复制
var C = function() {this.foo = 'bar'; this.baz = 'bim';};
C.prototype.bop = 'bip';
iterate(new C());
输出
复制
["foo: bar", "baz: bim"]
function iterate(obj) {
var arr = [];
for (var key in obj){
if(obj.hasOwnProperty(key))//判断对象有没有属性
arr.push(key + ': ' + obj[key]);
}
return arr;
}
var C = function() {this.foo = 'bar'; this.baz = 'bim';};
C.prototype.bop = 'bip';
console.log(iterate(new C()));//[ 'foo: bar', 'baz: bim' ]
11.获取url中的参数值
function getUrlParam(sUrl, sKey) {
var arg = sUrl.split('?')[1];
arg = arg.split('#')[0];
var arr = arg.split('&');//数组
var retarr = [];
for(var i = 0 ;i < arr.length; i++){
if(arr[i].split('=')[0]==sKey){
retarr.push(arr[i].split('=')[1]);
}
}
return retarr.map(Number);
}
console.log(getUrlParam('http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe','key'));//[1,2,3]