一、不定参

定参:函数的参数固定。(一般不超过4个)

  •         不定参:函数的参数是不固定。(理论可以有无数个)

  •         不定参的函数如何封装。
  •         列如:console.log(1, 2, 3, 4...);
  • arguments是一个数组.(argments[不定参])
  • arguments存储着所有的实参.
console.log(arguments);
// 实参的个数
    console.log(arguments.length)
myLog(1, 2, 3);
    myLog('我', '你', '它', '她', '他');

    function myLog() {

      // arguments不需要声明,默认就存在.
      // 注意: 函数外面无法使用arguments

      // 循环arguments,访问所有的实参.
      for (let i = 0; i < arguments.length; i++) {
        console.log(arguments[i]);
      }
    }

    // 报错,函数外面无法使用arguments
    // alert(arguments);
// 不管是不是不定参函数,都可以使用arguments.
    function fn () {
      return arguments[0] * arguments[1]
    }

    let num1 = fn (1, 2);
    let num2 = fn (5, 4);

二、ES6的不定参 

  • arguments => ES5的不定参 (名字固定) (伪数组)
  • rest参数 => ES6的不定参 (名字任意设置) (数组)
<script>

    myLog(1, 2, 3);
    myLog('我', '你', '它', '她', '他');

    function myLog (...args) {
      // 实参列表
      // console.log('args', args);
      // 实参个数
      // console.log('length', args.length);

      for (let i = 0; i < args.length; i++) {
        console.log(args[i]);
      }
    }

  </script>

三、封装不定参 

<script>

    // arguments
    // ...args

    // 封装一个fn函数, 实现把所有实参求和后返回.

    let num1 = fn (1, 231, 34, 124, 67, 867, 897890, 7890);
    let num2 = fn (3, 2311, 342, 1242);

    function fn () {
      // 结果
      let num = 0;
      // 循环把所有的实参都加到num上
      for (let i = 0; i < arguments.length; i++) {
        num += arguments[i]
      }
      // 把结果返回到函数外面
      return num
    }
    
  </script>

四、封装一次就够

相同的逻辑 => 封装一个函数就够了.
函数的作用 => 函数表示一个功能,这个功能可以重复使用.
同一个函数可以调用多次.(使用多次).

<script>

    let num1 = fn1 (1, 231, 34, 124, 67, 867, 897890, 7890);
    let num2 = fn2 (3, 2311, 342, 1242);!

    function fn1 () {
      // 结果
      let num = 0;
      // 循环把所有的实参都加到num上
      for (let i = 0; i < arguments.length; i++) {
        num += arguments[i]
      }
      // 把结果返回到函数外面
      return num
    }

    function fn2 () {
      // 结果
      let num = 0;
      // 循环把所有的实参都加到num上
      for (let i = 0; i < arguments.length; i++) {
        num += arguments[i]
      }
      // 把结果返回到函数外面
      return num
    }
    
  </script>

五、返回的变量不应该再函数外面 

 arguments

     ...args

     封装一个fn函数, 实现把所有实参求和后返回.

    返回的num, 应该是每次调用的时候都初识为0,因此不能写在函数外面.

<script>

    let num = 0;

    let x = fn (1, 2, 3); // x === 6
    let y = fn (1, 2, 3, 4);// y === 10

    function fn () {     
      // 循环把所有的实参都加到num上
      for (let i = 0; i < arguments.length; i++) {
        num += arguments[i]
      }
      // 把结果返回到函数外面
      return num
    } 

  </script>

以上函数的执行分析步骤。

  1.      x = fn (1, 2, 3);
  2.      x = num => (1 + 2 + 3); num === 6
  3.      y = fn (1, 2, 3, 4);
  4.      y = num (6 + 1 + 2 + 3 + 4); num === 16

六、return会终止函数执行 

<script>

    // return 执行后,整个函数会强制结束.

    let num1 = fn (1, 2, 3, 4);// 1

    function fn () {
      // 结果
      let num = 0;
      // 循环把所有的实参都加到num上
      for (let i = 0; i < arguments.length; i++) {
        num += arguments[i];
      }
      // 把结果返回到函数外面
      return num
    }
    
  </script>

七、可选参和必填参 

  • 必填参 => 必填的参数
  • 可选参 => 可以填也可以不填的参数
// querySelectorAll唯一的参数是必填参数,不填报错.
let oDiv = document.querySelectorAll('div');
// alert的唯一参数是可选参数.
   alert();

函数的参数应该是必填的还是可选的?

没有一定的.只取决于写函数的人如何定义.

// 默认情况下,所有的参数都是可选的。
     function fn (x) {
       console.log(x);
     }

     fn();
// 通过一些逻辑判断来设置一个必填参数.
    function fn (x) {
      // 如果没有给x传递实参。
      if (x === undefined) {
        let err = new Error('你要传递x参数,x参数是必填的');
        console.error(err);
      } else {
        console.log(x);
      }
    }

    fn();

