JS基础 #第八天

目录

一、创建数组

new创建数组

字面量创建数组

二、数组的常用方法

三、遍历数组

四、函数的call()和apply()

五、arguments


一、创建数组

new创建数组

    // 创建一个数组
    var arr = new Array();
    // 1.使用typeof检查一个数组时,会返回Object
    console.log(typeof arr); // Object

    // 2.向数组添加元素 语法:数组[索引] = 值  索引从0开始
    arr[0] = 10;
    arr[1] = 21;
    arr[2] = 32;
    // arr[5] = 44;
    console.log(arr); //  [10, 21, 32]
    
    // 3.读取数组中的元素 语法:数组[索引]
    console.log(arr[1]); // 21 读取索引为1的位置
    console.log(arr[3]); // 读取索引不存在的位置 会返回undefined
    
    // 4.获取数组长度 语法:数组.length 
    console.log(arr.length); // 3

    // 5.1对于连续的数组,使用length可以获取到数组的长度(元素继个数)
    // 5.2对于非连续的数组,使用length会获取到数组的最大的索引+1

    // 6.修改length
    // 6.1如果修改的length大于原长度,则多出部分会空出来
    // arr.lenght = 6;
    // console.log(arr);
    // 6.2如果修改的length小于原长度,则多出的元素会被删除
    // arr.length = 2
    // console.log(arr);   [10, 21]
    
    // 7.用length作为索引给数组的最后一个位置添加元素 语法:数组[数组.length]=元素
    arr[arr.length] = 33;
    arr[arr.length] = 44;
    console.log(arr); // [10, 21, 32, 33, 44]

    // 8.1使用构造函数创建数组时,也可以同时添加元素,将要添加的元素作为构造函数的参数传递,元素之间使用,隔开
    var arr1 = new Array(1, 2, 3, 4, 5);
    console.log(arr1); //  [1, 2, 3, 4, 5]

    // 8.2使用构造函数创建对象,如果里面只有一个元素n,代表创建了一个长度为n的数组
    var arr2 = new Array(10);
    console.log(arr2.length); // 10

字面量创建数组

    // 1.字面量创建数组:直接在创建时就添加元素,数组中的元素可以是任意的数据类型
    var arr = ['小莉', 2, 3, 4, true, {name: 'koko'}, function() {}];
    console.log(arr); //   ["小莉", 2, 3, 4, true, {…}, ƒ]
    
    // 2.多维数组:数组里面放数组
    var arr1 = [[1, 2, 3], [4, 5, 6], [7,8]];
    console.log(arr1); // [Array(3), Array(3), Array(3)]
    console.log(arr1[1][1]); // 5

二、数组的常用方法

常用方法释义
push();

向数组的末尾添加一个或多个元素,并将数组新的长度作为返回值返回

pop();

删除数组的最后一个元素,并将被删除的元素作为返回值返回

unshift();

向数组开头添加一个或多个元素,并将数组新的长度作为返回值返回

shift();

删除数组的第一个元素,并将被删除的元素作为返回值返回

forEach()

遍历数组,只支持IE8以上的浏览器

slice();

用来从数组提取指定元素,不会改变原来数组

splice();

删除/插入/替换元素,会影响到原数组

concat();

连接两个或多个数组,并将新的数组返回,不会对原数组产生影响

join();

将数组转换为一个字符串,将转换后的字符串作为结果返回,不会对原数组产生影响

reverse();

用来反转数组,会直接修改原数组

sort();

用来对数组中的元素进行排序,默认会按照Unicode编码进行排序 ,会影响原数组

1.push();  pop();  unshift();  shift();

    // 创建一个数组 
    var arr = [1, 2, 3, 4];
    // 1.push(); 该方法可以向数组的末尾添加一个或多个元素,并将数组新的长度作为返回值返回
    var re = arr.push(23, 45);
    console.log(arr); // [1, 2, 3, 4, 23, 45]
    console.log(re); // 6
    
    // 2.pop(); 该方法可以删除数组的最后一个元素,并将被删除的元素作为返回值返回
    var res = arr.pop();
    console.log(arr); // [1, 2, 3, 4, 23]
    console.log(res); // 45
    
    // 3.unshift(); 向数组开头添加一个或多个元素,并将数组新的长度作为返回值返回
    // 向前边插入元素以后,其他的元素索引会依次调整
    var resu = arr.unshift('玉兔', '白马');
    console.log(arr); // ["玉兔", "白马", 1, 2, 3, 4, 23]
    console.log(resu); // 7

    // 4.arr.shift(); 可以删除数组的第一个元素,并将被删除的元素作为返回值返回
    var result = arr.shift();
    console.log(arr); // ["白马", 1, 2, 3, 4, 23]
    console.log(result); // 玉兔

