第03章-前端核心技术-JavaScript数组

第03章-前端核心技术-JavaScript数组

学习目标
掌握JavaScript数组的申明和初始化
掌握JavaScript数组遍历的方法 重点
掌握JavaScript数组增删改查的方法 重点 难点
掌握JavaScript数组的内置函数 重点
掌握JavaScript函数的高级运用

JavaScript数组

什么是数组?
数组是使用单独的变量名来存储一系列的多个值。如:可以用数组来保存一个会员用户的用户名、帐号、密码、电话号码等等。
创建数组
创建一个数组,有2种方法

使用new Array(“张三”,“zhangshan”)创建数组

//创建名字为user的数组,里面有四个值

var user = new Array("张三","zhangshan","123456","13594876584");
//或者
var user = new Array();
user[0] = "张三";
user[1] = "zhangshan";
user[2] = "123456";
user[3] = "13594876584";
使用方括号var user = [“张三”,“zhangshan”]
1```
2
//创建名字为user的数组,里面有四个值

var user = ["张三","zhangshan","123456","13594876584"];

数组存储
栈内存 - 用于存储局部变量,数据使用完(程序退出局部变量作用域后),所占内存自动释放。
堆内存 - 用于存储数组和对象,通过new建立的实例都存放在堆内存中。





普通变量和数组的保存方式不同,如下图:



访问数组元素
通过指定数组名以及索引号码,可以访问某个特定的元素,如:[0] 是数组的第一个元素。[1] 是数组的第二个元素

//创建名字为user的数组,里面有四个值

var user = new Array("张三","zhangshan","123456","13594876584");

//访问数组很简单,只需要使用方括号加下标

alert(user[0]); //会弹窗输出“张三”
//修改数组值
user[0] = "李四";//把数组中第1个元素的值修改为“李四”

user[1] = "lisi";//把数组中第2个元素的值修改为“lisi”

user[2] = "789";//把数组中第3个元素的值修改为“789”

user[3] = "13569845684";//把数组中第4个元素的值修改为“13569845684”

数组遍历
数组的遍历通常使用for循环,for循环 for / in简写的循环。通过数组的length属性获取数组的长度

//创建名字为user的数组,里面有四个值

var user = new Array("张三","zhangshan","123456","13594876584");
for (var i in user) {

document.write(user[i]+"
");

}
//user.length:获取User数组的长度(个数)

for (var i=0;i<user.length;i++) {

document.write(user[i]+"
");

}

删除数组元素
数组的长度在数组被初始化的时候确定,如需删除数组中的元素,应该把需要删除的元素移到数组的末尾,然后将数组的长度减1
 
案例01
```` 效果:

如需删除中间的元素,需要把该元素后面的所以元素往前移动一个位置,然后将数组长度减1。
案例02

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="text/javascript">
		//创建一个空的数组
		$num = new Array();
		//用循环给数组初始化10个数据(1···10)
		for (i = 0;i < 10;$ i++) {
			$num[i] = i + 1;
		}
		//删除第3个数,需要把第3个数后面的数全部往前移动一位
		for(i = 2,temp = 0;i < 10;i++){
			$num[i] = num[i+1];
		}
		$num.length = 9;
		//输出显示删除后的结果
		for($a in $num){
			document.write($num[$a]+"&nbsp;");
		}
	</script>
</html>

效果:

添加数组元素
如果是在数组末尾添加数组元素,操作很简单,只需要增加一个下标就可以了
案例03

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="text/javascript">
		//创建一个空的数组
		num = new Array();
		//用循环给数组初始化10个数据(1···10)
		for (i = 0;i < 10;i++) {
			num[i] = i + 1;
		}
		//在数组末尾添加一个数据
		num[10] = 100;
		//输出显示删除后的结果
		for(a in num){
			document.write(num[a]+"&nbsp;");
		}
	</script>
</html>

效果:

如果要在数组中间插入数据,那就需要使用循环,从需要加入数据的位置开始,讲后面的数据往后移动一位,然后在该位置上插入数据。
案例04

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="text/javascript">
		//创建一个空的数组
		num = new Array();
		//用循环给数组初始化10个数据(1···10)
		for (i = 0;i < 10;i++) {
			num[i] = i + 1;
		}
		//在数组第5个位置添加一个数据
		for (i = 10;i > 5;i--) {
			num[i] = i - 1;
		}
		num[4] = 500;
		//输出显示删除后的结果
		for(a in num){
			document.write(num[a]+"&nbsp;");
		}
	</script>
</html>

效果:

添加元素
如果需要向 HTML 中添加新元素,那么首先便需要创建该元素,然后向已存在的元素追加创建的新元素。
document.createElement() 方法用来创建新的 Element 节点和 Text 节点,而方法 node.appendChild() 可以用来将创建好的元素添加到一个文档,其具体实现方法如下。

 <div id="my_div">
</div>
<script>
    var element = document.createElement("p");
    element.append("这是段落");
    document.getElementById("my_div").appendChild(element);
</script>

修改元素
修改元素包含三个部分的内容:修改元素内容、修改元素属性和修改元素样式。
 ①修改元素的内容
修改元素内容的最简单方法便是使用 innerHTML 属性,使用该属性可以对元素的内容重新赋值,从而达到修改元素内容的效果,其使用方法如下所示:
document.getElementById("my_div").innerHTML = "

这是一个段落

";
②修改元素属性
在得到需要的元素以后,就可以设法获取它的各个属性,getAttribute() 方法就是专门用来获取元素属性的,相应的也可以使用 setAttribute() 方法来更改元素节点的属性值。
案例:

<div id="my_div" title="哈哈哈"></div>
<script>
    alert(document.getElementById("my_div").getAttribute("title"));
</script>
setAttribute() 方法是用来设置属性的,它允许对属性节点的值做出修改,与getAtribute方法一样, 它也是只能用于元素节点,其使用方法如下所示: 
object.setAttribute(attribut e,value);

案例:

<div id="my_div" title="哈哈哈">
div
</div>
<script>
    document.getElementById("my_div").setAttribute("title","嘻嘻嘻")
</script>

③修改元素的样式

<p id="p2">Hello World!</p>
<script>
document.getElementById("p2").style.color="blue";
</script>

删除元素
如果需要在 HTML 中删除元素,首先便需要获得该元素,然后得到该元素的父元素,最后通过 removeChild 方法删除该元素,其实现流程如下。

var child = document.getElementById("p1");
child.parentNode.removeChild(child);

案例:

<div>
    <p>不被删除的节点</p>
    <p id="p1">要被删除的节点</p>
</div>
<script>
    var child = document.getElementById( "p1");
    child.parentNode.removeChild(child);
</script>

JavaScript 函数(高级)
函数参数
函数名后面的括号里面写的就是参数。参数的作用就是用于函数内部和函数外部数据的传递。也就是说:可以通过参数把函数外面的数据传入函数内部,并在内部使用,而且不会改变外部数据的值。
参数其实也就是变量。
语法:

function functionName(parameter1, parameter2, parameter3) {
    // 要执行的代码…… 
}

参数的个数不限

6
function getNumber1(number){
	alert(number);
}
function getNumber2(n1,n2){
	alert(n1 + n2);
}

参数只能在函数内部使用,不可以在函数外使用函数内的参数和变量。如:

function getNumber3($number){
	$number = 100;
}
document.write($number); // 报错

形参和实参

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>
</body>
<script>

    // 全局变量
    var arr=[ 1, true,9,8]
    // 下标i=1  999
    // var i=1 
    

  function add(i,v=555){//形参//i为局部变量
        if(i>0&&i<arr.length){//如果在这个范围内就执行
            // 添加最后一个
            if(i==arr.length){
                // arr[arr.length]=999//最后一个添加
                arr[arr.length]=v
            }else{
                for (var j = arr.length-1; j>=i;j--) {//任意位置添加
                    arr[j+1]=arr[j]//j+1  最后一个加1
                }
                // arr[i]=999
                arr[i]=v
            }
            console.log(arr)
        }
    }
    add(3,666)//实参

</script>
</html>

会出现如下错误提示

表示未定义的变量。
参数内也不能使用外面没有的变量。如:

function getNumber3($number){
	$inner = $number;
}

会出现如下错误提示

通用方法:删除第n个:

var arr = new Array(45, 88, 66, 45, 12, 58, 656, 'dsada', 'fdsaffas');
//删除第N个数据

function deletes(n) {

for(var i = n - 1; i < arr.length-1; i++) {

arr[i] = arr[i + 1]

}

arr.length -= 1;

}

deletes(4);

document.write(arr);

通用方法:在第N个数前插入

var arr = new Array(45, 88, 66, 45, 12, 58, 656, 'dsada', 'fdsaffas');
//[前面]插入数据
function add(n,data) {
    if(n > arr.length) {
        arr[arr.length] = data;
    } else {
        for(var i = arr.length; i >= n - 1; i--) {
            arr[i] = arr[i - 1]
        }
        arr[n - 1] = data;
    }
}
add(3,999);
document.write(arr);

变量的作用域
变量的位置不同,分为全局变量和局部变量
全局变量

  • 作用范围是所有代码块,也就是说在任何一个位置都可以直接访问全局变量
    局部变量
  • 作用范围是某一个代码块内部,也就是说只能在当前代码块内部使用。
    案例05
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title></title>
    <!--    <link rel="stylesheet" type="text/css" href="css/style.css"/>-->
    <style>
        table {
            border-collapse: collapse;
            margin: auto;
        }

        th, td {
            border: 6px solid gray;
            text-align: center;
            width: 60px;
            height: 60px;
        }

        th input {
            height: 35px;
            width: 90%;
            font-size: 20px;
            text-align: center;
        }

        td button {
            font-size: 20px;
            width: 60px;
            height: 60px;
            margin: 0;
            padding: 15px;
        }

        td:nth-child(4n) button {
            background-color: blueviolet;
            color: white;
        }
    </style>
</head>

<body>
<table>
    <tr>
        <th colspan="4"><input type="text" id="show"/></th>
    </tr>
    <tr>
        <td>
            <button onclick="getNumber(7)">7</button>
        </td>
        <td>
            <button onclick="getNumber(8)">8</button>
        </td>
        <td>
            <button onclick="getNumber(9)">9</button>
        </td>
        <td>
            <button onclick="getChar('*')">*</button>
        </td>
    </tr>
    <tr>
        <td>
            <button onclick="getNumber(4)">4</button>
        </td>
        <td>
            <button onclick="getNumber(5)">5</button>
        </td>
        <td>
            <button onclick="getNumber(6)">6</button>
        </td>
        <td>
            <button onclick="getChar('/')">/</button>
        </td>
    </tr>
    <tr>
        <td>
            <button onclick="getNumber(1)">1</button>
        </td>
        <td>
            <button onclick="getNumber(2)">2</button>
        </td>
        <td>
            <button onclick="getNumber(3)">3</button>
        </td>
        <td>
            <button onclick="getChar('+')">+</button>
        </td>
    </tr>
    <tr>
        <td>
            <button onclick="del()">c</button>
        </td>
        <td>
            <button onclick="getNumber(0)">0</button>
        </td>
        <td>
            <button onclick="compute('=')">=</button>
        </td>
        <td>
            <button onclick="getChar('-')">-</button>
        </td>
    </tr>
</table>
</body>
<!--<script src="js/js.js" type="text/javascript" charset="utf-8"></script>-->
<script>
    number = ''; //保存每次点击的数字(全局变量)
    up = ''; //保存上次点击的数字 (全局变量)
    char = '' //保存点击的运算符号(全局变量)
    /**
     获取计算机按钮按下的数字
     */
    function getNumber(n) {

        number += '' + n;

        document.getElementById('show').value += n;

        console.log('数字:' + number + '----上一个数字:' + up);

    }

    /**
     获取计算机按钮按下的符号
     */

    function getChar(c) {

        char = c;//把按下的符号键保存到char变量里面

        up = number;//把上一个数字保存到up变量里面

        number = ''//把number变量重新变为空字符串,便于记录下一个数字

        console.log('符号:' + char + '----上一个数字:' + up);

        document.getElementById('show').value += c;
    }

    /**
     计算结果
     */

    function compute() {

        up = parseInt(up);

        number = parseInt(number);

        switch (char) {

            case '':

                document.getElementById('show').value = (up * number);

                break;

            case '/':

                document.getElementById('show').value = (up / number);

                break;

            case '+':

                document.getElementById('show').value = (up + number);

                break;

            case '-':

                document.getElementById('show').value = (up - number);

                break;

            default:

                break;

        }

    }

    /**
     删除
     */

    function del() {

        up = '';

        number = '';

        document.getElementById('show').value = '';
    }
</script>
</html>

效果图

Web Storage:
Web Storage 是 HTML5 改良了 Cookie 存储机制后,新推出的本地存储机制,其作用是把网站中有用的信息存储到本地,然后根据实际需要从本地读取信息,主要分为 SessionStorage 和 LocalStorage 两种类型,其功能和用法基本上是相同的,只是保存数据的生存期限不同。SessionStorage 内容只存在浏览器关闭之前,浏览器一旦关闭则数据全部清空,而 localStorage 可以保存在浏览器关闭并重启后还存在。

Storage 对象在创建时会有一个相应的(key/value)键/值对列表可供访问,列表中的每一个键/值对称为数据项。Key 可以是任何字符串,Value 是简单的字符串。Storage 对象的属性和方法具体如下:
①length:返回当前 Storage 对象里保存的键/值对数量。
②key(index):该方法返回 Storage 中第 index 个键(key)的名称。键的顺序是由浏览器定义的,只要键的数量不改变,键的顺序也是不变的(添加或删除键会改变键的顺序,而仅仅改变已存在键对应的值不会改变键的顺序)。如果 index 大于等于键/值对的数量,则该方法返回值为空。
③getItem(key):该方法返回指定 key 对应的当前值。如果指定的 key 在当前 Storage 对象的键/值对列表中不存在,则该方法返回值为空。
④setItem(key,value):该方法首先检测指定的键/值对的键是否已存在于当前键值对列表。如果不存在,就把该键/值对添加到对象键/值对列表;如果存在,则进一步判断旧值与新值是否相等,如果不等,则用新值更新旧值,如果相等,则不做任何改变。
⑤removeItem(key):该方法从 Storage 对象键/值对列表中删除指定键对应的数据项。key 对应的数据项不存在时不做任何改变。
⑥clear():当前Storage对象键/值对列表中有数据项时,清空键/值对列表。对于空的键值对列表,不做任何改变。
localStorage.setItem("key",1);
var key = localStorage.getItem("key");
也可以简写为
localStorage.key=1;
var key = localStorage.key;
案例1:

<div id="my_div">
    <p>不被删除的节点</p>
    <p id="p1">要被删除的节点</p>
    <button onclick="deleteNode()">删除</button>
    <button onclick="addNode()">添加</button>
</div>
<script>
    if (localStorage.getItem("deleteP1")=="1"){
        let child = document.getElementById("p1");
        child.parentNode.removeChild(child);
    }
    function deleteNode() {
        let child = document.getElementById("p1");
        child.parentNode.removeChild(child);
        localStorage.setItem("deleteP1","1")
    }
    function addNode() {
        let child = document.getElementById("my_div");
        let element = document.createElement("p");
        element.append("要被删除的节点");
        element.setAttribute("id","p1")
        child.appendChild(element)
        localStorage.setItem("deleteP1","0")
    }
</script>

案例2:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="text/javascript">

localStorage.setItem("name","张三")

if(localStorage.getItem("name")!=null){
	alert("key存在")
}else{
	alert("key不存在")
}
sessionStorage.setItem("pwd","123456")
if(sessionStorage.getItem("name")!=null){
	alert("key存在")
}else{
	alert("key不存在")
}
 // localStorage.clear(name) 
	</script>
</html>

定时任务和延时操作
setInterval()
window.setInterval() 按照指定的周期(以毫秒计)来调用函数或计算表达式。
var label = setInterval(function, milliseconds, param1, param2, ...)
clearInterval()
window.clearInterval() 取消由 setInterval() 设置的 timeout。

js
clearInterval(label)

在实际开发中经常使用定时任务和延时操作,JavaScript 提供相应的 API 完成该操作。
定时任务:setInterval

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="text/javascript">

  
或
简写
var id = setInterval(function () {
    console.info(i);
    i++;
    if (i == 8) {
		// 到8的时候停
        clearInterval(id);
    }
}, 1000)

	</script>
</html>

使用 setInterval(function,时间)完成定时任务的开启,该方法的返回值是一个任务 id 类型为一个数字。使用 clearInterval 清除定时任务

延时操作:setTimeout
window.setTimeout() 在指定的毫秒数后调用函数或计算表达式。
var label = setTimeout(function, milliseconds, param1, param2, ...)
clearTimeout()
window.clearTimeout() 取消由 setTimeout() 方法设置的 timeout。
clearTimeout(label)

setTimeout(function () {
    alert("三秒后弹出")
}, 3000)

使用 setTimeout(function,时间)完成延时操作。和 setInterval 一样时间的单位是毫秒 1000 毫秒=1秒。

 <!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="text/javascript">

function fun(){
	console.log("你好);
	// java 递归
	
	setTimeout(fun,1000)
}
fun()
	</script>
</html>

函数参数数组Arguments
参数数组又叫可变参数,可以接受任意多个参数,而且创建函数的适合不需要指定参数的个数,再使用函数的时候确定参数个数即可。
案例06

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>
</body>
<script>
    function test(a,b,c){
          console.log(a)
          console.log(b)
          console.log(c)
       
        for (let s of arguments) {
            console.log(s)
        }
    }
    test(1,4,56,7)
</script>
</html>

函数返回值
有时,我们会希望函数将值返回调用它的地方。
通过使用 return 语句就可以实现。
在使用 return 语句时,函数会停止执行,并返回指定的值。

9
//定义函数

function myFunction() {
	var x = 5;
	return x;//在这里返回一个值,并且结束函数
	console.log(x);//这条语句不会执行
}

//使用函数

var ret = myFunction()//使用函数的时候会获得函数的返回值,并保存在ret变量里

JavaScript数组API
concat()
连接两个或多个数组

array1.concat(array2, array3, ... , arrayX);

案例07

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="text/javascript">
		arr1 = new Array("10","12");
		arr2 = new Array("a","bb","ccc");
		arr3 = new Array("哈哈","嘿嘿");
		result = arr1.concat(arr2,arr3);
		document.write(result);
	</script>
</html>

效果展示

fill()
用一个固定值替换数组的元素

array.fill(value, start, end);

注意: IE 11 及更早版本不支持 fill() 方法。
案例08

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="text/javascript">
		arr1 = new Array("10","12","哈哈");
		arr1.fill('XXXX',1,5);
		document.write(arr1);
	</script>
</html>

效果展示

案例:

<script>
    arr1=[1,2,3,4,5,6]
    arr2=[1,2,3,4,5,6]
arr1.fill("xx",2,4)
    console.log(arr1)
</script>

join()&toString()
数组变成字符串
案例09

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="text/javascript">
		$arr1 = new Array("10","12","哈哈");
		$r = $arr1.join();
		$b = $arr1.toString();
		document.write($r);
		document.write("<br/>");
		document.write($b);
	</script>
</html>

效果展示

把字符串分割为字符串数组string.split(separator,limit)

队列 :
特征 :先进先出
栈:
先进后出

push()
向数组末尾添加一个或多个元素,并返回新的长度

array.push(item1, item2, ..., itemX);

案例10

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="text/javascript">
		$arr1 = new Array("10","12","哈哈");
		$r = $arr1.push("你是谁");
		document.write($arr1);
		document.write("<br/>");
		document.write($r);
	</script>
</html>

效果展示

pop()
删除数组的最后一个元素并返回删除的元素
案例11

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="text/javascript">
		$arr1 = new Array("10","12","哈哈");
		$r = $arr1.pop();
		document.write($arr1);
		document.write("<br/>");
		document.write($r);
	</script>
</html>

效果展示

unshift()
向数组的开头添加一个或更多元素,并返回新的长度
array.unshift(item1,item2, ..., itemX)

案例12

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="text/javascript">
		$arr1 = new Array("10","12","哈哈");
		$r = $arr1.unshift("多啦阿曼","分化");
		document.write($arr1);
		document.write("<br/>");
		document.write($r);
	</script>
</html>

效果展示

shift()
删除并返回数组的第一个元素
案例13

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="text/javascript">
		$arr1 = new Array("10","12","哈哈");
		$r = $arr1.shift();
		document.write($arr1);
		document.write("<br/>");
		document.write($r);
	</script>
</html>

效果展示

reverse()
反转数组的元素顺序
案例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="text/javascript">
		$arr1 = new Array("10","12","哈哈");
		$arr1.reverse();
		document.write($arr1);
	</script>
</html>

效果:

slice()
提取数组部分元素
语法:

array.slice(start, end);
案例:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="text/javascript">
	arr =["x",2,3,5,7]
	console.log(arr);
var a=arr.slice(1,3)
console.log(a);
	</script>
</html>

参数 Values
参数描述start可选。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。如果该参数为负数,则表示从原数组中的倒数第几个元素开始提取,slice(-2) 表示提取原数组中的倒数第二个元素到最后一个元素(包含最后一个元素)。end可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果该参数为负数, 则它表示在原数组中的倒数第几个元素结束抽取。 slice(-2,-1) 表示抽取了原数组中的倒数第二个元素到最后一个元素(不包含最后一个元素,也就是只有倒数第二个元素)。
返回值
Type描述Array返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。
splice()
添加/删除项目,然后返回被删除的项目
该方法会改变原始数组。

语法:

arrayObject.splice(index,howmany,item1,.....,itemX);

案例:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="text/javascript">
	arr =["x",2,3,5,7]
	
	// 删除
	/**
	 * 3的位置  即确定了删除的位置 
	 * 2的位置  即确定了删除的位置 
	 */
	// arr.splice(3,2)
	// console.log(arr);
	
	// 修改
	/**
	 * 3的位置  即确定了删除的位置 和添加的位置
	 * 2的位置  即确定了删除的位置 和添加的位置
	 */
	// arr.splice(3,2,55,77)
	// console.log(arr);

    // 纯插入一个数,第一个位置不变,第二个为0
arr.splice(3,0,55,77)
	console.log(arr);
	</script>
</html>

参数
参数描述index必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。howmany必需。要删除的项目数量。如果设置为 0,则不会删除项目。item1, …, itemX可选。向数组添加的新项目。
forEach()
调用数组的每个元素
注意: forEach() 对于空数组是不会执行回调函数的。

array.forEach(function(currentValue, index, arr), thisValue)

参数
参数描述function(currentValue, index, arr)必需。 数组中每个元素需要调用的函数。 函数参数:currentValue必需。当前元素index可选。当前元素的索引值。arr可选。当前元素所属的数组对象。thisValue可选。传递给函数的值一般用 “this” 值。 如果这个参数为空, “undefined” 会传递给 “this” 值

js
// forEach(function(value,index,array)) 循环
// 类似于let循环,相当于有n个index变量
arr.forEach(function(value,index,array){
	console.log(index,value)
});

every()
检测数组所有元素是否都符合指定条件
every() 方法使用指定函数检测数组中的所有元素:
如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。
如果所有元素都满足条件,则返回 true。
注意: every() 不会对空数组进行检测。
注意: every() 不会改变原始数组。

js
array.every(function(currentValue,index,arr), thisValue)

参数
参数描述function(currentValue, index,arr)必须。函数,数组中的每个元素都会执行这个函数 函数参数:currentValue必须。当前元素的值index可选。当前元素的索引值arr可选。当前元素属于的数组对象thisValue可选。对象作为该执行回调时使用,传递给函数,用作 “this” 的值。 如果省略了 thisValue ,“this” 的值为 “undefined”
案例

// every:判断数组中每一个元素是否都符合要求
result = arr.every(function(value,index,array){
	if(value < 10){
		return true;
	}
	return false;
});
console.log(result);

some()
检测数组中的元素至少有一个满足指定条件
some() 方法会依次执行数组的每个元素:
如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。
如果没有满足条件的元素,则返回false。
注意: some() 不会对空数组进行检测。
注意: some() 不会改变原始数组。

array.some(function(currentValue,index,arr),thisValue)

参数
参数描述function(currentValue, index,arr)必须。函数,数组中的每个元素都会执行这个函数 函数参数:currentValue必须。当前元素的值index可选。当前元素的索引值arr可选。当前元素属于的数组对象thisValue可选。对象作为该执行回调时使用,传递给函数,用作 “this” 的值。 如果省略了 thisValue ,“this” 的值为 “undefined”
案例

// some:判断数组中每一个元素是否都符合要求
result = arr.some(function(value,index,array){
	if(value < 10){
		return true;
	}
	return false;
});
console.log(result);

filter()
检查指定数组中符合条件的所有元素
注意: filter() 不会对空数组进行检测。
注意: filter() 不会改变原始数组。

js
array.filter(function(currentValue,index,arr), thisValue)

参数
参数描述function(currentValue, index,arr)必须。函数,数组中的每个元素都会执行这个函数 函数参数:currentValue必须。当前元素的值index可选。当前元素的索引值arr可选。当前元素属于的数组对象thisValue可选。对象作为该执行回调时使用,传递给函数,用作 “this” 的值。 如果省略了 thisValue ,“this” 的值为 “undefined”
案例:

// filter:判断数组中每一个元素是否都符合要求
result = arr.filter(function(value,index,array){
    if(value %10==0){
		return value;
  或
	if(value < 10){
		return value;
	}
});
console.log(result);

find()
````
返回符合条件的数组的第一个元素的值。
获取第一个数
find() 方法为数组中的每个元素都调用一次函数执行:
当数组中的元素在测试条件时返回 true 时, find() 返回符合条件的元素,之后的值不会再调用执行函数。
如果没有符合条件的元素返回 undefined
注意: find() 对于空数组,函数是不会执行的。
注意: find() 并没有改变数组的原始值。
````
array.find(function(currentValue, index, arr),thisValue)
````
参数
参数描述function(currentValue, index,arr)必需。数组每个元素需要执行的函数。 函数参数:currentValue必需。当前元素index可选。当前元素的索引值arr可选。当前元素所属的数组对象thisValue可选。 传递给函数的值一般用 “this” 值。 如果这个参数为空, “undefined” 会传递给 “this” 值
案例:
````
// find:判断数组中每一个元素是否都符合要求
result = arr.find(function(value,index,array){
	if(value < 10){
		return value;
	}
});
console.log(result);

map()
````
返回原始数组元素调用函数处理后的新数组
map() 方法按照原始数组元素顺序依次处理元素。
map对数组进行修改
注意: map() 不会对空数组进行检测。
注意: map() 不会改变原始数组。
````
array.map(function(currentValue,index,arr), thisValue)
````
参数
参数描述function(currentValue, index,arr)必须。函数,数组中的每个元素都会执行这个函数 函数参数:currentValue必须。当前元素的值index可选。当前元素的索引值arr可选。当前元素属于的数组对象thisValue可选。对象作为该执行回调时使用,传递给函数,用作 “this” 的值。 如果省略了 thisValue,或者传入 null、undefined,那么回调函数的 this 为全局对象。
案例:
````
// map:对数组中的元素统一处理
result = arr.map(function(value,index,array){
	return value * value;
});
console.log(result);
````
reduce()
reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
reduce() 可以作为一个高阶函数,用于函数的 compose。
注意: reduce() 对于空数组是不会执行回调函数的。
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

参数:
参数描述function(total,currentValue, index,arr)必需。用于执行每个数组元素的函数。*total*必需。*初始值*, 或者计算结束后的返回值。*currentValue*必需。当前元素。*currentIndex*可选。当前元素的索引*arr*可选。当前元素所属的数组对象。initialValue可选。传递给函数的初始值
如:
````
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<p>点击按钮后对数组元素进行四舍五入并计算总和。</p>
		<button onclick="myFunction()">点我</button>
		<p>数组元素之和: <span id="demo"></span></p>
		<script>
			var numbers = [15.5, 2.3, 1.1, 4.7];
			function getSum(total, num) {
				return total + Math.round(num);
			}
			function myFunction(item) {
				document.getElementById("demo").innerHTML = numbers.reduce(getSum, 0);
			}
		</script>
	</body>
</html>
````
效果:


for循环
````
// 数组的遍历
arr = [1,2,3,4,5,6,7,8,9,"aaa1",true,false];
// 普通for循环,公用一个i
for (var i = 0; i < arr.length; i++) {
	//console.log(arr[i])
}
// 增强for循环,相当于有n个i变量
for (let i = 0; i < arr.length; i++) {
	//console.log(arr[i])
}
// 增强for循环,i是下标,数组和对象
for (let i in arr) {
	//console.log(arr[i])
}
// 增强for循环,i是值,数组和对象
for (let s of arr) {
	//console.log(s)
}
````
JavaScript数组排序
冒泡排序
冒泡排序的基本思想是,对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序
冒泡排序(Bubble Sorting)的基本思想是:通过依次从前向后(从下标 0 的元素开始),依次比较相邻元素的大小,若发现前面大于后面则交换,使值较大的元素逐渐从前部移向后部(从下标较小的单元移向下标较大的单元),就象水底下的气泡一样逐渐向上冒。 
因为排序的过程中,最大的元素不断往后靠,循环的判断的次数也在不断减少,从而减少不必要的比较。



案例07
````
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
	</body>
	<script>
	var arr=[8,3,2,1,7,4,6,5]
	for (var j = 0; j< arr.length; j++) {
	for (var i = 0; i < arr.length-1; i++) {
		var temp=0;
		if (arr[i]>arr[i+1]) {
			temp=arr[i+1]
			arr[i+1]=arr[i]
			arr[i]=temp
		}
	}
	}
	console.log(arr)
	document.write(arr)
	</script>
</html>
````


效果展示



选择排序
简单选择排序是最简单直观的一种算法,基本思想为每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,简单选择排序是不稳定排序。
选择排序(Select Sorting)也是一种简单的排序方法。它的基本思想是:第一次从 R[0]-R[n-1] 中选取最小值,与 R[0] 交换,第二次从 R[1]-R[n-1] 中选取最小值,与 R[1] 交换,第三次从 R[2]-R[n-1] 中选取最小值,与 R[2]交换,...,第 i 次从 R[i-1]-R[n-1]中选取最小值,与 R[i-1] 交换,...,第 n-1 次从 R[n-2]-R[n-1]中选取最小值,与 R[n-2] 交换,总共通过 n-1 次,得到一个按排序码从小到大排列的有序序列。
案例08
````
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    var arr = [8, 3, 2, 1, 7, 4, 6, 5]
    var temp = 0;
    for (var i1 = 0; i1 < arr.length; i1++) {
        var min = arr[i1];
        var minIndex = i1;
        for (var i = i1 + 1; i < arr.length; i++) {
            if (arr[i] < min) {
                min = arr[i];
                minIndex = i;
            }
        }
        temp = arr[i1];
        arr[i1] = min;
        arr[minIndex] = temp;
    }

    console.log(arr)
    document.write(arr)

</script>
</html>
````

效果展示



直接插入排序
直接插入排序基本思想是每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。



案例09
````
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
</body>
<script type="text/javascript">
    $min = 7
    var $nums = [12, 55, 4, 65,178,215,236,2,48,69,78,356,4];
    /**
     * 直接插入排序(插入排序)
     * 求:
     *    把数组从小到大排序
     * 思路:
     *        从第二个数开始,把当前这个数和前面的所有数进行比较
     *        如果比前面的某个数小
     *        和交换前面那个数交换顺序
     */
    for ($i=0; $i<$nums.length;$i++) {
        for ($j=$i; $j>0;$j--) {
            if ($nums[$j] < $nums[$j-1]) {
                $temp = $nums[$j];
                $nums[$j] = $nums[$j-1];
                $nums[$j-1] = $temp;
            }
        }
    }
    document.write($nums);
</script>
</html>
````

作业

1.完成如下要求
使用循环改变HTML中表格中单元格的样式:让奇数个单元格字体颜色变成红色
效果:


参考代码:
````
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>课程表</title>

    <style type="text/css">
        .colo{
            color: red;
            font-size: 20px;
        }
    </style>
</head>

<body>

<table border="1" cellspacing="1" cellpadding="1">
    <caption>课程表</caption>
    <tr>
        <th></th>
        <th>星期一</th>
        <th>星期二</th>
        <th>星期三</th>
        <th>星期四</th>
        <th>星期五</th>
    </tr>
    <tr>
        <td rowspan="3">上午</td>
        <td>PHP</td>
        <td>PHP</td>
        <td>PHP</td>
        <td>PHP</td>
        <td>PHP</td>
    </tr>
    <tr>
        <td>JAVA</td>
        <td>JAVA</td>
        <td>JAVA</td>
        <td>JAVA</td>
        <td>JAVA</td>
    </tr>
    <tr>
        <td>UI</td>
        <td>UI</td>
        <td>UI</td>
        <td>UI</td>
        <td>UI</td>
    </tr>
    <tr>
        <td rowspan="4">下午</td>
        <td>PHP</td>
        <td>PHP</td>
        <td>PHP</td>
        <td>PHP</td>
        <td>PHP</td>
    </tr>
    <tr>
        <td>JAVA</td>
        <td>JAVA</td>
        <td>JAVA</td>
        <td>JAVA</td>
        <td>JAVA</td>
    </tr>
    <tr>
        <td>UI</td>
        <td>UI</td>
        <td>UI</td>
        <td>UI</td>
        <td>UI</td>
    </tr>
    <tr>
        <td>Android</td>
        <td>Android</td>
        <td>Android</td>
        <td>Android</td>
        <td>Android</td>
    </tr>
</table>
</body>

<script type="text/javascript">
    //获取到标签的数组
    tds = document.getElementsByTagName('td');//通过标签名称来获取
    for (i = 0;i < tds.length;i++) {
        //把单元格奇数个改变颜色
        if (i % 2 != 0) {
            temp = tds[i].innerHTML;
            tds[i].innerHTML = '<span class="color">'+ temp +'</span>';
        }  
    }

</script>

</html>
````
2.有如下数组,输出所有小于50的数
````
var $nums = [
​ [12, 55, 4, 65, 178, 15, 33, 66, 594, 225],
​ [56, 87, 225, 49, 124, 33],
​ [59, 23, 26, 45, 48, 65, 987, 222],
​ [33, 24, 5, 94, 1, 649, 616, 456, 21],
​ [111, 222, 555, 378]
];
````
效果:

参考代码:
````
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title></title>
</head>

<body>
</body>
<script type="text/javascript">
    var $nums = [
        [12, 55, 4, 65, 178, 15, 33, 66, 594, 225],
        [56, 87, 225, 49, 124, 33],
        [59, 23, 26, 45, 48, 65, 987, 222],
        [33, 24, 5, 94, 1, 649, 616, 456, 21],
        [111, 222, 555, 378]
    ];
    /**
     * 求:输出所有小于50的数
     */
    for(i = 0;i < nums.length; i++) { //50
        for(j = 0;j < nums[i].length; j++) {
            if (nums[i][j] < 50) {
                document.write(nums[i][j] + " , ");
            }
        }
    }
</script>

</html>
````


3.有如下数组,求所有两位数的数字的和
````
var $nums = [
​ [12, 55, 4, 65, 178, 15, 33, 66, 594, 225],
​ [56, 87, 225, 49, 124, 33],
​ [59, 23, 26, 45, 48, 65, 987, 222],
​ [33, 24, 5, 94, 1, 649, 616, 456, 21],
​ [111, 222, 555, 378]
];
````
效果:


参考代码:
````
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title></title>
</head>

<body>
</body>
<script type="text/javascript">
    var $nums = [
        [12, 55, 4, 65, 178, 15, 33, 66, 594, 225],
        [56, 87, 225, 49, 124, 33],
        [59, 23, 26, 45, 48, 65, 987, 222],
        [33, 24, 5, 94, 1, 649, 616, 456, 21],
        [111, 222, 555, 378]
    ]; 
    /**
     * 求:输出所有两位数的数字的和
     */
    sum = 0;
    for(i = 0;i < nums.length; i++) { //5
        for(j = 0;j < nums[i].length; j++) {
            if (nums[i][j] > 9 && nums[i][j] < 100) {
                sum += nums[i][j];
            }
        }
    }
    document.write(sum);
</script>

</html>
````
4.有如下数组,输出所有女生的除了性别之外的所有信息
````
var student = [
​ [“张三”,“男”,“13594876584”,“美男”],
​ [“李四”,“男”,“13594876555”,“美男”],
​ [“范冰冰”,“女”,“13595468456”,“美女”],
​ [“大桥”,“女”,“13595548569”,“美女”],
​ [“吕布”,“男”,“13578945658”,“美男”],
​ [“刘备”,“男”,“13576954874”,“美男”],
​ [“哪咤”,“男”,“13579548455”,“美男”],
​ [“甄姬”,“女”,“13587459548”,“美女”]
];
````
效果:


参考代码:
````
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title></title>
</head>

<body>
</body>
<script type="text/javascript">
    var student = [
        ["张三", "男", "13594876584", "美男"],
        ["李四", "男", "13594876555", "美男"],
        ["范冰冰", "女", "13595468456", "美女"],
        ["大桥", "女", "13595548569", "美女"],
        ["吕布", "男", "13578945658", "美男"],
        ["刘备", "男", "13576954874", "美男"],
        ["哪咤", "男", "13579548455", "美男"],
        ["甄姬", "女", "13587459548", "美女"]
    ];
    /**
     * 求:输出所有女学生
     */
    for(i = 0; i < student.length; $i++) {
        if(student[i][1] == "女") {
            for(j = 0; j < student[i].length; j++) {
                if(j == 1) {
                    continue; //跳过本次,继续下次
                }
                document.write(student[i][j] + " , ");
            }
            document.write("<br/>");
        }
    }
</script>

</html>
````
5.有如下数组,删除第二个数,并输出新的数组   (选做)
````
​ var $nums = [12, 55, 4, 65, 178, 15, 33, 66, 594, 225];
````
效果:

参考代码:
````
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title></title>
</head>

<body>
</body>
<script type="text/javascript">
    var $nums = [12, 55, 4, 65, 178, 15, 33, 66, 594, 250];
    /**
     * 求:删除第二个数
     * 后面的数据全部往前移动一位
     * 长度-1
     */
    for ($i = 4;$i < $nums.length;$i++) {
        $nums[$i-1] = $nums[$i];
    }
    $nums.length -= 1;

    document.write($nums)
</script>

</html>
````
6.有如下数组,在第五个数据的位置插入999. (选做)
````
var $nums = [12, 55, 4, 65, 178, 15, 33, 66, 594, 225];
````
效果:


参考代码:
````
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title></title>
</head>

<body>
</body>
<script type="text/javascript">
    var $nums = [12, 55, 4, 65,178, 15, 33, 66, 594, 250];
    /**
     * 求:在第五个位置上添加999
     * 后面的数据全部往后移动一位
     */
    for ($i = $nums.length;$i > 5;$i--) {
        $nums[$i] = $nums[$i-1];
    }


    $nums[5] = 999;
    document.write($nums)
</script>

</html>
````
7.有如下两个数组  (选做)
````
var $nums = [12, 55, 4, 65,178];
var $chars = [‘hello’, ‘hi’, ‘how are you’];
````
把$nums和$chars两个数组合并成一个数组
把保存后的结果保存到$new变量里面

效果:

参考代码:
````
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title></title>
</head>

<body>
</body>
<script type="text/javascript">
    var nums = [12, 55, 4, 65,178];//5
    var chars = ['hello', 'hi', 'how are you'];//3
    var new;
    /**
     * 求:
     *    把nums和chars两个数组合并成一个一维数组
     *        把保存后的结果保存到$new变量里面
     */
    count = nums.length + chars.length;

    //5
    for (i=nums.length;i < count;i++) {
        nums[i] = chars[i+chars.length-count]//3
    }

    $new = $nums;
    document.write($new)
</script>

</html>
````
8有如下数组,用冒泡排序将所有数据从小到大排序 (选做)
````
var $nums = [12, 55, 4, 65,178,215,236,2,48,69,78,356,4];
````
效果:

参考代码:
````
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title></title>
</head>

<body>
</body>
<script type="text/javascript">
    var $nums = [12, 55, 4, 65,178,215,236,2,48,69,78,356,4];
    /**
     * 交换排序(冒泡排序)
     * 求:
     *    把数组从小到大排序
     * 思路:
     *        把数组中每一个数跟这个数后面的所有数进行比较
     *        如果后面的某一个数比这个数小
     *        就交换两个数的位置
     */
    for ($i = 0;$i < $nums.length;$i++) {
        for ($j = $i;$j < $nums.length;$j++) {
            if($nums[$i] > $nums[$j]){
                temp = $nums[$i];
                $nums[$i] = $nums[$j];
                $nums[$j] = temp;
            }
        }
    }

    document.write($nums);
</script>

</html>
````

9.有如下数组,用选择排序将所有数据从小到大排序(选做)
````
var $nums = [12, 55, 4, 65,178,215,236,2,48,69,78,356,4]
````

效果:


参考代码:
````
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title></title>
</head>

<body>
</body>
<script type="text/javascript">
    $min = 7
    var $nums = [12, 55, 4, 65,178,215,236,2,48,69,78,356,4];
    /**
     * 交换排序(选择排序)
     * 求:
     *    把数组从小到大排序
     * 思路:
     *        把数组中每一个数跟这个数后面的所有数进行比较
     *        如果后面的某一个数比这个数小
     *        就交换两个数的位置
     */
    for ($i = 0;$i < $nums.length;$i++) {
        $min = $i;
        for ($j = $i+1;$j < $nums.length;$j++) {
            if($nums[$min] > $nums[$j]){
                $min = $j;
            }
        }
        if($min != $j){
            $temp = $nums[$i];
            $nums[$i] = $nums[$min];
            $nums[$min] = $temp;
        }
    }

    document.write($nums);
</script>

</html>
````
10.用循环实现两个数组拼接
````
var arr1 = new Array(45, 88, 66, 45, 12, 58, 656, ‘dsada’, ‘fdsaffas’);
var arr2 = new Array(44, 6435, 6756, 786, 12, 58, 656, ‘f’, ‘fgfd’);
````
效果:


参考代码:

````
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title></title>
</head>

<body>
</body>
<script type="text/javascript">
    var arr1 = new Array(45,88,66,45,12,58,656,'dsada','fdsaffas');//44(9)
    var arr2 = new Array(44,6435,6756,786,12,58,656,'f','fgfd');
    //把连个数组拼接成一个数组,并且保存第一个数组里面
    function concat(){
        for (var i=0;i<arr2.length;i++) {
            arr1[arr1.length] = arr2[i]
        }
        document.write(arr1);
    }
    concat()
</script>
````
</html>
11.用循环实现将一个数组反转
````
var arr = new Array(45, 88, 66, 45, 12, 58, 656, ‘dsada’);
````
效果:


参考代码:
```
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title></title>
</head>

