您必须了解这14个JavaScript函数
在进行任何JavaScript研究之前,您应该应该能够手动理解和编写这些功能。
1、确定任何对象的特定类型
众所周知,JavaScript中有六种原始数据类型(布尔,数字,字符串,空值,未定义,符号)和对象数据类型。但是您知道对象数据类型可以细分为许多种子类型吗?对象可以是数组,函数,映射等。如果要获取对象的特定类型,该怎么办?
ECMAScript 规定了以下的规则:
对于不同的对象,调用Object.prototype.toString()时将返回不同的结果。
例:
Object.prototype.toString.call('Hello World');
Object.prototype.toString.call(1);
Object.prototype.toString.call(function(){})
Object.prototype.toString.call({})
Object.prototype.toString.call(Object.create(null))
Object.prototype.toString.call(Symbol())
Object.prototype.toString.call(/aa/)
Object.prototype.toString.call(+(new Date()))
Object.prototype.toString.call((new Date()))
Object.prototype.toString.call(null)
Object.prototype.toString.call()
Object.prototype.toString.call(void(0))
依次输出
"[object String]"
"[object Number]"
"[object Function]"
"[object Object]"
"[object Object]"
"[object Symbol]"
"[object RegExp]"
"[object Number]"
"[object Date]"
"[object Null]"
"[object Undefined]"
"[object Undefined]"
此外,Object.prototype.toString()的返回值始终为’ [object ’ +’ tag ’ +’ ] ’ 的格式。如果只需要中间标记,则可以通过正则表达式或String.prototype.slice()删除两侧的字符。
"[object Undefined]".slice(8,"[object Undefined]".length-1)
输出
"Undefined"
2.缓存功能计算结果
如果有这样的功能:
函数compute(str){
//假设函数中的计算非常耗时
console.log('2000过去了')
返回“结果”
}
我们要缓存函数操作的结果。以后调用时,如果参数相同,则将不再执行该函数,但是将直接返回缓存中的结果。我们能做什么?
例:
3.实现Array.prototype.map
这是JavaScript中有用的内置方法,但是您应该可以自己实现此功能。
function selfMap(fn,context) {
let arr =Array.prototype.slice.call(this);
let mappedArr = new Array();
for(let i =0; i<arr.length; i++){
if(!arr.hasOwnProperty(i)) continue;
mappedArr[i] = fn.call(context,arr[i],i,this)
}
return mappedArr;
};
Array.prototype.selfMap = selfMap;
console.log([1,2,3].selfMap(val=>val*2))
输出
[2, 4, 6]
4.实现Array.prototype.filter
这是JavaScript中有用的内置方法,但是您应该可以自己实现此功能。
function selfFilter(fn,context) {
let arr =Array.prototype.slice.call(this);
let filterArr = new Array();
for(let i =0; i<arr.length; i++){
if(!arr.hasOwnProperty(i)) continue;
fn.call(context,arr[i],i,this) && filterArr.push(arr[i])
}
return filterArr;
}
Array.prototype.selfFilter = selfFilter;
console.log([1,2,3,4,5,6].selfFilter(val=>val>2))
输出
[3, 4, 5, 6]
5.实现Array.prototype.some
这是JavaScript中有用的内置方法,但是您应该可以自己实现此功能。
function selfSomer(fn,context) {
let arr =Array.prototype.slice.call(this);
if(!arr.length) return false;
for(let i =0; i<arr.length; i++){
if(!arr.hasOwnProperty(i)) continue;
let result = fn.call(context,arr[i],i,this)
if(result) return true;
}
return false;
}
Array.prototype.selfSome = selfSomer
console.log([1,2,3,4,5,6].selfSome(val=>val%2==0))
输出
true
6.实现Array.prototype.reduce
这是JavaScript中有用的内置方法,但是您应该可以自己实现此功能。
原理同 some;这里不做具体编码
7.实现Array.prototype.flat
这是JavaScript中有用的内置方法,但是您应该可以自己实现此功能。
const selfFlat3 = (depth = 1)=>{
let arr =Array.prototype.slice.call(this);
if(depth === 0) return arr;
return arr.reduce((pre,cur)=>{
if(Array.isArray(cur)){
return [...pre,...selfFlat3.call(cur,depth-1)]
}else{
return [...pre,cur]
}
},[])
}
Array.prototype.selfFlat = selfFlat3
[1,[2,3],[4,5],[6],[7,8]].selfFlat();
输出
[1, 2, 3, 4, 5, 6, 7, 8]