2.slice();  可以用来从数组提取指定元素,该方法不会改变原来数组,而是将截取到的元素封装到一个新数组中返回.

参数:

        (1)截取开始的位置的索引,包含开始索引

        (2)截取结束的位置的索引,不包含结束索引 

  • 第二个参数可以省略不写,此时会截取从开始索引往后的所有元素
  • 索引可以传递一个负值,如果传递一个负值,则从后往前计算
    var arr = [1, 2, 3, 4, 5, 6];
    var re = arr.slice(1, 3);
    console.log(re); // [2, 3]
    re = arr.slice(1, -1);
    console.log(re); //  [2, 3, 4, 5]

3.splice(); 删除/插入/替换元素,使用splice()会影响到原数组,会将指定元素从原数组中删除,并将被删除的元素作为返回值返回

参数:

    (1)第一个,表示开始位置的索引

    (2)第二个,表示删除的数量,

    (3)第三个及以后,可以传递—些新的元素,这些元素将会自动插入到开始位置索引前边

  // 1.删除元素
  arr = [1, 2, 3, 4, 5, 6, 7];
  re = arr.splice(1, 3);
  console.log(arr); // [1, 5, 6, 7]
  console.log(re); //  [2, 3, 4]

  // 2.替换元素
  arr = [1, 2, 3, 4, 5, 6, 7];
  arr.splice(1, 2, '八戒', '悟空');
  console.log(arr);  // [1, "八戒", "悟空", 4, 5, 6, 7]

  // 3.插入元素:如果删除的数量为0,则在原来的基础上增加了元素
  arr = [1, 2, 3, 4, 5, 6, 7];
  arr.splice(1, 0, '和尚', '小红');
  console.log(arr); //  [1, "和尚", "小红", 2, 3, 4, 5, 6, 7]

4.concat()可以连接两个或多个数组,并将新的数组返回,该方法不会对原数组产生影响

    var arr1 = ['悟空', '八戒', '和尚'];
    var arr2 = ['lili', 'koko', 'nacy'];
    var arr3 = ['山海经', '西游记', '水浒传'];
    var arr = arr1.concat(arr2); // 连接两个数组
    console.log(arr); // ["悟空", "八戒", "和尚", "lili", "koko", "nacy"]

    var arr0 = arr1.concat(arr2, arr3, '牛魔王'); // 连接三个数组 不仅可以传数组 还可以传元素
    console.log(arr0); // ["悟空", "八戒", "和尚", "lili", "koko", "nacy", "山海经", "西游记", "水浒传", "牛魔王"]

5.join(); 该方法可以将数组转换为一个字符串

  • 该方法不会对原数组产生影响,而是将转换后的字符串作为结果返回
  • 在join()中可以指定一个字符串作为参数,这个字符串将会成为数组中元素的连接符,如果不指定连接符,则默认使用,作为连接符。
    arr1 = ['悟空', '八戒', '和尚'];
    var re = arr1.join(', '); 
    console.log(re); // 悟空, 八戒, 和尚

6.reverse();  该方法用来反转数组,该方法会直接修改原数组

    arr1 = ['悟空', '八戒', '和尚'];
    arr1.reverse();
    console.log(arr1); // ["和尚", "八戒", "悟空"]

7.sort();  可以用来对数组中的元素进行排序,也会影响原数组,默认会按照Unicode编码进行排序 

    arr = [2, 1, 5, 3, 9];
    arr.sort();
    console.log(arr); // [1, 2, 3, 5, 9]

7.1即使对于纯数字的数组,使用sort()排序时,也会按照Unicode编码来排序,所以对数字进排序时,可能会得到错误的结果

    arr = [2, 11, 5, 3, 9];
    arr.sort();
    console.log(arr); //  [11, 2, 3, 5, 9]