<body>
</body>
<script type="text/javascript">
    var arr = new Array(45,88,66,45,12,58,656,'dsada');
    //反转元素
    function reverse(){//8=4
        //偶数个
        for(var i=0;i<arr.length/2;i++){
            var temp = arr[i];
            arr[i] = arr[arr.length-i-1];
            arr[arr.length-i-1] = temp;
        }
        document.write(arr);
    }
    reverse();
</script>

</html>
````
12.要求:大写字母排版:将 css 篇的 display 练习使用循环输出 A-Z 全部字符。
效果:


参考代码:
````
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>盒子和边练习</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        #content {
            margin: 10px auto;
            border: 2px dotted #000000;
            width: 600px;
            display: table;
        }

        #content div {
            background: #907e35;
            display: inline-block;
            width: 180px;
            height: 180px;
            margin: 10px;
            text-align: center;
            color: white;
            line-height: 180px;
            font-size: 100px;
        }
    </style>
</head>

<body>
<div id="content">
</div>
<script>
    for (let i = 65; i < 91; i++) {
        let element = document.createElement("div");
        element.append(String.fromCharCode(i));
        document.getElementById("content").appendChild(element);
    }
</script>
</body>
</html>
````
13.要求:使用三个按钮控制 HTML 文档的 body 的背景颜色。

