流程控制-循环
- while() 循环-入口判断型
入口判断既是从代码开始执行到 while 的时候就开始判断条件是否成立,成立就开始执行代码。
const arr = [11, 22, 33, 44, 55];
// 打印数组arr的长度
console.log(arr.length);
// 循环变量初始化
let i = 0;
while (i < arr.length) {
// 条件符合输出i在数组中对应的数字
console.log(arr[i]);
// 必须加条件,如递增或递减,否则会死循环
// 递增1 一下三种方法都能达到同一个目的
// i = i + 1;
// i += 1;
// 用完自增
i++;
}
do-while() 循环-出口判断型
出口判断型既是先执行条件成立的代码,到出口在判断条件是否成立,成立就输出或执行特定操作,不成立程序就终止。
出口判断型,至少执行一次代码.
const arr = [11, 22, 33, 44, 55];
let i = 0;
do {
console.log(arr[i]);
i += 1;
} while (i > arr.length);
// 最后输出的i由i = 多少决定,但程序至少执行一次
- for(循环变量的初始化,循环条件,更新循环条件){….}
语法:for(循环变量的初始化,循环条件,更新循环条件){….}
循环变量的初始化==》也就跟第一次赋值给一个变量一样。
循环条件==》条件成立时继续执行的条件
更新循环条件==》对循环条件的更新,可以理解为递增或递减等操作。
const arr = [11, 22, 33, 44, 55];
for (let i = 0; i < arr.length; i++) {
// 只输出前三个成员
if (i < 3) {
console.log(arr[i]);
// 如果i>3就跳出循环
if (i >= 3) break;
// continue:条件符合就跳过此次循环,执行下一次循环。
// 这里我们只要奇数,就跳过所有能被2整除的循环
if (arr[i] % 2 === 0) continue;
console.log(arr[i]);
}
}
PS:1.
continue
:是跳过本次条件成立是执行的循环的过程,而执行下一次条件成立的过程,如果下一次条件也成立,那再跳过,循环操作。
- for in() 循环
语法
for(键名/属性 in 对象)
键名可以理解为自己创建的一个新的属性,可以初始化也可以不初始化,哪怕没有这个变量,也可以直接生成。for(num in 对象)
之前没有创建过 num 这样的一个属性,是一个新属性,当然也可以初始化,如for(let num in 对象)
const user = {
name: "GGG",
email: "12346@666.com",
price: 888,
};
// 也可以for(let num in user)
for (num in user) {
console.log(num); //输出属性名
console.log(num, user[num]); //输出属性名和对应属性值
}
流程控制 - 遍历
- forEach() - 遍历对象
语法:
array.forEach(function (值, 索引, 数组) {});
只有第一个值
是必要的,其他几个都是可选的
不能自定义遍历
// 创建一个数组
const arr = [11, 22, 33, 44, 55];
arr.forEach(function (item, key, arr) {
console.log(item, key, arr);
});
下面是关于所有情况的介绍,function 中的参数均用拼音代理,方便理解
- for - of :ES6 新增的遍历 - 直接取出数组的值
用法和
for - in
一致,但是比它简单,因为 for - of 是用来遍历,直接取出数组中的值
const arr = [11, 22, 33, 44, 55];
for (num of arr) {
//num 数组中的某一个成员
console.log(num);
}
函数
- 函数的声明
// function声明函数,demo1位函数名称,()内的参数为函数的参数,{函数语句}
// function 函数名(参数){语句}
function demo1(name) {
console.log("此时的函数名为:", demo1.name);
}
- 函数的调用
了解下函数的参数,函数的参数类似一个变量,可以是一个常量,也可以是一个变量名,因为后续如果那里需要调用的话,可能会进行传参的操作
- 函数调用模式
函数调用形式是最常见的形式,也是最好理解的形式。所谓函数形式就是一般声明函数后直接调用即是。
demo1();
即完成了一次函数的调用操作。
// 声明一个函数,并调用
function func() {
alert("Hello World");
}
func();
- 方法调用模式
共有散 3 步:1.创建一个函数,2.将这个函数赋值给一个对象,3.调用
值得注意的是,将函数赋值给对象之后,最后里面的
fn.funct
变成了方法,而不是函数。
// 1.创建一个函数
function func(){
alert("我是一个函数!")
}
// 2.将这个函数赋值给其他对象
let fn = {};//也是将函数赋值给对象fn
fn.funct = func;//注意这里没有 `()` 这里变成了方法
// 3.调用
fn.funct();
// --------------------------------------------------
// 上面代码的简化
function func(){
alert("我是一个函数!")
}
let fn = {};
fns = func; // 这里变成了方法
func();
fns();
- 其他调用方法可参考:https://www.jb51.net/article/49230.htm
- 函数的参数
通过提前内置一个参数,最后对参数传值调用。
function demo2(name) {
console.log("函数内的参数内容是:", name); //调用参数
}
// 传参
demo2("是内容啊!");
...rest
将剩余参数全部打包到一个数组之中。
利用函数配合数组遍历实现一个累加器。
function num(...arrname) {
//数组名
// 累加器初始化0;
let sum = 0;
for (let v of arrname) {
sum += v; //实现累加v值
} //数组名
console.log("累加结果为:", sum);
}
// 给数组传参:
num(1, 2);
num(1, 2, 3);
num(1, 2, 3, 4, 5, 6, 7, 8, 9);
...spread
展开运算符
通过接口, 外部请求, 或其它来源,接收到一个数组
function sum(...data) {
let res = 0;
for (let v of data) {
res += v;
}
console.log("resule = ", res);
}
let num = [11, 22, 33, 44, 55];
sum(...num);
输出结果:result = 165
- 函数的返回值
// 单值原则: 函数只能返回一个值
function demo3() {
return "HELLO WORLD!";
}
console.log(demo3());
// 输出HELLO WORLD
多值返回,就必须要使用:引用类型, 对象,数组
function demo3() {
return [
{ id: 1, name: "admin" },
{ id: 2, name: "GGG" },
];
}
console.log(demo3()[1]);
// 输出 {id: 2, name: "GGG"}
- 函数表达式
当成匿名函数,用在回调方法
匿名函数,没有名字,通过把它赋值给一个变量
,来引用它
let demo4 = function demo3() {};
console.log(typeof demo4);
- 箭头函数: es6 才有,简化”函数表达式”
箭头函数:是函数表达式的简化,也可以理解为是匿名函数的简化操作,它通过
=>
来说明
删除了function
参数列表()
与大括号{}
之间添加一个”=>”
演示语法:demo5 = (name) => {}
PS:箭头函数不能引用 this
单行函数可以省略{}
但是多行代码,函数体的大括号{}
不能省略。
如果没有参数,也必须加上一对”()”
// 单行演示
demo5 = (user) => console.log("单行省略了大括号");
// 多行演示
demo6 = (user) => {
let name = "GGG";
console.log("welcome:", name);
};
// 省略了参数,但是一定要写()的实例
demo8 = () => console.log("这里省略的是:()");
// 传参演示:
demo7 = (name) => console.log("Welcome:", name);
demo5("");
demo6();
demo7("这是name");
demo8();
获取 dom 元素并执行操作
dom: document object model
,文档对象模型,只要是对象,就可以有属性和方法,使用这种方式取出来的为一个HTMLAllCollection: 类数组
也就说说,typeof
查看类型之后为HTMLALLCollection
>
- 根据
tag
class
id
标签来获取 dom 元素getElementsByTagName
来获取元素的标签名
,获取到 dom 元素getElementsById
来获取元素的id名
,获取到 dom 元素getElementsByClassName
来获取元素的类名称
,获取到 dom 元素。getElementsByName
来获取某个元素的name
值,获取到 dom 元素。
接下来一一演示怎么操作:innerHTML: 返回元素中的内容
语法:
变量或方法或对象 = document.getElementsByTagName/Id/ClassName("id/tag/class名称")
<ul id="list">
<li class="item" name="first">item1</li>
<li class="item">item2</li>
<li class="item">item3</li>
<li class="item active">item4</li>
<li class="item">item5</li>
</ul>
console.log("--------通过ID--------");
// 通过ID取值
let him = document.getElementById("list");
console.log(him.innerHTML);
console.log("--------通过标签--------");
// 通过标签取值
let lis = document.getElementsByTagName("li");
console.log(lis);
console.log(lis[2].innerHTML); //输出为item3
console.log("--------通过Class--------");
// 通过class取值
let sggh = document.getElementsByClassName("item");
console.log(sggh);
// 通过name取值
let nme = document.getElementsByName("first")
console.log(nme)
- jQuery: \$(selector)
selector: 使用选择器来获取(类似于 CSS 选择器,可以使用伪类等)
语法:和上述方法一致,但是这里不再是使用getElementsBY..
的方式来获取 dom 元素,而是使用>querySelector(#id/.class/tag)
等方式来获取
console.log("-------通过ID--------");
// 通过id取值
ul = document.querySelector("#list");
console.log(ul);
console.log("-------通过Class--------");
// 通过class来取值
lis = document.querySelector(".list");
console.log(list);
console.log("-------通过Tag--------");
// 通过标签来取值
// PS: querySelector 选择器只会选择符合条件的集合之中的第一个元素
lisy = document.querySelector("li");
console.log(lisy);
// 所以要选择所有的子元素li就需要用到 querySelectorAll 来选择所有的子元素
lisu = document.querySelectorAll("li");
console.log(lisu);
console.log("-------使用伪类选择前三个--------");
// 使用CSS伪类来选择前三个子元素
abc = document.querySelectorAll("li:nth-of-type(-n+3)");
console.log(abc);
遍历元素节点
<ul>
<li>item1</li>
<li>item2</li>
<li>item3</li>
<li>item4</li>
<li>item5</li>
</ul>
所谓遍历元素节点最常见就是遍历父节点、兄弟节点和子节点,如下图
- 遍历子元素
// 遍历:父元素 兄弟元素 子元素
const ul = document.querySelector("ul");
// 1.遍历子元素
// children:所有子元素组成的合集
console.log(ul.children);
// 查看子元素的数量
console.log("子元素的数量共有:", ul.children.length);
// childElementCount也是计算共有多少个子元素的方法 要记住了
console.log("子元素的数量共有:", ul.childElementCount);
// 获取某个位置的元素
// 111.可以通过使用children[索引]来实现
console.log("获取的第三个子元素内容是:", ul.children[2].innerHTML);
// 获取第一个子元素还可以通过firstElementChild来实现
console.log("获取到的第一个子元素内容是", ul.firstElementChild.innerHTML);
// 获取最后一个子元素还可以通过lastElementChild来实现
console.log("获取到的最后一个子元素内容", ul.lastElementChild.innerHTML);
通过 for of 来实现遍历的话,要将类数组转换为数组
for (let v of ul.children) {
console.log(v);
}
// 将类数组转为真正的数组: Array.from()
console.log(Array.from(ul.children));
- 遍历兄弟元素
遍历兄弟元素之间的话,就需要先拿到一个子元素,然后通过我们拿到的这个子元素来对前一个兄弟元素和后一个兄弟元素遍历获取。
语法:
前一个兄弟元素:previousElementSibling
后一个兄弟元素:nextElementSibling
// 先拿一个子元素
const ul = document.querySelector("ul");
console.log("我是被拿的子元素:", ul.children[2].innerHTML);
// 拿第三个子元素的上一个子元素的内容item2
console.log("这是我的哥哥:", ul.children[2].previousElementSibling.innerHTML);
// 拿下一个子元素
console.log("这是我的弟弟:", ul.children[2].nextElementSibling.innerHTML);
- 遍历父元素
语法:
prentElement
或parentNode
都可以实现
const li = document.querySelector("li");
console.log("这是我的父元素:", li.parentElement);
console.log(li.parentNode);
classList 对象:操作 class
通过 classList 可以给 html 标签代码(获取到的 dom 元素)增加类或删除类。
const p = document.querySelector("p");
// 给p标签增加blue属性
p.classList = "blue";
p.classList = "red blue"
简化操作:p.classList.add("要增加的类名)
p.classList.remove("要移除的类名)
自动切换:有这个类就去掉, 没有就加上p.classList.toggle("类名")
dataset 对象: 处理用户自定义数据属性
data-:为前缀的数据,称为数据属性,使用 dataset 对象来获取,获取时请省略掉”data-“
将使用连接线命名的多个单词的属性名,转换”驼峰命名法”来获取<div id="user" data-id="110" data-user-name="admin" data-email="admin@qq.com">我的信息</div>
// 获取id = user的dom属性
const user = document.querySelector("#user");
console.log(user.dataset.userName); //忽略 data-
user.dataset.email = "123456@qq.com";// 重定义data-email的值
console.log(user.dataset.email);