循环:

es5新增的一些东西:

循环:

1.for

for(let i=0;i<arr.length;i++){}

2.while

while

arr.forEach()

arr.map()

arr.filter()

arr.some()

arr.every()

arr.reduce()

arr.reduceRight()


forEach()函数:

//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>

map()函数:

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>
filter()函数:

过滤,过滤掉一些不合格的元素,如果回调函数返回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>

some()函数:

类似查找,数组里面某一个元素符合条件就返回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>
every()函数:

数组里面所有的元素符合条件才返回true,如:

<script >
    let arr = [1, 3, 5, 7, 9]
        var b = arr.every((val, index, arr) => {
            return val % 2 == 1;
        });
        console.log(b);
</script>
reduce()函数:

用于求数组的和 / 阶乘,并接收四个参数

<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>
reduceRight()函数:

就是reduce从右到左开始的序列,如:

<script >
    let arr = [2, 2, 3];
        let res = arr.reduceRight((prev, cur, index, arr) => {
            return prev ** cur;
        });
        console.log(res);
</script>
for…of…循环:

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>

fill()函数:

arr.fill() 用以填充,

参数: arr.fill(填充的东西,开始的位置,结束的位置),如:

<script >
    let arr = new Array(10);
        arr.fill("默认值",1,3)
        console.log(arr);
</script>

includes()函数:

为es2016新增

<script >
    let arr=['apple','banana','orange','peach']
        console.log(arr.includes('orange'));
</script>

Object.is()函数与 == 和 ===:

Object.is():比较两个东西是否相等

<script >
    // console.log(NaN == NaN);
    // console.log(Number.isNaN(NaN));
    let b = Object.is(NaN, NaN);
    console.log(b);
</script>
  1. == :等于,两边值类型不同的时候,先进行类型转换,再比较;
  2. === :严格等于,只有当类型和值都相等时,才相等;
  3. 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() 的区别

Object.is() 的行为与 === 基本一致,但有两处不同:

  a、+0 不等于 -0;

  b、NaN 等于自身

详细的可以对照下表

es6 数组对象增加字段 es6数组函数_json