效果:



参考代码:
````
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>盒子和边练习</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        body {
            background-color: dodgerblue;
        }

        .btn-group {
            position: fixed;
            bottom: 0;
            text-align: center;
            width: 100%;
        }

        .btn-group button {
            width: 150px;
            height: 50px;
            text-align: center;
            line-height: 50px;
            border: none;
            font-size: 25px;
        }
    </style>
</head>

<body>
<div class="btn-group">
    <button onclick="changeColor('dodgerblue')">dodgerblue</button>
    <button onclick="changeColor('purple')">purple</button>
    <button onclick="changeColor('gray')">gray</button>
</div>
<script>
    function changeColor(str) {
        document.body.style.backgroundColor = str;
    }
</script>
</body>
</html>
````
14.要求:.表格指定删除:排版如下表格,并增加删除按钮,在点击删除按钮时能正常删除该条数据。

效果


参考代码:
````
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>表格指定删除</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        table {
            width: 600px;
            margin: 20px auto;
            border-collapse: collapse;
            text-align: center;
        }

        table td, table th {
            border: 1px solid #cad9ea;
            color: #666;
            height: 30px;
        }

        table thead th {
            background-color: #CCE8EB;
            width: 100px;
        }

        table tr:nth-child(odd) {
            background: #fff;
        }

        table tr:nth-child(even) {
            background: #F5FAFA;
        }
    </style>