八、参数的默认值 

  • 对于可选参, 如果希望在不传递实参时,可选参等于一个默认值,怎么做? 
function fn (x) {
     // 如果x没有值,就把它变成10.
      if (x === undefined) {
        x = 10;
      }
      console.log(x);
    }

    fn();
    fn(100);

ES6默认参数的写法.

     如果没有传递参数,x默认是10.

     如果传递成参数,x的值就以传递的参数为准.

function fn (x = 10) {
      console.log(x);
    }

    fn();
    fn(100);

九、JS内置对象 

内置对象 => js本身就有的对象.(例如: window,document);

    常用的内置对象.

  1.      数学
  2.      日期对象
  3.      字符串对象
  4.      数组对象 (最常用)
  5.      正则对象 (很难)

    学习内置对象,需要关注这个内置对象有什么属性,有什么方法.

    如何学习属性 => 知道这个属性有什么用就可以了.

    如何学习对象的方法 => 

  1.      这个方法有什么用.
  2.      参数是什么,有多少个,那些是可选的,那些是必填的,数据类型是什么.(参数的细节)
  3.      这个方法返回什么.
  4.      语法.方法的书写形式.

    对象:

  1.      属性
  2.      方法

十、数学对象 

// 数学对象 => 处理一些数学问题.求幂,求绝对值问题,求随机数问题,求四舍五入问题

     console.log(Math);

    // 圆周率π

     console.log(Math.PI);


// s是面积.10是圆的半径
    let s = fn(10);

    function fn (r) {
      return Math.PI * r * r
    }
    
    // 求绝对值。
    let n = Math.abs(-10);

十一、数学方法 

<script>

    // 向下取整
    let num1 = Math.floor(1.9);
    console.log(num1);

    // 向上取整
    let num2 = Math.ceil(1.9);
    console.log(num2);

    // 四舍五入
    let num3 = Math.round(1.9);
    console.log(num3);

    // 求幂 => 求xxx的几次放. 平方 => 2次幂, 立方 => 3次幂
    let num4 = Math.pow(2, 2);

    // 求2的平方根. 2的10次方幂是1024 则1024的10次方根就是2
    let num5 = Math.sqrt(2);

    // 求27的立方根.
    let num6 = Math.cbrt(27);

    // 找最大值
    let max = Math.max(1,3246,534,56,56,767,8,689,8,9890,9823);

    // 数组内有多个数组,如何找到arr中最大的数.
    let arr = [1,3246,534,56,56,767,8,689,8,9890,9823];

    // ES6的暂开运算符可以把数组的所有元素作为实参放入函数中.
    let max1 = Math.max(...arr);
    // ES5的写法.
    let max2 = Math.max.apply(Math, arr);
    // ES5从一个数组中找最小的数
    let min2 = Math.min.apply(Math, arr);

    // 找最小值
    let min = Math.min(1,3246,534,56,56,767,8,689,8,9890,9823);
  </script>

十二、随机数 

<script>

    // 返回0-1之间的随机小数。(可以随机到0,不能随机到1);
    let num = Math.random();

    // 0 - 10的随机数 (可以随到0,但是随机不到10)
    let num1 = Math.random() * 10;

    // 把随机数取整,因为向下取整,因此最大只能取到9
    let num2 = Math.floor(num1);

    // 2-8的随机整数
    // 先取0-6的随机整数,然后再+2.

    // 取0-7之间的随机数
    let num3 = Math.random() * 7;

    // 向下取整后加2.
    let num4 = Math.floor(Math.random() * 7) + 2;

    // 封装一个获取任意两个整数之间的随机整数的函数.

    // 获取4-100之间的随机整数
    let num5 = getRandom(0, 255);

    // 封装。
    function getRandom(a, b) {
      return Math.floor(Math.random() * (b - a) + 1) + a
    }

  </script>

十三、数组方法 

let arr = [11, 22, 33];

     arr[3] = 44;
    // 在最后面插入一个元素。
    // 把数组的第四个元素变成arr.push(55)的返回值
     arr.push(55);
     arr.push(44);

    // 在数组的最前面插入一个0.
     arr.unshift(0);

    // 删除最后面的元素
     arr.pop();

    // 删除最前面的元素
     arr.shift();

     splice => 任意位置加,任意位置删

     splice(要删除的元素的下标(要插入的元素的下标), 要删除的元素个数, 要替换的元素的值 )

// 任意位置添加元素,任意位置删除元素.
     arr.splice(1, 0,'小陈');

    // 删除第二个元素
     arr.splice(1, 1);

    // 用splice实现push的写法
    arr.splice(3, 0, 44);

十四、数组方法查找元素 

