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();