</head>

<body>
<table border="1" cellspacing="0">
    <thead>
    <tr>
        <th>ID</th>
        <th>姓名</th>
        <th>工资</th>
        <th>操作</th>
    </tr>
    </thead>
    <tbody id="tableData">
    <tr>
        <td>1</td>
        <td>张三</td>
        <td>3000</td>
        <td>
            <button onclick="deleteUser(this)">删除</button>
        </td>
    </tr>
    <tr>
        <td>2</td>
        <td>李四</td>
        <td>4000</td>
        <td>
            <button onclick="deleteUser(this)">删除</button>
        </td>
    </tr>
    <tr>
        <td>3</td>
        <td>王二</td>
        <td>3500</td>
        <td>
            <button onclick="deleteUser(this)">删除</button>
        </td>
    </tr>
    <tr>
        <td>4</td>
        <td>麻子</td>
        <td>3800</td>
        <td>
            <button onclick="deleteUser(this)">删除</button>
        </td>
    </tr>

    </tbody>
</table>
<script>
    function deleteUser(obj) {
        //obj.parentNode.parentNode.remove();
        let tr = obj.parentNode.parentNode;
        let tab = document.getElementById("tableData")
        tab.removeChild(tr);
    }
</script>
</body>
</html>
````

15.要求:.做一个基于内存的用户系统,在页面不刷新时,能完成用户的增删改查。