let arr = [1,1,2,3,4,5,6,7];

    // 这个数组中有没有元素10

    // arr.includes(10) => 返回布尔值,如果arr中包含10,就返回true,否则返回false
    if (arr.includes(10)) {
      alert('有')
    } else {
      alert('没有')
    }
let arr = [1,1,2,3,4,5,6,7];

    
    // arr.indexOf(10) => 返回查找元素的下标。如果没有指定元素,返回-1
    if (arr.indexOf(10) !== -1) {
      alert('有');
    } else {
      alert('没有');
    }
let arr = [1,1,2,3,4,5,6,7];

    // 假设没有10e
     let flag = false;

    for (let i = 0;i < arr.length; i++) {
      if (arr[i] === 10) {
        flag = true;
        break;
      }
    }

    if (flag) {
      alert('有')
    } else {
      alert('没有')
    }

十五、数组的其他方法 

let arr1 = [1, 2, 3, 100];
    let arr2 = [4, 5, 6];
// 利用es6的展开运算符进行拼接
    let arr3 = [...arr1, ...arr2];
// 123在前
    let arr3 = arr1.concat(arr2);
// 456在后
    let arr3 = arr2.concat(arr1);
// 所有元素倒序
    arr1.reverse();
// 把数组转换成字符串.
    let arr = ['我', '喜欢', '你'];

    let str = '';
    for (let i = 0; i < arr.length; i++) {
      str += arr[i];
    }
// 把数组里面的元素拼接成字符串.
    let str = arr.join('');
// 没参数,默认用,连接各个元素
    let str = arr.join();
// 指定用 - 连接各个元素
    let str = arr.join('-');
// 把arr1中的1和2提取出来,再和arr2进行拼接.(不会修改原数组)
    // 第一个参数是开始下标, 第二个参数是结束位置的下标.(包头不包尾)
    let arr3 = arr1.slice(0,2).concat(arr2);
// 把arr1中的2和3提取出来.在拼接.
    let arr3 = arr1.slice(1,3).concat(arr2);
// 把第二个元素和第二个元素之后的所有元素都提取出来,再拼接.
    let arr3 = arr1.slice(1).concat(arr2);

十六、字符串方法 

  • 字符串类型不是object类型.但是字符串可以拥有一些方法.
  • 很多时候可以把字符串当成数组处理. => 字符串可以使用length和下标
let str = '爱上了得到';


// 如何判断一个字符串内有多少个字符?
    console.log(str.length);
let str = '爱上了得到';

    // 如何知道字符串的第二个字符是什么?
    console.log(str[1]);
let str = '爱上了得到';

    // 如何知道字符串内有没有'钱'这个字符串
    if (str.includes('钱')) {
      alert('有')
    } else {
      alert('没有')
    }
let str = '爱上了得到'
    // 如何知道字符串内有没有'钱'这个字符串
    if (str.indexOf('钱') !== -1) {
      alert('有');
    } else {
      alert('没有');
    }
let str = '爱上了得到';

// 提取字符串。参数和数组的slice方法一样。
    let msg = str.slice(0, 3);
let str = '爱上了得到';
    // 参数是负数,需要转换成正的再截取.
    // 负数需要和字符串的length相加.
    // -1 获取的是最后一个字符.
    let msg = str.slice(-1); // 到
let str = '爱上了得到';

// 参数和数组的slice方法一样。
    let msg = str.substring(1, 3);
let str = '爱上了得到';

    // 第一个参数表示开始下标, 第二个参数表示截取的字符个数.
    let msg = str.substr(1, 4);

十七、字符串方法 

  • 字符串的所有方法都不会修改字符串本身。都需要重新赋值,原字符串才会变。 

字符串变大、变小 

let str = 'abc';
    // 变大写.
    str = str.toUpperCase();
    // 变小写.
    str = str.toLowerCase();

 字符串其中一个边大写

str = 'ab' + 'C';

    // 只有C变大写
    str = 'ab' + 'c'.toUpperCase();
// 截取最后一个字符之前的所有字符 + 最后一个字符的大写。
    str = str.slice(0,-1) + str.slice(-1).toUpperCase();
str = 'a' + 'B' + 'c';
    str = str.slice(0, 1) + str[1].toUpperCase() + str.slice(2);

    // 封装一个函数, 把指定的字符串的最后一个字符变大写.

十八、字符串的转数组 

let str = '你爱我';

    // 转换为数组.
    // split() => 参数表示不要放进数组的字符串.
    let arr = str.split('');
// 数组倒序
    arr.reverse();
// 在把倒序后的字符串赋值给str.
    str = arr.join('');
  •     str.split('') => 每个字符串作为单独的元素放入数组
  •     str.split('-') => 把-删掉后的其他字符放入数组.
  •     str.split() => 整个字符作为唯一的元素放入数组.