JavaScript-数组详解
预热知识:对象遍历
1、定义对象,获取对象
var obj={ a:1, b:2, c:3, d:function () { console.log("aa"); } }; // console.log(obj["a"]); // console.log(obj.a); obj.a=10; obj["a"]=10; //可以传入动态的属性var mysttr = xxx; obj[myattr] obj.d(); obj["d"]();
2、for in 循环,复制对象
* for in 语句,遍历对象 * */ for(var prop in obj){ console.log(prop,obj[prop]); //prop 属性名 obj[prop] 属性值 } //复制 var obj1={}; for(var key in obj){ obj1[key]=obj[key]; } obj.a=40; console.log(obj1,obj); //obj1 和obj是两个独立的对象了
案例:设置div标签style属性
----------------------------------html <div id="div0"></div> ----------------------------------JavaScript function setStyle(elem, style) { for (var prop in style) { elem.style[prop] = style[prop]; } } var div0 = document.getElementById("div0"); setStyle(div0, { width: "100px", height: "100px", backgroundColor: "red" });
另一种写法:
HTMLElement.prototype.addStyle = function (style) { for (var prop in style) { this.style[prop] = style[prop]; } }; div0.addStyle({ width: "100px", height: "100px", backgroundColor: "red" })
一、数组基础
<body> <div id="div0"></div> <div id="div1"></div> <div id="div2"></div> <div id="div3"></div> <div id="div4"></div> <script> /* * 数组是一种数据结构 * 数组 将无序的数据做有序的排列,存储在一个变量中 * 原生JS中没有数组类型(是继承的对象),原生JS中的数组可以存储多个不同类型的数据(弱类型) * Array.isArray(arr) 判断arr是否是数组,区别不能用typeof判断是否是数组 * * 数组中,标识元素所在的位置,叫做下标,也可以叫做索引 * 数组中,标识元素的内容,arr[0]这个就叫做下标变量 * * */ /*for(var i=0;i<5;i++){ var div=document.getElementById("div"+i); }*/ var arr=[1,2,3,4,5]; //字面量创建 var arr1=new Object([1,2,3,4]); //对象构造函数创建 // console.log(typeof arr); // console.log(Array.isArray(arr)); //判断arr是否是数组,注意typeof arr 值是object // var arr2=[1,false,"a",{a:1,b:2}]; //这种类型不同的数据存储会造成数组操作时的效率降低 // var arr2=new Array(); //构造函数创建; // var arr2=new Array(1,2,3,4); //构造函数创建,也可以直接赋值(但不建议直接这样赋值); /* * 构造函数创建数组时,第一个参数 * 如果第一个参数是数值类型并且构造函数中只有这一个参数,这个参数就是设置数组的长度,这个长度不能是小数或者负数,否则会报错 * * 如果参数有2个或2个以上,那么第1个元素就不是数组的长度了,而是数组的第0个元素;如果第1参数不是数值类型,且仅有1个,也是作为数组的第0个元素 * * */ var arr2=new Array(4); //4是长度,设置之后可以往里面加入的元素也可以不止4个 console.log(arr2); var arr3=[]; // 0 就是下标 arr3[0]=100; arr3[1]=200; console.log(arr3); var arr4=[]; for(var i=0,j=0;i<100;i+=2,j++){ arr4[j]=i; } console.log(arr4); var arr5=[]; for(var k=0;k<5;k++){ arr5[k]=document.getElementById("div"+k); } arr5[2].style.marginLeft="200px"; </script> </body>
二、数组长度
<script> /* * length 数组的长度 * 数组的长度是可以设置的 * * 将数组的长度设置为0,表示清空数组 * 如果数组的长度小于原数组长度,意味着将数组从0位截取到指定位置,后面的删除掉---> 用于做数组的截取 * */ var arr=[1,2,3,4,5]; /* console.log(arr.length); arr.length=3; console.log(arr);*/ // arr[arr.length-1]=6; //将数组中最后一个元素5替换为6 arr[arr.length]=6; //给数组的尾部添加一个新元素6 arr.a=100; /* * 使用for循环数组,只能循环数组的每个元素 * 使用for in循环数组,不但可以循环数组的每个元素,还可以循环到他的属性 * * */ for(var i=0;i<arr.length;i++){ console.log(arr[i]); } //for in 遍历到数组属性 for(var prop in arr){ console.log(arr[prop]); } </script>
案例:冒泡排序和选择排序
<script> window.onload = function () { /*冒泡排序*/ var arr=[6,3,5,7,9,2,4,1,8]; //外层从后往前 for(var i=arr.length;i>0;i--){ //内层从前往后 for(var j=0;j<arr.length-1;j++){ if(arr[j]>arr[j+1]){ var temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } console.log("第"+i+"次循环:",arr); } console.log("--->",arr); /*选择排序*/ var arr=[6,3,5,7,9,2,4,1,8]; // 外层循环从头到尾 for(var j=0;j<arr.length;j++){ var min = j; //每次初始最小值是当前外层循环所在值 // 从当前所在值的下一项到尾部循环 for(var i=j+1;i<arr.length;i++){ if(arr[i]<arr[min]){ var temp = arr[min]; arr[min] = arr[i]; arr[i] = temp; } } console.log("第"+j+"次循环:",arr); } console.log(arr); }; </script>
三、数组和对象
<script> var arr=[1,2,3,4,5]; var obj={a:1,b:2,c:3}; /* var arr1=arr; //将arr的地址赋给arr1 arr[0]=40; console.log(arr1); //[40,2,3,4,5] */ //深复制一个数组 /* var arr1=[]; for(var i=0;i<arr.length;i++){ arr1[i]=arr[i]; } arr[0]=40; console.log(arr1);*/ // var str=arr.toString(); // var str=obj.toString(); //错误[object object] /*var str=""; for(var prop in obj){ str+=prop+"="+obj[prop]+"&" } console.log(str);*/ // 将对象转换为JSON字符串 var str=JSON.stringify(obj); // 将JSON字符串逆转回对象 var obj1=JSON.parse(str); obj.a=20; console.log(obj1); var str1=JSON.stringify(arr); var arr1=JSON.parse(str1); arr[0]=40; console.log(arr1); var objs={ a:1, b:{ a:1, b:{ a:1, b:{ a:1 } } } }; /*var obj2={}; for(var prop in objs){ obj2[prop]=objs[prop]; } objs.b.a=10;*/ /* * 利用JSON转换可以深复制 * * */ /*var obj2=JSON.parse(JSON.stringify(objs)); objs.b.b.a=10; console.log(obj2);*/ console.log("b" in obj);//属性名是否在对象下 /* if("b" in obj){ }*/ // 数组中是否有该下标(索引),不是值 console.log(5 in arr); //false console.log(3 in arr); //true </script>
四、数组的方法-push() pop() shift() unshift()
var arr=[-2,-1,0,1,2,3,4,5]; // var len=arr.push();//返回数组的新长度 // len=arr.push(6);//[1,2,3,4,5,6],6; // var len=arr.push(6,7,8);//[1,2,3,4,5,6,7,8],8; // var len=arr.push([6,7,8]);//[1,2,3,4,5,[6,7,8]],6; //数组首端入栈,返回新数组长度 // var len=arr.unshift(); // var len=arr.unshift(0); // var len=arr.unshift(-2,-1,0); /* * 减少使用unshift ,unshift会将原来数组的所有项向后移动一位 因此效率非常低 * */ // console.log(len,arr); // 删除数组尾部的元素 // var t=arr.pop(); //返回被删除的元素 // console.log(t); /*var arr1=[]; var t; while (t=arr.pop()){ arr1.push(t); } console.log(arr1,arr);*/ // 删除数组的头部元素 // var t=arr.shift();//返回被删除的元素
作业1.随机生成一个5位以内的数,然后输出该数共有多少位,每位分别是什么
var arr1=[]; var bool=false; for(var i=0;i<4;i++){ var s=parseInt(Math.random()*10); //随机生成0-9 if(s===0 && !bool) continue; //第一位不能是0 arr1.push(s); bool=true; } var num=Number(arr1.join("")); console.log(arr1,arr1.length,num)
五、数组转化为字符串join() , 连接数组concat()
<script> var arr=[1,2,3,4]; // console.log(arr.join()); //arr.toString()相同 // console.log(arr.join("#")); //设置一个符号,用这个符号链接数组的每个元素,形成新字符串 // console.log(arr.join("")); //元素紧密相连,中间没有分割 // var arr1=arr.concat(); //没有参数时,是复制数组 // arr[0]=10; //arr1=[1,2,3,4] // var arr1=arr.concat(5,6); //将arr数组链接,5,6两个元素,形成新数组,原数组不变 // var arr1=arr.concat([5,6,7]); //将arr数组和数组[5,6,7]合并形成新数组 var arr2=[7,8,9]; var arr1=arr.concat(arr2); //将两个数组链接形成新数组 console.log(arr1,arr); </script>
六、截取数组 splice() slice()
<script> var arr=[1,2,3,4,5]; // arr.splice(); 数组插入删除替换元素,并且返回被删除元素组合新数组 // arr.splice();//创建一个新的空数组返回 // var arr1=arr.splice(3);//从下标是3开始删除到尾部 // var arr1=arr.splice(0);//将arr的所有元素导入到arr1中.清空arr // var arr1=arr.splice(0,2);//从arr数组的下标0开始删除2位元素 // var arr1=arr.splice(0,0,-1);//在第0位插入一个-1; // var arr1=arr.splice(-1,0,-1);//在第-1位(倒数第1位)插入一个-1; // var arr1=arr.splice(arr.length,0,-1);//在尾部插入一个-1 // var arr1=arr.splice(1,2,-1,-2);//从第1位开始替换两个元素为-1,-2 // console.log(arr1,arr); //去重 var arr1=[1,3,5,2,1,4,3,1,2,5,3,1,2,1]; /* * 数组删除元素后,数组的长度会发生改变 * * */ /* for(var i=0;i<arr1.length;i++){ for(var j=i+1;j<arr1.length;j++){ if(arr1[i]===arr1[j]){ arr1.splice(j,1); } } } console.log(arr1)*/ // arr.slice(); 数组截取元素,返回被截取的新元素,原数组不改变 // var arr2=arr.slice();//复制arr的所有元素给arr2,没有引用关系 // var arr2=arr.slice(0);//复制arr的所有元素给arr2,没有引用关系 // var arr2=arr.slice(3);//将数组从下标3开始到结尾截取形成新数组 // var arr2=arr.slice(-2);//将数组从倒数第2位开始到结尾截取形成新数组 // var arr2=arr.slice(3,4);//将数组从下标3开始到下标4截取形成新数组 // var arr2=arr.slice(-2,4);//将数组从倒数第2位开始到下标4截取形成新数组 // var arr2=arr.slice(-2,-1);//将数组从倒数第2位开始到倒数第1位截取形成新数组 // console.log(arr2,arr); var div=document.getElementsByTagName("div"); // div.pop(); //报错,Uncaught TypeError: div.pop is not a function console.log(div); //HTMLCollection(7) [div, div, div, div, div, div, div] 是一个类似数组的对象,但是不是数组故不能使用数组的方法 var arr2=Array.prototype.slice.call(div); //将非数组元素转换为数组 console.log(arr2); //(7) [div, div, div, div, div, div, div] arr2.pop(); //转换为数组之后 可以使用 数组方法了 console.log(arr2); //(6) [div, div, div, div, div, div] </script>
七、indexOf() lastindexOf() 查找内容
查找列表中的是否含有某项,有返回下标,没有返回-1。arr.indexOf() arr.lastIndexOf()
<script> var arr=[1,2,3,4,5,6,2,9,10,2]; // arr.indexOf(); /* 在数组中查找元素,可以根据第二个参数的起始位置开始查找, 返回查找到元素的下标,如果没有找到返回-1*/ // console.log(arr.indexOf(2));//从下标0开始向后查找2 // console.log(arr.indexOf(2,2)); //从下标2开始向后查找2 //找到arr所有的2 var index=-1; while (arr.indexOf(2,index+1)>-1){ index=arr.indexOf(2,index+1); console.log(index); } // arr.lastIndexOf(2);//从后向前搜索,查找到元素的下标返回 </script>
八、倒序reverse() 和 排序sort()
倒序reverse()
/* * reverse 倒序 * 原数组倒序改变,返回的新数组和原数组是引用关系 * * */ var arr = [2, 3, 5, 7, 9, 1, 4, 6, 8, 10]; // var arr1 = arr.reverse(); // // console.log(arr, arr === arr1); //true,arr1和arr是引用关系
排序sort()
/* * sort(); * 排序数组中的元素,原数组发生改变,返回的新数组和原数组是引用关系 * sort(function(a,b){}) * */ // var arr1 = arr.sort(); // console.log(arr,arr1===arr); //[1, 10, 2, 3, 4, 5, 6, 7, 8, 9] true 按位进行排序 /*由小到大排序*/ /*arr.sort(function (pre,next) { return pre-next; });*/ /*由大到小排序*/ /*arr.sort(function (pre,next) { return next-pre; });*/ //console.log(arr);
案例演示:
《1》随机生成data属性num对应的值,按照num从小到大排序
/*// 随机生成data属性num对应的值,按照num从小到大排序 var data=[ {id:1001,icon:"img/1.png",name:"餐饮0",num:1,price:10}, {id:1002,icon:"img/2.png",name:"餐饮1",num:1,price:20}, {id:1003,icon:"img/3.png",name:"餐饮2",num:1,price:30}, {id:1004,icon:"img/4.png",name:"餐饮3",num:1,price:40}, {id:1005,icon:"img/5.png",name:"餐饮4",num:1,price:50}, {id:1006,icon:"img/6.png",name:"餐饮5",num:1,price:60}, {id:1007,icon:"img/7.png",name:"餐饮6",num:1,price:70}, {id:1008,icon:"img/8.png",name:"餐饮7",num:1,price:80}, {id:1009,icon:"img/9.png",name:"餐饮8",num:1,price:90}, {id:1010,icon:"img/10.png",name:"餐饮9",num:1,price:100} ]; for(var i=0;i<data.length;i++){ data[i].num=parseInt(Math.random()*8+2); //随机 2-8 } data.sort(function (pre,next) { return pre.num-next.num; }); console.log(data);*/
《2-1》普通的随机,输出0-100之间 不重复的4个数
/*var arr2 = []; // 普通的随机,输出0-100之间 不重复的4个数 while (arr2.length<4){ var num=parseInt(Math.random()*100); if(arr2.indexOf(num)===-1){ arr2.push(num); } } console.log(arr2);*/
《2-2》排序的随机乱序
/* 排序的随机乱序 for(var i=0;i<100;i++){ arr2.push(i); //[0,1,2,3 ....99] } arr2.sort(function () { return Math.random()-0.5; //-0.5~0.5 (负数从小到大排序,正数从大到小) }); arr2.length=4; //取数组的前四个 console.log(arr2);*/
《3》抽奖:一等奖1个,二等奖2个,三等奖3个,四等奖4个,五等奖5个
《4》生成4位数字 字母混合的验证码
var str = "azAZ"; /* //拼音字符和汉字排序 console.log(str.charCodeAt(0)); //a对应的ascii数值为 97 console.log("一".charCodeAt(0).toString(16)); //一 对应的ascii数值 转化为十六进制 var arr3=["xietian","wangzheng","xuli","zhangxueyou"]; arr3.sort(function (pre,next) { return pre.charCodeAt(0)-next.charCodeAt(0); //首字母从小到大排序 }); console.log(arr3);*/ /*console.log(String.fromCharCode(97)); //a ,将ASCII上十进制数97 转化为对应字符 console.log(String.fromCharCode(0x4e00));*/ /* 生成4位数字 字母混合的验证码 * a--97 * z--122 * * A-65 * Z-90 * */ // console.log(str.charCodeAt(3)); var arr3 = []; for (var i = 0; i < 123; i++) { if (i < 10) { arr3.push(i); continue; } if (i < 65) continue; if (i < 91) { arr3.push(String.fromCharCode(i)); continue; } if (i < 97) continue; arr3.push(String.fromCharCode(i)); } // arr3 为: //[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", // "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"] console.log(arr3); arr3.sort(function () { //将生成的4位验证码 乱序 return Math.random() - 0.5; }); console.log(arr3); arr3.length = 4; //取出乱序后的数组的前4位 console.log(arr3); console.log(arr3.join("")); // 面试问题:手机APP注册时 验证码一般是接入的一些收费的验证码API平台,如创蓝253 https://zz.253.com/v5.html#/yun/sms_y?did=232
九、遍历的多种玩法
(1)forEach()
/*var arr=[1,2,4,6,7,8,5,9]; arr.forEach(function (item,index,arr) { console.log(item,index,arr); })*/ // item是数组每一项,index是数组下标,arr是该数组
案例和知识点演示:
/* 修改产品的数量随机,求出每个产品的总价 var data=[ {id:1001,icon:"img/1.png",name:"餐饮0",num:1,price:10}, {id:1002,icon:"img/2.png",name:"餐饮1",num:1,price:20}, {id:1003,icon:"img/3.png",name:"餐饮2",num:1,price:30}, {id:1004,icon:"img/4.png",name:"餐饮3",num:1,price:40}, {id:1005,icon:"img/5.png",name:"餐饮4",num:1,price:50}, {id:1006,icon:"img/6.png",name:"餐饮5",num:1,price:60}, {id:1007,icon:"img/7.png",name:"餐饮6",num:1,price:70}, {id:1008,icon:"img/8.png",name:"餐饮7",num:1,price:80}, {id:1009,icon:"img/9.png",name:"餐饮8",num:1,price:90}, {id:1010,icon:"img/10.png",name:"餐饮9",num:1,price:100} ]; data.forEach(function (item) { item.num=parseInt(Math.random()*9+1); item.sum=item.num*item.price; }); console.log(data);*/ /* // 修改数组中的每个值 var arr=[1,2,4,6,7,8,5,9]; arr.forEach(function (t,i,arr) { // t++; //错误 // arr[i]++; //数组中每一项 // 将所有偶数+1 if(t%2===0){ arr[i]++; } }); console.log(arr);*/
(2)map()遍历
//map()遍历 // var arr=[1,2,4,6,7,8,5,9]; // arr.map(function (t) { // // }) /* map()与forEach相似,可以完成forEach的所有功能 var data=[ {id:1001,icon:"img/1.png",name:"餐饮0",num:1,price:10}, {id:1002,icon:"img/2.png",name:"餐饮1",num:1,price:20}, {id:1003,icon:"img/3.png",name:"餐饮2",num:1,price:30}, {id:1004,icon:"img/4.png",name:"餐饮3",num:1,price:40}, {id:1005,icon:"img/5.png",name:"餐饮4",num:1,price:50}, {id:1006,icon:"img/6.png",name:"餐饮5",num:1,price:60}, {id:1007,icon:"img/7.png",name:"餐饮6",num:1,price:70}, {id:1008,icon:"img/8.png",name:"餐饮7",num:1,price:80}, {id:1009,icon:"img/9.png",name:"餐饮8",num:1,price:90}, {id:1010,icon:"img/10.png",name:"餐饮9",num:1,price:100} ]; data.map(function (item) { item.num=parseInt(Math.random()*9+1); item.sum=item.num*item.price; }); console.log(data);*/ // 每个元素+1,返回给新数组 var arr=[1,2,4,6,7,8,5,9]; var arr1=arr.map(function (t) { return ++t; }); console.log(arr,arr1); /* return 返回数据元素,到新数组中,如果不返回的数据就会变成undefined var arr=[1,2,4,6,7,8,5,9]; arr=arr.map(function (t) { if(t%2===0){ return t+1; } return t; //如果没有这句,非奇数的返回为undefined }); console.log(arr);*/
总结 map() 和 forEach() 的区别
/* map() 和 forEach() 的区别 * forEach遍历当前数组,没有返回值,不会返回新数组 * map遍历当前数组,并且将当前数组中的元素返回给新数组, * 不使用return时,新数组的长度与原数组相同,但是每个元素都是undefined; * */
十、some() every() filter() reduce()
《1》some()方法
定义和用法:
some() 方法用于检测数组中是否存在满足条件的项(函数提供)。
some() 方法会依次执行数组的每个元素:
- 如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。
- 如果没有满足条件的元素,则返回false。
注意: some() 不会对空数组进行检测。
注意: some() 不会改变原始数组。
语法:array.some(function(currentValue,index,arr),thisValue)
案例:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> <p>点击按钮检测数组中是否有元素大于输入框中输入的数字。</p> <p>最小年龄: <input type="number" id="ageToCheck" value="18"></p> <button onclick="myFunction()">点我</button> <p>判断结果: <span id="demo"></span></p> <script> var ages = [4, 12, 16, 20]; function checkAdult(age) { return age >= document.getElementById("ageToCheck").value; } function myFunction() { document.getElementById("demo").innerHTML = ages.some(checkAdult); } </script> </body> </html>
参考:https://www.runoob.com/jsref/jsref-some.html
《2》every方法
定义和用法:
every() 方法用于检测数组所有元素是否都符合指定条件(通过函数提供)。
every() 方法使用指定函数检测数组中的所有元素:
- 如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。
- 如果所有元素都满足条件,则返回 true。
注意: every() 不会对空数组进行检测。
注意: every() 不会改变原始数组。
语法:array.every(function(currentValue,index,arr), thisValue)
案例:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> <p>点击按钮检测数组的所有元素是否都大于输入框中指定的数字。</p> <p>最小年龄: <input type="number" id="ageToCheck" value="18"></p> <button onclick="myFunction()">点我</button> <p>是否所有年龄都符号条件? <span id="demo"></span></p> <script> var ages = [32, 33, 12, 40]; function checkAdult(age) { return age >= document.getElementById("ageToCheck").value; } function myFunction() { document.getElementById("demo").innerHTML = ages.every(checkAdult); } </script> </body> </html>
《3》filter()方法
定义和用法:
filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
注意: filter() 不会对空数组进行检测。
注意: filter() 不会改变原始数组。
语法:array.filter(function(currentValue,index,arr), thisValue)
案例:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> <p>点击按钮返回数组 ages 中所有元素都大于输入框指定数值的元素。</p> <p>最小年龄: <input type="number" id="ageToCheck" value="18"></p> <button onclick="myFunction()">点我</button> <p>所有大于指定数组的元素有? <span id="demo"></span></p> <script> var ages = [32, 33, 12, 40]; function checkAdult(age) { return age >= document.getElementById("ageToCheck").value; } function myFunction() { document.getElementById("demo").innerHTML = ages.filter(checkAdult); } </script> </body> </html>
参考:https://www.runoob.com/jsref/jsref-filter.html
《4》reduce() 方法
定义和用法:
reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
reduce() 可以作为一个高阶函数,用于函数的 compose。
注意: reduce() 对于空数组是不会执行回调函数的。
语法:array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
案例:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> <p>点击按钮后对数组元素进行四舍五入并计算总和。</p> <button onclick="myFunction()">点我</button> <p>数组元素之和: <span id="demo"></span></p> <script> var numbers = [15.5, 2.3, 1.1, 4.7]; function getSum(total, num) { return total + Math.round(num); } function myFunction(item) { document.getElementById("demo").innerHTML = numbers.reduce(getSum, 0); } </script> </body> </html>
视频学习笔记:
<script> var arr = [1, 2, 4, 6, 7, 8, 5, 9]; /* var bool=arr.some(function (t) { // 判断所有元素是否有满足该条件的, // 如果遇到一次满足则不再继续判断,直接返回true,否则返回false return t>10; }); console.log(bool);*/ // some()方法的应用:作为if的判断条件 // 判断数组中是否有大于5的值 /* if(arr.some(function (t) { return t>5 })){ }*/ /*// 查询对象型数组是否有符合条件的元素 var data=[ {id:1001,icon:"img/1.png",name:"餐饮0",num:1,price:10}, {id:1002,icon:"img/2.png",name:"餐饮1",num:1,price:20}, {id:1003,icon:"img/3.png",name:"餐饮2",num:1,price:30}, {id:1004,icon:"img/4.png",name:"餐饮3",num:1,price:40}, {id:1005,icon:"img/5.png",name:"餐饮4",num:1,price:50}, {id:1006,icon:"img/6.png",name:"餐饮5",num:1,price:60}, {id:1007,icon:"img/7.png",name:"餐饮6",num:1,price:70}, {id:1008,icon:"img/8.png",name:"餐饮7",num:1,price:80}, {id:1009,icon:"img/9.png",name:"餐饮8",num:1,price:90}, {id:1010,icon:"img/10.png",name:"餐饮9",num:1,price:100} ]; if(data.some(function (t) { return t.id===1005 })){ console.log("有"); }*/ // 判断数组中每一个是否满足条件,如果全部都满足,就返回true,否则返回false var bool = arr.every(function (t) { return t > 0; }); console.log(bool); //true ,数组中所有元素都大于0 /* * filter过滤筛选 array.filter(function(currentValue,index,arr), thisValue) * 不修改原数组,返回的满足条件的新数组 * */ /* var arr1=arr.filter(function (t) { t++; return t>5;//返回的任然是原元素 }); console.log(arr1,arr);*/ /*var data=[ {id:1001,icon:"img/1.png",name:"餐饮0",num:1,price:10}, {id:1002,icon:"img/2.png",name:"餐饮1",num:1,price:20}, {id:1003,icon:"img/3.png",name:"餐饮2",num:1,price:30}, {id:1004,icon:"img/4.png",name:"餐饮3",num:1,price:40}, {id:1005,icon:"img/5.png",name:"餐饮4",num:1,price:50}, {id:1006,icon:"img/6.png",name:"餐饮5",num:1,price:60}, {id:1007,icon:"img/7.png",name:"餐饮6",num:1,price:70}, {id:1008,icon:"img/8.png",name:"餐饮7",num:1,price:80}, {id:1009,icon:"img/9.png",name:"餐饮8",num:1,price:90}, {id:1010,icon:"img/10.png",name:"餐饮9",num:1,price:100} ]; data.forEach(function (t) { t.selected=Math.random()*2+1<2; }); // 过滤data属性selected为true的项 data2 = data.filter(function (t) { return t.selected }); console.log(data2,data); //data 不变 /!* * 判断是否每个元素都被选中 * *!/ // if(data.length===data.filter(function (t) { return t.selected }).length){ // // }*/ /* reduce()方法 array.reduce(function(total, currentValue, currentIndex, arr), initialValue) * 如果没有initValue值,sum就是第0项的值,item就是第一项值,所以index是从1开始 *一般用于 求和 求阶乘运算 * */ // arr是实例.动态方法 /* var s=arr.reduce(function (sum,item,index) { console.log(sum,item,index); return sum+item; },-10); //这里第二个参数是initValue初始值,如果设置这个初始值,index就从0开始,sum开始就是-10 console.log(s);*/ // Array是类名:类别的名称 // Array.isArray(); //静态方法 // Array.from(); //ES6的方法 // Array.prototype.slice.call(div); //(ES5) // Array.from(div); //将类数组转换为数组(ES6) </script>
十一、函数arguments参数与数组方法的结合
一般的函数传参必须一一对应
// * 参数如果写在所有参数的最前面,那就是必要参数 // * ES5中所有的参数一般都需要按位置填写,如果没有填写,就会变成undefined // * 多填进入的参数值不会被直接获取到 // * /* function fn1(a,b,c) { console.log(a,b,c); } fn1(null,3,4,10,20);*/
arguments可以传入不定参数
/*function max() { console.log(arguments); //函数中就可以获取这个arguments var arr = Array.from(arguments); //将传入的参数 转化为一个数组 return arr.reduce(function (p1, p2) { return p1 > p2 ? p1 : p2; }); } console.log(max(1, 2, 3, 5, 7, 9, 1, 2, 5)); console.log(max(3, 6, 8, 20, 10));*/
arguments的属性
function fn2() { console.log(arguments); console.log(Array.from(arguments)); console.log(arguments.callee.a); console.log(arguments.callee); //arguments.callee 当前执行的函数 console.log(arguments.callee.caller); //回调当前函数的父级函数 } fn2.a = 10; // fn2(3,4,6,7); function fn3(fn) { fn(3,6,4,7); } fn3(fn2);
十二、Math函数
Math常量
案例1:轮播图
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>轮播图</title> <style> *{ margin: 0; padding: 0; } #rollImg{ width: 1280px; height: 426px; margin: auto; position: relative; overflow: hidden; } #imgCon{ width: 6400px; height: 426px; transition: all 1s; font-size: 0; /*消除图片之间空格*/ position: absolute; left: 0; } #imgCon img{ width: 1280px; height: 426px; } #leftBtn{ position: absolute; top: 200px; left: 0; } #rightBtn{ position: absolute; top: 200px; right: 0; } #dotControl{ list-style: none; position: absolute; left: 500px; bottom: 10px; } #dotControl li{ width: 16px; height: 16px; border: 2px solid red; border-radius: 8px; float: left; margin-left: 10px; background-color: rgba(255,0,0,0.5); } </style> </head> <body> <div id="rollImg"> <div id="imgCon"> <img src="img/a.jpeg"> <img src="img/b.jpeg"> <img src="img/c.jpeg"> <img src="img/d.jpeg"> <img src="img/e.jpeg"> </div> <ul id="dotControl"> <!-- 根据img个数动态生成小圆点--> <!--<li></li> <li></li> <li></li> <li></li> <li></li>--> </ul> <img id="leftBtn" src="img/left.png"> <img id="rightBtn" src="img/right.png"> </div> </body> <script> var $imgCon,leftbtn,rightbtn,$dotControl,liList; var position = 0; init(); function init() { $imgCon = document.querySelector("#imgCon"); $dotControl = document.querySelector("#dotControl"); leftbtn = document.querySelector("#leftBtn"); rightbtn = document.querySelector("#rightBtn"); // 根据图片个数创建小圆点,并添加事件 imgs = $imgCon.querySelectorAll('img'); for(var i=0;i<imgs.length;i++){ node = document.createElement("li"); $dotControl.appendChild(node); //给每个li节点添加点击事件 node.addEventListener('click',liClickHandler); } liList = document.querySelectorAll("#dotControl li"); liList[0].style.backgroundColor="blue"; //给前进后退按钮添加点击事件 leftBtn.addEventListener('click',clickHandler); rightBtn.addEventListener('click',clickHandler); } function liClickHandler(e) { position = Array.from(liList).indexOf(this); imgConMove(); } function clickHandler() { if(this ===leftbtn){ position--; if(position<0){position=4} imgConMove(); return; } position++; if(position>4){position=0} imgConMove(); } function imgConMove() { $imgCon.style.left = -1280*position+"px"; console.log(liList[position]); liList.forEach(function (item,index) { if(index===position){ item.style.backgroundColor="blue"; }else{ item.style.backgroundColor="rgba(0,0,0,0)"; } }) } </script> </html>