效果:

参考代码:
````
 <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>章节练习</title>
    <style>
        * {
            margin: 0;
            padding: 0
        }

        table {
            width: 600px;
            margin: 20px auto;
            border-collapse: collapse;
            text-align: center;
        }

        table td, table th {
            border: 1px solid #cad9ea;
            color: #666;
            height: 30px;
        }

        table thead th {
            background-color: #CCE8EB;
            width: 100px;
        }

        table tr:nth-child(odd) {
            background: #fff;
        }

        table tr:nth-child(even) {
            background: #F5FAFA;
        }

        input {
            width: 70px;
        }

        button {
            display: inline-block;
            padding: 4px 8px;
            margin: 0 6px;
            text-shadow: 0 1px 1px rgba(0, 0, 0, .3);
            color: #d9eef7;
            border: solid 1px #0076a3;
            background: #0095cd;
        }

    </style>
</head>
<body>
<table border="1" cellspacing="0">
    <thead>
    <tr>
        <th>ID</th>
        <th>姓名</th>
        <th>工资</th>
        <th>操作</th>
    </tr>
    </thead>
    <tbody id="tableData">

    </tbody>
</table>
<script>
    var arr = [
        {id: 1, name: "张三", sal: 3000},
        {id: 2, name: "李四", sal: 4000},
        {id: 3, name: "王二", sal: 3500},
        {id: 4, name: "麻子", sal: 3800}];
    // if (localStorage.userInfo) {
    //     arr = JSON.parse(localStorage.userInfo);
    // }


    function loadData() {
        // localStorage.userInfo = JSON.stringify(arr);
        var str = "";
        arr.forEach((o, index) => {
        //`` 模板字符串 ;作用1 可以多行拼接2 可以在拼接中插入变量3 可以进行简单的运算4 可以互相嵌套5 简单,方便,整洁
            str += `<tr><td>${o.id}</td><td>${o.name}</td><td>${o.sal}</td>
<td><button onclick="updateUser(${index})">修改</button><button onclick="deleteUser(${index})">删除</button></td></tr>`
        })
        str += `<tr><td><input id="userId"></td><td><input id="userName"></td><td><input id="userSal"></td>
<td><button onclick="saveData()">保存</button><button onclick="cancel()">取消</button></td></tr>`
        document.getElementById("tableData").innerHTML = str;
    }

    loadData();

    function deleteUser(index) {
        arr.splice(index, 1);
        loadData();
    }

    var updateIndex = -1;

    function updateUser(index) {
        updateIndex = index;
        document.getElementById("userId").value = arr[index].id;
        document.getElementById("userName").value = arr[index].name;
        document.getElementById("userSal").value = arr[index].sal;
    }

    function saveData() {

        var id = document.getElementById("userId").value;
        var name = document.getElementById("userName").value;
        var sal = document.getElementById("userSal").value;
        if (updateIndex == -1) {
            arr.push({id: id, name: name, sal: sal})
        } else {
            arr.forEach(o => {
                if (o.id == id) {
                    o.name = name;
                    o.sal = sal;
                }
            })
        }

        loadData();        
        updateIndex = -1;
    }

    function cancel() {
        document.getElementById("userId").value = "";
        document.getElementById("userName").value = "";
        document.getElementById("userSal").value = "";
        updateIndex = -1;
    }
