循环:
es5新增的一些东西:
循环:
1.for
for(let i=0;i<arr.length;i++){}
2.while
whilearr.forEach()
arr.map()
arr.filter()
arr.some()
arr.every()
arr.reduce()
arr.reduceRight()
//forEach()是用来代替for的
// 以下几个使用方法一样
// arr.forEach()
// arr.map()
// arr.filter()
// arr.some()
// arr.every()//接收两个参数:
//forEach(回调函数,this)
// 此时this是指定forEach()中的this,例如:
<script > let arr = ['apple', 'banana', 'orange', 'tomato']; for (let i = 0; i < arr.length; i++) {
console.log(arr[i]); } console.log("------------"); //此处的forEach()接收三个参数: //val:数组当前遍历的元素,默认从左往右依次获取数组元素 //index:数组当前元素的索引,第一个元素索引为0,依次类推 //arr:当前遍历的数组 //this:回调函数中this指向 arr.forEach(function (val, index, arr) {
console.log(val, index, arr); },this); </script>
forEach()中可以指定this对象:
如:
<script > let arr = ['apple', 'banana', 'orange', 'tomato']; //此时没有指定this: {
arr.forEach(function (val, index, arr) {
console.log(this, val, index, arr); }); } ///指定this后输出 {
arr.forEach(function (val, index, arr) {
console.log(this, val, index, arr); }, 123); } </script>
使用forEach()循环输出数组,如:
<script > let arr = ['apple', 'banana', 'orange', 'tomato']; //要依次输出数组中全部对象时 {
arr.forEach(function (val, index, arr) {
console.log(arr[index]); }) } </script>
在forEach()中使用箭头函数无法指定this对象,如:
<script > let arr = ['apple', 'banana', 'orange', 'tomato']; //使用箭头函数时: {
arr.forEach((val, index, arr) => {
console.log(arr[index]); }); } console.log("-----------------"); //但是此时在箭头函数中输出this时,指定的是此时的window对象(此时无法指定this): {
arr.forEach((val, index, arr) => {
console.log(this, val, index, arr); },123) } </script>
arr.map()非常有用,用以做数据 映射,正常情况下,需要配合return,如:
<script > let arr=[ {
title:'aaa',read:100,hot:true}, {
title:'bbb',read:100,hot:true}, {
title:'ccc',read:100,hot:true}, {
title:'ddd',read:100,hot:true} ] let newArr = arr.map((item, index, arr) => {
console.log(item, index, arr); return 1; }) console.log(newArr); </script>
如果没有return,那么功能相当于forEach()
注意:使用map()了,就一定要用return,要不然还不如用forEach()
map()可以用来重新整理数据结构,如:
<script > let arr = [ {
title: 'aaa', read: 100, hot: true}, {
title: 'bbb', read: 100, hot: true}, {
title: 'ccc', read: 100, hot: true}, {
title: 'ddd', read: 100, hot: true} ] let newArr = arr.map((item, index, arr) => {
let json = {
} json.t = `^_^{item.title}----------`; json.r = item.read + 200; json.hot = item.hot == true && "真棒!!!"; return json; }); console.log(newArr); </script>
过滤,过滤掉一些不合格的元素,如果回调函数返回true,就留下来,如:
<script > let arr = [ {
title: 'aaa', read: 100, hot: true}, {
title: 'bbb', read: 100, hot: false}, {
title: 'ccc', read: 100, hot: true}, {
title: 'ddd', read: 100, hot: true} ] let newArr = arr.filter((item, index, arr) => {
// return item.hot == true; return item.hot; }) console.log(newArr); </script>
类似查找,数组里面某一个元素符合条件就返回true,如:
<script > let arr = ['apple', 'banana', 'orange']; let b = arr.some((val, index, arr) => {
return val == 'banana'; }) console.log(b); </script>
- 关于some()的应用:
<script > {
// 实现查找某一元素是否属于该数组 let arr = ['apple', 'banana', 'orange']; function findInArray(arr, item) {
return arr.some((val, index, arr) => {
return val == item; }); } console.log(findInArray(arr, 'orange')); } </script>
数组里面所有的元素符合条件才返回true,如:
<script > let arr = [1, 3, 5, 7, 9] var b = arr.every((val, index, arr) => {
return val % 2 == 1; }); console.log(b); </script>
用于求数组的和 / 阶乘,并接收四个参数
<script > // 求和: let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] /* prev:前一个元素 cur:当前循环的元素 index:当前循环索引 arr:整个循环的数组 * */ let res = arr.reduce((prev, cur, index, arr) => {
return prev + cur; }) console.log(res); </script>
<script > // 求阶乘 let arr = [2, 2, 3]; let res = arr.reduce((prev, cur, index, arr) => {
//Math.pow(a,b) ,a的b次方 // return Math.pow(prev, cur); // 或者: return prev ** cur; }); console.log(res); </script>
就是reduce从右到左开始的序列,如:
<script > let arr = [2, 2, 3]; let res = arr.reduceRight((prev, cur, index, arr) => {
return prev ** cur; }); console.log(res); </script>
for…of…中,数组多了几个对象:
arr.keys() 数组下标
arr.entries() 数组某一项
<script > let arr = ['apple', 'banana', 'orange'] for (let val of arr) {
console.log(val); } console.log("--------"); // 循环索引: for (let index of arr.keys()) {
console.log(index); } console.log("--------"); // 循环值和index for (let item of arr.entries()) {
console.log(item); } console.log("或者"); //或者: for ([key, value] of arr.entries()) {
console.log([key, value]); } </script>
补充:
- ES2017新增一个运算符: ** 幂
如: 2**3 相当于 Math.pow(2,3)
数组新增的东西:
Array.from():
作用:把类数组(获取的一组元素,arguments…)对象转成数组,如:
<body>
<script> window.onload = function () {
let aLi = document.querySelectorAll("ul li"); //ES5之前使用: // let arrLi = [].slice.call(aLi); // 快速转为数组,方便操作 let arrLi = Array.from(aLi); arrLi.pop(); arrLi.push('items'); console.log(arrLi); } </script>
<ul>
<li>01</li>
<li>02</li>
<li>03</li>
<li>04</li>
</ul>
</body>
将类数组转为数组,如:
一般具备length这个属性就靠谱
<script > // 不使用Array.from(),并且此时不是数组,无法使用push等: function show() {
console.log(arguments); } show(1,2,3,4,5) </script>
<script> // 使用Array.from(),此时是数组,可以使用push: function show() {
// console.log(arguments); let arr = Array.from(arguments); arr.push('6') console.log(arr); } show(1, 2, 3, 4, 5) </script>
arr.fill() 用以填充,
参数: arr.fill(填充的东西,开始的位置,结束的位置),如:
<script > let arr = new Array(10); arr.fill("默认值",1,3) console.log(arr); </script>
为es2016新增
<script > let arr=['apple','banana','orange','peach'] console.log(arr.includes('orange')); </script>
Object.is():比较两个东西是否相等
<script > // console.log(NaN == NaN); // console.log(Number.isNaN(NaN)); let b = Object.is(NaN, NaN); console.log(b); </script>
-
- == :等于,两边值类型不同的时候,先进行类型转换,再比较;
-
- === :严格等于,只有当类型和值都相等时,才相等;
-
- Object.is() :与 === 的作用基本一样,但有些许不同。
-
对于严格相等,有以下规则,如果 x === y,那么:
a、如果x的类型和y的类型不一样,返回false;
b、如果x的类型是数字,那么:
(1):如果x是NaN,返回false;
(2):如果y是NaN,返回false;
(3):如果x和y是同一个数字值,返回true;
(4):如果x是+0,y是-0,返回true;
(5):如果x是-0,y是+0,返回true;
(6):其余返回false。
c、如果x和y的类型都为undefined或者null,返回true;
d、如果x和y的类型都为字符串类型,那么如果x和y是完全相同的字符编码序列,返回true,否则返回false;
e、如果x和y的类型都为布尔类型,那么如果x和y同为true或者false,返回true,否则返回false;
f、如果x和y是同一个对象值,返回true,否则返回false
Object.is() 的行为与 === 基本一致,但有两处不同:
a、+0 不等于 -0;
b、NaN 等于自身
详细的可以对照下表