7.2可以在sort()添加一个回调函数,来指定排序规则,回调函数中需要定义两个形参a, b,

  • a-b:按从小到大的顺序
  • b-a:按从大到小的顺序
    arr = [2, 11, 5, 3, 9];
    arr.sort(function(a, b) {
      return a - b;
    })
    console.log(arr); //  [2, 3, 5, 9, 11]

三、遍历数组

1.for循环遍历数组

    var arr = [1, 3, 4, 5, 7, 6, 3];
    for (var i = 0; i < arr.length; i++) {
      console.log(arr[i]);  // 1, 3, 4, 5, 7, 6, 3
    }

2.forEach()遍历数组

(1)该方法只支持IE8以上的浏览器

(2)该方法需要一个函数作为参数,像这种函数,由我们创建但是不由我们调用的,我们称为回调函数

(3)数组中有几个元素函数就会执行几次,每次执行时,浏览器会将遍历到的元素以实参的形式传递进来,我们可以来定义形参,来读取这些内容

(4)浏览器会在回调函数中传递三个参数: 

  • 第一个参数,就是当前正在遍历的元素
  • 第二个参数,就是当前正在遍历的元素的索引
  • 第三个参数,就是正在遍历的数组
    var arr = [1, 2, 3, 4, 5, 6];
    arr.forEach(function(value, index, obj) {
      // console.log(value);  1 2 3 4 5 6
      // console.log(index); 0 1 2 3 4 5
      console.log(obj); // [1, 2, 3, 4, 5, 6]
    })

【练习】数组去重

    var arr = [1, 2, 3, 1, 4, 2, 2, 5, 6, 6, 7]; // 去重后:[1, 2, 3, 4, 5, 6, 7]
    var newArr = [];
    for (var i = 0; i < arr.length; i++) {
      var n = arr[i];
      if (newArr.indexOf(n) == -1) { // 判断数组中是否有某个元素 没有就返回-1
        newArr.push(n);
      }
    }
    console.log(newArr); // [1, 2, 3, 4, 5, 6, 7]

四、函数的call()、apply()和bind()

1.在调用call()、apply()和bind()时,可以将一个对象指定为一个参数,此时这个对象将会成为函数执行时的this,都是Funtion.prototype的方法。

2.call()、apply()和bind()的区别:

        (1)call()方法将实参在对象之后依次传递

        (2)apply()方法需要将实参封装到一个数组中统一传递

        (3)和call()方法一样,将实参在对象之后依次传递,不同的是:需要返回函数

    function fun(a, b) {
      // console.log(this);
      console.log('a = :' + a);
      console.log('b = :' + b);
    }
    
    var obj1 = {
      name: "obj1",
      sing: function() {
        console.log(this);       
      }
    }
    var obj2 = {
      name: "obj2"
    }
    // fun.apply(obj1); {name: "obj1", sing: ƒ} 
    obj1.sing.apply(obj2) // {name: "obj2"}

    // 1.call()方法可以将实参在对象之后依次传递
    fun.call(obj1, 1, 2);  // a = :1 b = :2

    // 2.apply()方法需要将实参封装到一个数组中统一传递
    fun.apply(obj1, [1, 2]);  // a = :1 b = :2

    // 3.bind()和call()一样,不同的是需要返回函数
    fun.bind(obj1, 1, 2)(); // a = :1 b = :2

this的情况:

  • 以函数形式调用时,this永远都是window
  • 以方法的形式调用时,this是调用方法的对象
  • 以构造函数的形式调用时,this是新创建的那个对象
  • 使用call和apply调用时,this是指定的那个对象 

五、arguments

1.arguments是一个类数组对象,它也可以通过索引来操作数据,也可以获取长度

2.在调用函数时,我们所传递的实参都会在arguments中保存

3.length表示函数形参个数,arguments.length表示函数传递实参的个数

4.我们即使不定义形参,也可以通过arguments来使用实参,只不过比较麻烦

5.它里边有一个属性叫做callee,这个属性对应一个函数对象,就是当前正在指向的函数的对象

   function fn() {
     console.log(arguments.length);  
     console.log(arguments.callee == fn); // true
   }
   fn(1, 2, 3); // 3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值