</script>
</body>
</html> 
````
16要 求:做一个时间实时显示的页面。
效果:


参考代码:
````
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body {
            background-color: black;
            color: white;
            font-size: 40px;
            text-align: center;
        }
        p span {
            border: 2px solid #333;
            padding: 10px 4px;
        }
    </style>
</head>
<body>
<p id="time">
</p>

<script>
    getTime();

    function getTime() {
        let date = new Date();
        let hours = formatTime(date.getHours());
        let minutes = formatTime(date.getMinutes());
        let seconds = formatTime(date.getSeconds());
        document.getElementById('time').innerHTML = hours + " : " + minutes + " : " + seconds;
        setTimeout("getTime()", 500);
    }

    function formatTime(i) {
        if (i < 10) {
            i = "<span>0</span> <span>" + i + "</span>";
        } else {
            let j = i.toString().charAt(0);
            let z = i.toString().charAt(1);
            i = "<span>" + j + "</span> <span>" + z + "</span>";
        }
        return i;
    }
</script>
</body>
</html>
````
17.使用js完成以下效果
效果:

参考代码:
````
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>electronic calculator</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        h2 {
            padding: 20px;
            text-align: center;
            color: #FFFFFF;
            font-weight: bolder;
            font-size: 28px;
        }

        div {
            width: 400px;
            height: 705px;
        }

        .box-big {
            border: 1px solid black;
            width: 450px;
            height: 758px;
            background-color: black;
            margin: 40px auto;
        }

        .box {
            padding: 10px;
            width: 400px;
            margin: 10px auto;
            border: white solid 2px;
            background-color: black;
        }

        .input {
            height: 50px;
            font-size: 15px;
            line-height: 50px;
            text-align: right;
            padding: 10px 10px;
            color: #FFFFFF;
        }

        hr {
            width: 418px;
            float: left;
            margin-left: -10px;
        }

        .box4 button {
            width: 90px;
            height: 90px;
            border: none;
            float: left;
            margin: 5px;
            line-height: 90px;
            font-size: 30px;
            border-radius: 4px;
            background-color: white;
            color: black;
        }

        .box3 {
            clear: left;
            width: 380px;
            height: 20px;
            text-align: center;
            margin-top: -268px;
            color: darkkhaki;
            font-size: 40px;
            font-weight: bold;

        }
    </style>
