定义一个测试数组
// 自定义测试数组
const players=[
{name:'kobe',age:40},
{name:'james',age:30},
{name:'curry',age:28},
{name:'coder',age:20},
{name:'liu',age:21},
]
参数代表含义
// forEach方法是数组自带的方法,只有数组可以使用forEach遍历
// 参数:1.value 2.index 3.arr原数组本身
console.log(Array.prototype)
Array.prototype.LyForEach=function(callback){
for(let i=0;i<this.length;i++){
callback(this[i],i,this)
}
}
// 测试
players.LyForEach((value,index)=>{
console.log(value,index)
})
参数代表含义
// map这个方法并不会改变原数组,而是返回一个新的数组
// 参数:1.value 2.index 3.arr
Array.prototype.LyMap=function(callback){
const arr=[]
for(let i=0;i<this.length;i++){
arr.push(callback(this[i],i,this))
}
return arr
}
// 测试
console.log(players.map((item,index)=>{
return `${item.name}--${item.age}--${index}`
}))
参数代表含义
// filter这是个高阶函数,它也不会改变原数组。而是返回一个新的数组
// 参数:1.value 2.index 3.arr
// 这个方法的返回值必须是一个布尔值
Array.prototype.LyFilter=function(callback){
const arr=[]
for(let i=0;i<this.length;i++){
if(callback(this[i],i,this)){
arr.push(this[i])
}
}
return arr
}
// 测试
const newArr=players.LyFilter((item)=>{
return item.age>21
})
console.log(newArr)
参数代表含义
Array.prototype.LyEvery = function (callback) {
let flag = true
for (let i = 0; i < this.length; i++) {
flag = callback(this[i], i, this)
if (!flag) break
}
return flag
}
console.log(players.LyEevery(item => item.num >= 23)) // false
console.log(players.LyEevery(item => item.num >= 0)) // true
参数代表含义
// some这个方法主要用来判断数组中是否有某个值
// 如果数组中有一项符合条件就返回true
Array.prototype.LyEvery=function(callback){
for(let i=0;i<this.length;i++){
if(callback(this[i],i,this)){
return true
}
}
return false
}
// 测试
const flag=players.LyEvery((value)=>{
return value.age>21
})
const flag2=players.LyEvery((value)=>{
return value.age>50
})
console.log(flag)
console.log(flag2)
Array.prototype.sx_some = function (callback) {
let flag = false
for (let i = 0; i < this.length; i++) {
flag = callback(this[i], i, this)
if (flag) break
}
return flag
}
console.log(players.sx_some(item => item.num >= 23)) // true
console.log(players.sx_some(item => item.num >= 50)) // false
参数代表含义
// reduce这个方法是用来对数组中的内容进行和运算
// callback中的参数:pre前一项 currentValue:当前项 index:索引
Array.prototype.LyReduce=function(callback,...args){
let pre
let start=0
if(args.length){
pre=args[0]
}else{
pre=this[0]
start=1
}
for(let i=start;i<this.length;i++){
pre=callback(pre,this[i],i,this)
}
return pre
}
// 测试
console.log(players.LyReduce((pre,curValue)=>{
return pre+curValue.age
},0))
参数代表含义
// findIndex这个方法主要是用来返回查找到的索引值
// 找到返回索引值,找不到返回-1
Array.prototype.LyFindIndex=function(callback){
for(let i=0;i<this.length;i++){
if(callback(this[i],i,this)){
return i
}
}
return -1
}
// 测试
console.log(players.LyFindIndex((item,index)=>{
return item.age===21
}))
console.log(players.LyFindIndex((item)=>{
return item.age===10
}))
参数代表含义
Array.prototype.LyFind=function(callback){
for(let i=0;i<this.length;i++){
if(callback(this[i],i,this)){
return this[i]
}
}
return undefined
}
//测试
console.log(players.LyFind((item,index)=>{
return item.age===21
}))
用处:填充数组
参数代表含义
// fill这个方法主要是用来填充数组
console.log(Array.prototype)
Array.prototype.LyFill=function(value,start=0,end){
end=end||this.length
for(let i=start;i<end;i++){
this[i]=value
}
return this
}
// 测试
console.log(players.LyFill({name:'jwt',age:20},1,3))
用处:查找元素,查到返回true
,反之返回false
,可查找NaN
// includes这个方法主要是用来查找数组中的某一项
// 找到返回true,找不到返回false,可查找NaN
Array.prototype.LyIncludes=function(key,start=0){
if(start<0){
start=this.length+start
}
const isNaN=Number.isNaN(key)
if(isNaN){
return true
}
for(let i=start;i<this.length;i++){
if(this[i]===key){
return true
}
}
return false
}
// 测试
console.log([1,2,3].LyIncludes(2))//true
console.log([1,2,3,NaN].LyIncludes(NaN))//true
console.log([1,2,3,NaN].LyIncludes(1,1))//false
Array.prototype.includes()
用处:将数组用分隔符拼成字符串,分隔符默认为,
// join这个方法主要适用于将数组转为字符串
// 分隔符默认为,
Array.prototype.LyJoin=function(s=','){
let str=''
for(let i=0;i<this.length;i++){
str=i===0?`${str}${this[i]}`:`${str}${s}${this[i]}`
}
return str
}
// Array.prototype.LyJoin=function(s=','){
// return this.toString()
// }
// 测试
console.log(players.LyJoin(''))
console.log([1,2,3].LyJoin())g([1, 2, 3].sx_join('*')) // 1*2*3
// flat主要是用来对数组进行将维处理
// 也就是数组扁平化
Array.prototype.LyFlat=function(){
let newArr=this
while(newArr.some((item)=>{return Array.isArray(item)})){
newArr=[].concat(...newArr)
}
return newArr
}
// 测试
console.log([1,2,3,[1,2,3],[1,2,[1,2,3]]].LyFlat(2))
// console.log([1,2,3,[1,2,3],[1,2,[1,2,3]]].flat(2))
定义一个测试对象
// 测试对象
const obj={
name:'liu',
age:21,
gender:'男'
}
用处:将对象转成键值对数组
// entries这个方法用于将对象中的每个键值对转化为数组形式的键值对
Object.LyEntries=function(obj){
const res=[]
for(let key in obj){
res.push([key,obj[key]])
}
return res
}
console.log(Object.LyEntries(obj))
用处:跟entries
相反,将键值对数组转成对象
Object.LyFromEntries = function (arr) {
const obj = {}
for (let i = 0; i < arr.length; i++) {
const [key, value] = arr[i]
obj[key] = value
}
return obj
}
console.log(Object.LyFromEntries([['name', 'liu'], ['age', 21], ['gender', '男']]))
用处:将对象的key转成一个数组合集
// keys这个方法主要是用来返回一个新的数组
// 新的数组中包含的是对象中的所有key
// values这个方法是用来返回对象中的所有value
Object.LyKeys=function(obj){
const res=[]
for(let key in obj){
res.push(key)
}
return res
}
// 测试
console.log(Object.LyKeys(obj))
用处:将对象的所有值转成数组合集
Object.LyValues=function(obj){
const res=[]
for(let key in obj){
res.push(obj[key])
}
return res
}
console.log(Object.LyValues(obj))
用处:A instanceOf B,判断A是否经过B的原型链
function instanceOf(father,child){
const fp=father.prototype
let cp=child.__proto__
while(cp){
if(cp===fp){
return true
}
cp=cp.__proto__
}
return false
}
function Person(name){
this.name=name
}
const p=new Person('liu')
console.log(instanceOf(Person,p))//true
用处:Object.is(a, b),判断a是否等于b
// Object.is()方法是新增的方法
// 主要是弥补了NaN===NaN和=0===-0的缺陷
Object.LyIs=function(x,y){
if(x===y){
return x!==0||1/x===1/y
}
return x!==x&&y!==y
}
// 测试
console.log(Object.LyIs(NaN,NaN))//true
console.log(Object.LyIs(+0,-0))//false
console.log(Object.LyIs('1',1))//false
Function.prototype.LyCall = function (obj, ...args) {
obj = obj || window
// Symbol是唯一的,防止重名key
const fn = Symbol()
obj[fn] = this
// 执行,返回执行值
return obj[fn](...args)
}
const testobj = {
name: 'liu',
testFn(age) {
console.log(`${this.name}${age}岁了`)
}
}
const testobj2 = {
name: 'liucoder'
}
testobj.testFn.LyCall(testobj2, 22)
Function.prototype.LyApply = function (obj, args) {
obj = obj || window
// Symbol是唯一的,防止重名key
const fn = Symbol()
obj[fn] = this
// 执行,返回执行值
return obj[fn](...args)
}
const testobj = {
name: 'liu',
testFn(age) {
console.log(`${this.name}${age}岁了`)
}
}
const testobj2 = {
name: 'liucoder'
}
testobj.testFn.LyApply(testobj2, [21])