欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ES5

程序员文章站 2022-04-05 11:35:06
一、数组API实际开发中forEach和map会多一些=>是es6语法中的arrow function举例:(x) => x + 6相当于function(x){return x + 6;}undefined转成数字是NaN判断:arr.every():判断arr中每个元素是否都符合要求只有每个元素 ......
一、数组api
实际开发中foreach和map会多一些
=>是es6语法中的arrow function
举例:
(x) => x + 6
相当于
function(x){
return x + 6;
}
undefined转成数字是nan

判断:
arr.every():判断arr中每个元素是否都符合要求
只有每个元素都符合条件时,才返回true
只要有一个元素不符合条件,就返回false
类似&&
arr.some():判断 arr中是否包含符合要求的元素
只要有一个元素符合条件,就返回true
除非所有元素都不符合条件,才返回false
类似||
如何:
var bool = arr.every(function(val,i,arr){
val //自动获得当前元素值
i //自动获得当前元素的位置
arr //自动获得当前数组
return 条件;
})
ps:参数用不到的可以不写,
every 会用function,去每个元素执行一次,收集返回的true和false。
----------------------------------------------
例:判断数组是否全部偶数,只用一个参数
<script type="text/javascript">
var arr1 = [1,2,3,4,5];
var arr2 = [10,6,4,8,2];
var arr3 = [1,2,3,2,1];
function alleven(arr){
return arr.every(function(val){
return val%2==0;
})
//简写成:
return arr.every(val=>val%2==0);

}
console.log(
alleven(arr1),//false
alleven(arr2),//true
alleven(arr3) //false
)
</script>

上述例子改成arr.some()结果为:true true true
----------------------------------------
例:判断是不是升序排序:三个参数都用到
var arr1 = [1,2,3,4,5];
var arr2 = [10,6,4,8,2];
var arr3 = [7,6,3,2,1];
function isasc(arr) {
return arr.every(function(val,i,arr){
//最后一个值和自己比较永远为true,4<4时就是最后一个值了,设true
return i<arr.length-1 ? val<=arr[i+1]:true;
})
//简写成:
return arr.every(
(val,i,arr) => i<arr.length-1?val<=arr[i+1]:true
);

}
console.log(
isasc(arr1),//true
isasc(arr2),//false
isasc(arr3) //false
)
----------------------------------------------------------------------------------------------------------------

二、遍历
arr.foreach():对原数组中每个元素执行相同的操作,不能新值返undefined
arr.map():取出原数组中的值,加工后,放入新数组,可以赋新值,返回新值
如何:arr.foreach(function(val,i,arr){
arr[i]=新值;
})
arr.map(function(val,i,arr){
return 新值;
})
例:数组arr1值乘以2,数组arr2除以2给新值
var arr1 = [1,2,3,4,5];
var arr2 = [10,6,4,8,2];
var arr3 = [7,6,3,2,1];
//每个值 *2返回
arr1.foreach(function(val,i,arr){
arr[i]*=2;
})
//简写成:
arr1.foreach((val,i,arr)=>arr[i]*=2)
console.log(string(arr1))//2,4,6,8,10

//每个值 /2返回新值,新变量接
var newarr = arr2.map(function(val,i,arr){
return val/2;
})
//简写成:
var newarr = arr2.map(val =>val/2)
console.log(string(arr2))//10,6,4,8,2
console.log(string(newarr))//5,3,2,4,1

三、过滤和汇总
过滤:选取原数组中符合条件的元素组成新数组
var subarr = arr.filter(function(val,i,arr){
return 条件;//所有返回true的元素,被复制到新数组
})
例:过滤arr1中所有偶数
var arr1 = [1,2,3,4,5];
var evens =arr1.filter(function(val){
return val%2==0;
})
//简写成:
var evens = arr1.filter(val=>val%2==0)
console.log(string(arr1))//1,2,3,4,5
console.log(string(evens))//2,4

汇总:对数据中每个元素的值最终统计出一个新结果
var result = arr.reduce(function(prev,val,i,arr){
prev //获得截止目前的统计结果
return prev+val; //当前值和现在的prev值
},start) //start是汇总后要加的值到总和中
例:汇总arr1与arr2总和
var arr1 = [1,2,3,4,5];
var arr2 = [10,6,4,8,2];
//求arr1总和
var result =arr1.reduce(function(prev,val){
return prev+val;
})
var result =arr2.reduce(function(prev,val){
return prev+val;
},result)
console.log(result)//45
//25
var result =arr1.reduce(function(prev,val){
return prev+val;
},10)
console.log(result)//25

效率:数组api,其实内部使用的还是for循环遍历的方式,并没有提高程序的执行效率。只是简化了代码量。

在鄙视面试中会提到不能用数组api,意思是舍去了for循环还考你什么

*****bind()
什么是:基于一个现有函数,创建一个新函数,并永久绑定this。
不但可永久绑定this,也可永久绑定参数
为什么:this总是发生变化。
何时:只要希望一个对象永久绑定一个函数的this上。
结果:函数中的this将永远无法被其他对象替换。
(相当于一本书写上的自己的名字)

例:定义一个计算器,没绑定bind的为公共计算器,call可以调用,绑定bind的为私人计算器,别人调用不了,
//ps:用bind绑定的call强制作借用不好用了,
function calc(base,bonus){
console.log(
this.ename+'的总工资是'+(base+bonus)
)
}
var lilei = {ename:'li lei'};
var hmm = {ename:"han meimei"};
//lilei临时借用calc计算器
calc.call(hmm,10000,4000)//han meimei的总工资是14000
calc.call(lilei,10000,1000)//li lei的总工资是11000
//lilei买了一个和 calc一样的计算器,新计算器永久属于lilei
var lilei_calc=calc.bind(lilei);
lilei_calc(10000,3000); //li lei的总工资是13000
lilei_calc(10000,5000); //li lei的总工资是15000
lilei_calc(10000,9000); //li lei的总工资是19000
//hmm借lilei的计算器,call没有bind强大,借来用不了,名还是li lei
lilei_calc.call(hmm,10000,2999);//li lei的总工资是12999,

鄙视题:call apply bind 区别
call和apply:临时借用一个函数,并替换this为指定对象,
-----立刻执行
bind:基于现有函数,创建一个新函数,并永久绑定this 为指定对象。
-----只创建函数,不执行(要执行在下边在调用)
何时:立刻执行函数-------call
不立刻执行 -------bind