</head>
<body>
<div class="box-big">
    <div class="box">
        <h2>超级计算器 </h2>
        <hr>
        <p class="input" id="input" style="font-size: large">Please enter the number </p>
        <hr>
        <div class="box4">
            <button onclick="clearText()">C</button>
            <button onclick="backSpace()">←</button>
            <button onclick="add('(')">(</button>
            <button onclick="add(')')">)</button>
            <button onclick="add('7')">7</button>
            <button onclick="add('8')">8</button>
            <button onclick="add('9')">9</button>
            <button onclick="add('%')">%</button>
            <button onclick="add('4')">4</button>
            <button onclick="add('5')">5</button>
            <button onclick="add('6')">6</button>
            <button onclick="add('*')">*</button>
            <button onclick="add('1')">1</button>
            <button onclick="add('2')">2</button>
            <button onclick="add('3')">3</button>
            <button onclick="add('-')">-</button>
            <button onclick="add('0')">0</button>
            <button onclick="add('.')">.</button>
            <button onclick="calculate()">=</button>
            <button onclick="add('+')">+</button>
        </div>
        <div class="box3">
            中 国 制 造
        </div>
    </div>
</div>
<script>
    function add(C) {
        if (document.getElementById("input").innerText == "Please enter the number") {
            document.getElementById("input").innerText = ""
            document.getElementById("input").innerText += C;
            return;
        }
        document.getElementById("input").innerText += C;
    }

    function calculate() {
        let str = document.getElementById("input").innerText;
        document.getElementById("input").innerText = eval(str);
        localStorage.input = document.getElementById("input").innerText;
    }

    function clearText() {
        document.getElementById("input").innerText = "";
        localStorage.clear();
    }

    function backSpace() {
        let str = document.getElementById("input").innerText;
        document.getElementById("input").innerText = str.substr(0, str.length - 1);
        localStorage.input=  document.getElementById("input").innerText
    }
