Javascript基础Ⅲ

92 阅读5分钟

1.逻辑短路:短路时无法进行运算,则运算无效。

① 逻辑与 &&

    // false && 被短路
    // 根据逻辑与的口诀,找假
    // 左侧为false,右侧就没有必要在进行一次运算,相当于短路
    
    let a = 10;
    let ret = false && ++a;
    console.log(a);     // 返回结果为10

② 逻辑或 ||

    // true || 被短路
    // 根据逻辑或的口诀,找真
    // 左侧为true,右侧就没有必要在进行一次运算,相当于短路
    
    let b = 10;
    let ret1 = true || ++b;
    console.log(b);     // 返回结果为10

2.逻辑运算符的值:比较运算符的返回结果时Boolean值。

① 逻辑与 &&

    // 找真,前面为true,找后面,后面为true就返回后面的值
    
    let ret = 10 && 20;
    console.log(ret);       // 20

② 逻辑或 ||

    // 找假,前面为true,则返回true的值
    
    let ret = 10 || 20;
    console.log(ret);       // 10

3.数组:

① 定义:一组数据有序的集合,“ [ ] ”方括号定义,每个值之间以“ , ”逗号隔开

② 三要素:

· 元素:数组中的每一个数据就是一个元素,元素可以是任何类型

· 下标:元素的序号,从0开始

· 长度: 元素的个数即长度,“ 数组.length ” 可求得数组的长度

③ 数字的添加与删除

· 添加

    let arr = [10, 20, 30]
    
    // 数组.unshift(),在首位添加元素
    arr.unshift(5);
    console.log(arr);       // [5, 10, 20, 30, 40]// 数组.push(),在末尾追加元素
    arr.push(40);
    console.log(arr);       // [10, 20, 30, 40]

· 删除

    let arr1 = [10, 20, 30, 40, 50]    
    
    // 数组.shift(),删除首位元素
    arr1.shift();
    console.log(arr1);      // [20, 30, 40, 50]
​
    // 数组.pop(),删除末尾元素
    arr1.pop();
    console.log(arr1);      // [10, 20, 30, 40]

· 即能指定添加又能指定删除

    // 数组.splice(起始下标, 删除个数, 新元素, 新元素...)
    let arr = [10, 20, 30, 40, 50]
     
    // 从第二个元素开始,删除2个元素
    arr.splice(1, 2);
​
    // 从第二个元素开始,删除后面所有元素
    arr.splice(1);
​
    // 从第二个元素开始,删除两个,再追加4个元素
    arr.splice(1, 2, 'a', 'b', 'c', 'd');
​
    // 从第二个元素开始,添加4个元素
    // * 注意:添加元素也需要把删除个数写上
    arr.splice(1, 0, 'a', 'b', 'c', 'd');

4.数组的遍历:访问数组中的每一个元素,直到找到要提取的元素。

    let arr = ['zhangsan', 'lisa', 'rose', 'jack', 'qingqi', 10, 20, 30, 40, 50, 600];
    
    // 使用for循环控制变量来模拟数组的下标
    // 遍历每一个数组中的元素
    for (let i = 0; i < arr.length; i++) {
        console.log(arr[i]);    // 返回结果为数组的每一个元素
    }

5.数组的坍塌

// 数组塌陷的解决方法:案例,删除元素为0的数值

let arr = [5, 12, 0, 8, 11, 0, 0, 0, 9, 0, 15, 20];

// 方法一:
// 数组遍历中的删除原理:被删除后的数组将重新排序,下标发生变化,导致相邻的两个相同的数字,会有一个被跳过执行
for (let i = 0; i < arr.length; i++) {
    if (arr[i] == 0) {
        arr.splice(i, 1);
        i--;              // 使数组下标不会跳过任何一个数值
    }
}

console.log(arr);

// 方法二
// 将i++改为i--,数组长度-1,使数组下标不会跳过任何数值执行
for (let i = arr.length-1; i >= 0; i--) {
    if (arr[i] == 0) {
        arr.splice(i, 1);
    }
}

console.log(arr);
    

6.函数:function 函数名() {}

函数用于存储代码,而变量用于存储数据

② 一次封装,可以多处调用

    // 函数的定义
    function 函数名(变量名) {
        函数体;
    }
​
    // 必须调用函数,函数体中的代码才会生效
    // * 函数在调用时按调用顺序输出
    函数名(值);

形参与实参:在函数体中访问值

· 形参多于实参时,多出的变量返回结果为undefined

· 在函数体外访问形参会报错,所以只能在函数体内部访问

· 参数可以是任何类型(Boolean / String / Number)

    // 写在括号内的变量名为形参
    function 函数名(变量名) {
        函数体;
    }
​
    // 调用时,括号内的值为实参,这个值可以是具体值也可以是变量名
    // 实参传递值给形参,函数体会自动进行运算,调用时生效
    函数名(值);
​
​
    // 举例说明:
    function fn(x, y) {
        let ret = x + y;
        console.log(ret);
    }
​
    fn(100, 200);       // 相当于let x = 100, y = 200;返回结果是两数之和:300
    let n = 10;
    fn(n, 20);      // 相当于let x = n = 10, y = 20;返回结果为两数之和:30

④ 在函数体外部访问值:

· return返回值

    // return 将函数内部的数据返回到函数外部
    function fn () {
        let a = 'hello';
        return a;
    }
​
    // 调用函数时必须声明变量接受return的结果,才能在外部访问到函数体的值
    let ret = fn();
    console.log(ret);       // 返回结果为:hello

· 函数中遇到return时会中断代码执行

· return后可以是不同类型的数据:number、string、boolean、undefined、null、array等,如果不写数据即是中断

· return只能返回一个值,如果想返回多个数据,可以返回数组类型

// @param1 array  参数1 数组
// @param2      参数2
// @return boolean  返回布尔值

7.函数中的作用域

① 全局作用域:在函数之外就是全局。

全局变量:在全局定义的变量

  • 全局变量访问不受限制

② 局部作用域:在函数内部就是局部。

局部变量:在局部定义的变量

  • 局部变量只能被局部访问

③ 块级作用域:只要语法中具有{}的都是块级作用域

  • 只影响let声明的变量,不影响var声明的变量
  • var与let在块级作用域的区别
    {
        // 花括号包裹的就是块级作用域
        let x = 10;
        var y = 20;
    }
​
    console.log(x);     // 会报错
    console.log(y);     // 正常返回20
    // var与let,先输出后定义的差别
​
    console.log(n);     // 报错
    let n = 10;
​
​
    console.log(m);     // undefined
    var m = 20;
​
    // 在定义变量时,不使用定义变量关键字定义,默认时var,但不建议使用
    age = 20;
    console.log(age);       // 正常输出:20

④ 作用域链以及链式查找方式

  • 作用域链:由嵌套的作用域形成的作用链
  • 链式查找:当某个作用域内使用一个变量时,如果这个变量不存在,会向上一级作用域查找
    // 链式查找:向上一级查找变量,不会向内查找
    let a = 10;
    function fn() {
        console.log(a);     // 10
​
        let a = 20;
        function fn1() {
            console.log(a);     // 20
​
            let a = 30;
            function fn2() {
                console.log(a);     // 30
            }
            fn2();
        }
        fn1();
    }
    fn();