批改状态:合格
老师批语:非常认真, 案例也清楚
入口判断既是从代码开始执行到 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(循环变量的初始化,循环条件,更新循环条件){….}
循环变量的初始化==》也就跟第一次赋值给一个变量一样。
循环条件==》条件成立时继续执行的条件
更新循环条件==》对循环条件的更新,可以理解为递增或递减等操作。
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(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]); //输出属性名和对应属性值}

语法:
array.forEach(function (值, 索引, 数组) {});
只有第一个值是必要的,其他几个都是可选的
不能自定义遍历
// 创建一个数组const arr = [11, 22, 33, 44, 55];arr.forEach(function (item, key, arr) {console.log(item, key, arr);});
下面是关于所有情况的介绍,function 中的参数均用拼音代理,方便理解


用法和
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 = {};//也是将函数赋值给对象fnfn.funct = func;//注意这里没有 `()` 这里变成了方法// 3.调用fn.funct();// --------------------------------------------------// 上面代码的简化function func(){alert("我是一个函数!")}let fn = {};fns = func; // 这里变成了方法func();fns();

通过提前内置一个参数,最后对参数传值调用。
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);
箭头函数:是函数表达式的简化,也可以理解为是匿名函数的简化操作,它通过
=>来说明
删除了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: 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); //输出为item3console.log("--------通过Class--------");// 通过class取值let sggh = document.getElementsByClassName("item");console.log(sggh);// 通过name取值let nme = document.getElementsByName("first")console.log(nme)

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);// 拿第三个子元素的上一个子元素的内容item2console.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 可以给 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("类名")
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);

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号