</script>
</body>
</html>
````
18:1.变身小怪兽:创建一个 HTML 页面 上面有一张图片,“变大”,“变小”,“暂停” 三个按钮控制图片大小。当变大按钮被点击时,图片以每秒 30 px 的速度变大,其他按钮相同道理控制图片。
效果:


参考代码:
````
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>章节练习</title>
    <style>
        .btn-group {
            position: fixed;
            bottom: 0;
            text-align: center;
            width: 100%;
        }

        .btn-group button {
            width: 150px;
            height: 50px;
            background: #1e69e8;
            text-align: center;
            line-height: 50px;
            border: none;
            color: white;
            font-size: 30px;
        }

        img {
            margin: 0 auto;
            display: block;
        }
    </style>
</head>
<body>

<img src="img/小怪兽.jpg" width="200">
<div class="btn-group">
    <button onclick="big()">变大</button>
    <button onclick="stop()">停止</button>
    <button onclick="small()">变小</button>
</div>

<script>
    var index = 0;

    function big() {
        if (index == 0) {
            index = setInterval(function () {
                document.getElementsByTagName("img")[0].width += 3;
            }, 100)
        }
    }

    function small() {
        if (index == 0) {
            index = setInterval(function () {
                document.getElementsByTagName("img")[0].width -= 3;
            }, 100)
        }
    }

    function stop() {
        clearInterval(index);
        index = 0;
    }
</script>
</body>
</html>
````
11.实现如下效果
效果图:

要求:
.在页面创建 3 个按钮,内容分别为“题一“,“题二“....,点击时调用下面的方法。
1.方法1:在控制台打印 1~1000 之间所有能同时被 3,5,7 整除的整数。 
2.方法2:创建一个数组存放全部学生的名字,点击“题二“按钮每次随机弹出(alert)一个学生,一直把所有的学生弹出完后弹出提示,已经没有学生可以弹出。
3.方法3:点击后弹出当前的系统时间,格式为 yyyy年MM月dd日HH:mm:ss

参考代码
````
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>章节练习</title>
    <script>
        function t1() {
            for (var i = 0; i < 1000; i++) {
                if (i % 3 == 0 && i % 5 == 0 && i % 7 == 0) {
                    console.info(i)
                }
            }
        }

        var arr = ["张三", "李四", "王二", "麻子"];

        function t2() {
            if (arr.length == 0) {
                alert("已经没有学生可以弹出")
                return;
            }
            var i = Math.floor(Math.random() * arr.length);
            alert(arr[i]);
            arr.splice(i, 1);
        }

        function t3() {
            var date = new Date();
            alert(date.getFullYear() + "年" + (date.getMonth() + 1) + "月" + date.getDate() + " " +
                date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds())
        }
    </script>
</head>
<body>
<button onclick="t1()">题一</button>
<button onclick="t2()">题二</button>
<button onclick="t3()">题三</button>
</body>
</html>
````
posted @ 2022-01-06 16:47  柠檬色的橘猫  阅读(95)  评论(0)    收藏  举报