JavaScript

目录

第一章 JavaScript简介

1.1 JavaScript的起源

  JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。 

  在1995年时,由Netscape公司的Brendan Eich,在网景导航者浏览器上首次设计实现而成。因为Netscape与Sun合作,Netscape管理层希望它外观看起来像Java,因此取名为JavaScript。但实际上它的语法风格与Self及Scheme较为接近。

  为了取得技术优势,微软推出了JScript,CEnvi推出ScriptEase,与JavaScript同样可在浏览器上运行。为了统一规格,因为JavaScript兼容于ECMA标准,因此也称为ECMAScript。

1.2 JavaScript的组成

  javascript组成一个完整的 JavaScript 实现是由以下 3 个不同部分组成的:

  核心(ECMAScript)、文档对象模型(Document Object Model,简称DOM)、浏览器对象模型(Browser Object Model,简称BOM)。

1.3 JavaScript的引入方式

1.3.1 行内式
  <button onclick="window.alert('别点了')">点我呀</button>
1.3.2 嵌入式 
<script>
    document.write('就要点你')
  </script>
1.3.3 外链式 
 <script src="./03-外链式.js"></script>

1.4  JavaScript的输入输出

1.4.1 输出语句
1.4.1.1 用于在浏览器中弹出警告
<script>
​
   window.alert('未满18周岁禁止访问')

​</script>
1.4.1.2 用于在控制台中输出 
<script>
    console.log('123456')
  </script>
1.4.1.3 用于在网页中输出内容 
<script>
     document.write('我刚满18周岁~~~~~~')
  </script>
1.4.2 输入语句 
1.4.2.1 在浏览器中弹出输入框,用户可以输入内容
<script>
    prompt("请输入你的年龄")
  </script>
1.4.2.2 在浏览器中弹出确认框 
<script>
   confirm('你真的16周岁吗?')
  </script>

1.5 JavaScript的注释 

  注释中的内容不会被解析器解析执行,但是会在源码中显示,我们一般会使用注释对程序中的内容进行解释。

  JS中的注释和Java的的一致,分为两种:

  单行注释:// 注释内容
  多行注释:/* 注释内容 */

1.5.1 单行注释
<script>
    // 这是注释内容
    console.log("Hello,World!");
</script>
1.5.2 多行注释
<script>
    /**
     * 这是注释内容
     */
    console.log("Hello,World!");
</script>

第二章 JavaScript基础语法

2.1、标识符

  所谓标识符,就是指给变量、函数、属性或函数的参数起名字。

  标识符可以是按照下列格式规则组合起来的一或多个字符:

  第一个字符必须是一个字母、下划线( _ )或一个美元符号( $ )。
  其它字符可以是字母、下划线、美元符号或数字。
  按照惯例,ECMAScript 标识符采用驼峰命名法。
  标识符不能是关键字和保留字符。

关键字:

2.2 变量

2.2.1变量是什么

2.2.2 变量的声明与赋值
 <script>
    // [先声明再赋值]

    //声明变量
    var tom;  //声明了一个tom变量
    var lily;
    var jack,jackson;  //同时声明了两个变量

    //为变量赋值
    tom = 'boy';
    lily = 'girl';

    //输出变量的值
    console.log(tom);

    // [在声明的同时直接赋值]
    var height = 188;
    console.log(height);
    
  </script>
2.2.3 let声明变量与赋值 
 <script>
    // let用于声明变量,是ES6新语法
    //ES6语法是指2015年推出的ECMAScript新规范

    var girlfriend = "张元英"
    var girlfriend = "白鹿"
    console.log(girlfriend) //bailu

    //let在声明变量时,在一个代码块内,不允许有变量去一样的名字
    //以一个花括号{}括起来的,为一个代码块
    let boyfriend = "魏大勋"
    boyfriend = "蔡徐坤"

    //变量值可以被更改,以最后一次值为准
    console.log(boyfriend)  //蔡徐坤

    {let boyfriend = "徐良"
      console.log(boyfriend);}
  </script>
2.2.4 const声明变量
 <script>
    // const和let一样,都是es6新语法

    //const一般声明的是不能改变的变量,也就是常量

    //const既不允许将一个变量名反复声明
    //也不允许在运行过程中变量的值

    const pi = 3.14
    console.log(pi)
    const r = 5
    C=2*pi*r
    S=pi*r*r
    console.log(C)
    console.log(S)
  </script>
2.2.5 变量声明不同 

   (1)初始化要求不同  

      使用var和let声明变量时可以先不初给化,而使用canst声明交量时必须初始化

    (2)重复声明不同,

      使用var和let声明的变量可以多次被修改,其值只与最近一次默值一致。

      驾使用const声明的变量,在整个运行过程中不能修改初值。

    (3)对块级作用域的支持不同.

      (使用一对花括号括起来的代码称为一个代码块所谓块级作用域  

      用的范围是当前代码块,离开当前代码块,安量就失效了。  

      使用var声明的变量支持全局作用城,使用let和const声明约变量支持块级作用域。)

2.3 数据类型

2.3.1 类型分类

  数据类型决定了一个数据的特征,比如:123和”123”,直观上看这两个数据都是123,但实际上      前者是一个数字,而后者是一个字符串。

  简单数据类型存储在栈内容中

  复杂数据类型的内容存储在堆内存中,

  地址存储在栈内存中

  对于不同的数据类型我们在进行操作时会有很大的不同。

  JavaScript中一共有5种基本数据类型:

  字符串型(String)
  数值型(Number)
  布尔型(Boolean)
  undefined型(Undefined)
  null型(Null)
  这5种之外的类型都称为Object,所以总的来看JavaScript中共有六种数据类型。

2.3.1.1 字符串型(String)

2.3.1.2  数值型(Number)
<script>
     var time = 1704

      //最大值
      console.log(Number.MAX_VALUE);
      //Infinity表示无穷大,也属于数字型
      console.log(Number.MAX_VALUE * 2); //Infinity

      console.log(3 - 2);//1
      console.log("a" - 2);//NaN
      //NaN表示not a number,不是一个数
      //但是NaN属于数字类型

      //用isNaN()做判断,会得到true或false结果
      //当判断的数据是正常的数字,isNaN的结果为false
      //当判断的数据不是正常的数字,isNaN的结果为true

      console.log(isNaN());
      console.log(isNaN(123)); //false
      console.log(isNaN(Infinity)); //false
      console.log(isNaN("aaa")); //true
    
  </script>
2.3.1.3 布尔型(Boolean)

  该类型只有两个值,true和false

2.3.1.4  未定义类型(Undefined)

  只有一个值,即undefined值。使用var声明了变量,但未给变量初始化值,那么这个变量的值就是undefined。

2.3.1.5 空型(null)

  空型只有一个一个特殊的null值,表示变量没有指向任何对象

2.3.1.6 Object类型

  js中对象是一组属性与方法的集合。这里就要说到引用类型了,引用类型是一种数据结构,用于将数据和功能组织在一起。引用类型有时候也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法。

2.3.2 数据类型检测 

  当不确定一个变量或值是什么类型的数据时

  就用typeof操作符进行数据类型检测

<script>
    let a = typeof (111)
      console.log(a); //number

      console.log(typeof ('111'));//string

      console.log(typeof NaN); //Number
      console.log(typeof -Infinity); //Number
      console.log(typeof true); //Boolean
      console.log(typeof "false");  //string
      console.log(typeof undefined); //undefined
      console.log(typeof null);  //object
    
  </script>
2.3.3 数据类型转换

  强制类型转换指将一个数据类型强制转换为其它的数据类型。一般是指,将其它的数据类型转换为String、Number、Boolean。

2.3.3.1 转换为String类型
<script>
  let b = false
  console.log(typeof b); //boolean
  var c = toString(b)
  console.log(typeof c); //string
 </script>
 2.3.3.2 转换为Number类型

字符串 --> 数字
       如果是纯数字的字符串,则直接将其转换为数字
       如果字符串中有非数字的内容,则转换为NaN
       如果字符串是一个空串或者是一个全是空格的字符串,则转换为0
布尔 --> 数字
       true 转成 1
       false 转成 0
null --> 数字
       null 转成 0
undefined --> 数字
       undefined 转成 NaN

<script>
 console.log(Number(true)); //1
  console.log(Number(false)); //0
  console.log(Number(undefined)); //NaN
  console.log(Number(null)); //0
  console.log(Number("123")); //123
  console.log(Number("123.a")); //NaN
  console.log(Number("")); //0
  console.log(Number("  ")); //0
  console.log(Number("true")); //NaN
  console.log(Number(""));
 </script>
2.3.3.3 将数据转换为布尔型数据

 转换时,代表空或者固定的值 [空字符串,数字0,NaN,null[undefined] 会转换成false]

 其他的值就会转换为true

 <script>
 let a = Boolean("")
  console.log(a); //false
  console.log(Boolean(" ")); //true
  console.log(Boolean("false")); //true
  console.log(Boolean(0)); //false
  console.log(Boolean(undefined)); //false
  console.log(Boolean(null)); //false
  console.log(Boolean("null")); //true
  console.log(Boolean(Infinity)); //true
  console.log(Boolean(2)); //true
 </script>

2.4 运算符

  运算符也叫操作符,通过运算符可以对一个或多个值进行运算并获取运算结果。

  比如:typeof就是运算符,可以来获得一个值的类型,它会将该值的类型以字符串的形式返回(number string boolean undefined object)

2.4.1 算术运算符

2.4.1.1 自增运算    
 <script>
 
  //自增运算  (前自增)
  let m = 10
  let n = 20
  m = ++n
  console.log(m); //21
  console.log(n); //21

  //自增运算 (后自增)
  m = n++;
  console.log(m); //21
  console.log(n); //22
 </script>
2.4.1.2 自减运算
<script>
 
   //自减运算 (前自减)
    m = --n
    console.log(m); //21
    console.log(n); //21

    //自减运算 (后自减)
    m = n--
    console.log(m); //21
    console.log(n); //20

    var x = 3
    console.log(x);
    console.log(++x); //4
    console.log(x++); //4
    console.log(x); //5

    console.log(--x); //4
    console.log(x); //4
    console.log(x--); //4
    console.log(x); //3

 </script>
2.4.2 字符串运算符

  隐式转换

  当两个数据类型不同时,js会按照固定的规则进行转换、

  字符串运算符;

  当加号遇见字符串,加号做拼接使用

<script>
    console.log(1 + 1); //2
      console.log(Infinity + 1); //Infinity
      console.log(1 + null); //1
      console.log(1 + true);// 2
      console.log(1 + false);//1

      console.log("12" - 0);//12
      console.log(null * 999); //0
      console.log(null * undefined); //NaN

      console.log(12 + "0"); //120
      console.log(1 + "1"); //11
      console.log(null + "999"); //null999

      var name = "xiaozhang"
      var age = 18
      console.log(name + "的年龄是" + age); //xiaozhang的年龄是18

 </script>
2.4.3 赋值运算符

  赋值运算符用于给 JavaScript 变量赋值。

  x=10 和 y=5,下面的表格解释了赋值运算符:

运算符例子等同于运算结果在线实例
=x=yx=5实例 >>
+=x+=yx=x+yx=15实例 >>
-=x-=yx=x-yx=5实例 >>
*=x*=yx=x*yx=50实例 >>
/=x/=yx=x/yx=2实例 >>
%=x%=yx=x%yx=0

实例 >>

2.4.4 比较运算符 

  比较运算符用来比较两个值是否相等,如果相等会返回true,否则返回false。使用 == 来做相等      运算


  1.当使用==来比较两个值时,如果值的类型不同,则会自动进行类型转换,将其转换为相同的类        型,然后在比较


 2. 使用 != 来做不相等运算
  不相等用来判断两个值是否不相等,如果不相等返回true,否则返回false,不相等也会对变量进    行自动的类型转换,如果转换后相等它也会返回false


  3.使用 === 来做全等运算
  用来判断两个值是否全等,它和相等类似,不同的是它不会做自动的类型转换,如果两个值的类    型不同,直接返回false 


  4.使用 !== 来做不全等运算
  用来判断两个值是否不全等,它和不等类似,不同的是它不会做自动的类型转换,如果两个值的    类型不同,直接返回true

<script>
    //==相等运算符
    console.log(5 == "5"); //true

    //===全等运算符
    console.log(5 === "5"); //false

    //!= 不相等
    console.log(5 != "5"); //false

    // !== 不全等
    console.log(5 !== "5"); //true

    //==和!=在比较不同的数据类型时,会将比较数据转换为同一类型
    //===和!==则不会转换
  </script>
2.4.5 逻辑运算符

  && 逻辑与运算符 一假则假

  || 逻辑或运算符 一真则真

  <script>
    console.log(true && true) //true
    console.log(false && true) //false
    console.log(true && false); //false
    console.log(false && false); //false

    console.log(true || true); //true
    console.log(true || false); //true
    console.log(false || true); //true
    console.log(false || false); //false

    console.log(3 > 2 && 2>1); //true
    console.log(3>2 && 2<1); //false
    console.log(3>2 || 2<1); //true
  </script>
2.4.6 三元运算符

语法:条件表达式 ? 表达式1 : 表达式2

如果条件表达式的值为true, 则返回表达式1的执行结果

如果条件表达式的值为false, 则返回表达式2的执行结果

案例:

var age = prompt('请输入年龄')
    age >= 18 ? console.log('成年') : console.log('未成年');
2.4.7 运算符优先级

运算符优先级由上到下依次减小,对于同级运算符,采用从左向右依次执行的方法。

一元运算符 > 比较运算符 > 逻辑运算符 (逻辑与>逻辑或> 赋值运算符)

let a = 3 > 5 && 2 < 7 && 3 == 4
    console.log(a) // false

    let b = 2 == "2"
    console.log(b); //true

    let c = !b || a && c
    console.log(c); //false

    let d = a &&(c || b)
    console.log(d); //false

2.5 流程控制

2.5.1 选择结构
2.5.1.1 if语句 (单分支语句)

语法格式:

 if(条件表达式){代码块}

案例:

let age = prompt(`请输入您的年龄`)
    console4.log(age);
    if (age >= 18) {
      document.write("恭喜你成年了")
    }
2.5.1.2 if...else语句(双分支语句)

语法格式:

 if(条件表达式){代码块1}else{代码块2}

案例:

 let score = prompt("请输入您的分数")
    if (score >= 60) {
      document.write("恭喜你及格了")
    }else {
      document.write("没及格")
    }
2.5.1.3 if...else if...else语句

语法格式:

if(条件表达式1) {

      代码段1

    }else if(条件表达式2) {

      代码段2

    } else if (条件表达式3) {

      代码段3

    } else if (条件表达式4) {

      代码段4

    } else {

      代码段n

    }

let ck = prompt("请输入您的存款")
      if (ck <= 3000) {
        document.write("喝蜜雪")
      } else if (ck <= 5000) {
        document.write("喝古茗")
      } else if (ck <= 7000) {
        document.write("喝瑞幸")
      } else if (ck <= 10000) {
        document.write("喝星巴克")
      } else {
        document.write('buhe')
      }
2.5.2 循环结构
2.5.2.1 for语句

语法格式:

  for(初始化变量;条件表达式;操作表达式) {循环体}

需求;打印从0-100的数

 <script>
  for (let i = 0; i <= 100; i++) {
      console.log(i);
    }
  
 </script>
2.5.2.2 while循环

语法格式:

  while(条件表达式) {循环体}

案例:打印1-100

<script>
  var i = 0;
    while (i <= 100) {
      console.log(i)
      i++
    }
</script>
2.5.2.3 do... while循环

语法格式:

  do {循环体} while (条件表达式)

案例:打印0-100的值

<script>
   var i = 0
    do {
      console.log(i);
      i++
    } while (i <= 100)

</script>
2.5.3 跳转语句
2.5.3.1 break

break 语句跳出循环

<script>
  for (var i = 1; i <= 5; i++) {

    if (i == 3) {
      console.log("白雪公主吃了毒苹果");
      break
    }
    console.log("白雪公主吃了" + i + "个苹果");
  }
</script>
2.5.3.2 continue

continue语句结束当前循环

<script>
  for (var i = 1; i <= 5; i++) {

      if (i == 3) {
        console.log("白雪公主吃了虫苹果");
        continue
      }
      console.log("白雪公主吃了" + i + "个苹果");
    }
</script>
2.5.4 循环嵌套

嵌套循环的特点:

外层循环执行一次, 内层循环要执行完所有循环次数

一般习惯外层循环变量用i, 内层循环变量用j

案例:打印四排四列星星

<script>
  for (let i = 1; i <= 4; i++) {
      
        for (let j = 1; j <= 4; j++) {
          document.write('★')
        }
        document.write('<br>')
      }
</script>

 案例:金字塔        

<script>
   let jzt = +prompt('请输入行数')
     for (let i = 0; i <jzt; i++) {
       for (let j = 1; j <jzt-i; j++) {
         
       }
       for (let a = 0; a < 2*i+1; a++ ) {
         document.write('★')  
       }
       document.write('<br>')
     }
</script>

第三章 数组

3.1 概述

数组也是对象的一种,数组是一种用于表达有顺序关系的值的集合的语言结构,也就是同类数据元素的有序集合。

数组的存储性能比普通对象要好,在开发中我们经常使用数组来存储一些数据。但是在JavaScript中是支持数组可以是不同的元素,这跟JavaScript的弱类型有关,此处不用纠结,我们大多数时候都是相同类型元素的集合。数组内的各个值被称作元素,每一个元素都可以通过索引(下标)来快速读取,索引是从零开始的整数。

使用typeof检查一个数组对象时,会返回object。

3.2 数组的基本操作

3.2.1 创建数组

1. 以数组字面量创建数组

<script>
   var array = [1, 2, 3, 4, 5]
    console.log(array); //[1, 2, 3, 4, 5]
</script>

2.以new Array()方式创建数组

<script>
   var array1 = new Array(1, 2, 3, 4, 5)
    console.log(array1); //[1, 2, 3, 4, 5]
</script>
3.2.2 数组构成

数组的值可以是任意类型的数据

<script>
    var array2 = ['string', 123, null, undefined, NaN, array]
      console.log(array2); //['string', 123, null, undefined, NaN, Array(5)]
</script>
3.2.3 数组长度

后面加.length

<script>
    var array2 = ['string', 123, null, undefined, NaN, array]
      console.log(array2.length); //6
</script>
3.2.4 访问数组

"数组索引"也称为"数组下标",以数字表示,默认是从0开始以此递增

<script>
    var array2 = ['string', 123, null, undefined, NaN, array]
     console.log(array2(0)); //string
     console.log(array2(3)); //underfined
</script>
3.2.5 更改数组

通过下标更改

<script>
    var array4 = [1, 2, 3, 4, 5]
      array4[0] = 0
      console.log(array4); //[0,2,3,4,5]
</script>
3.2.6 新增数组

通过下标新增

<script>
    var array4 = [1, 2, 3, 4, 5]
      array4[7] = 10
        console.log(array4); //[0, 2, 3, 4, 5, empty ,empty, 10]
        console.log(array4.length); //8
</script>
3.2.7 删除数组

利用delete关键字 +下标删除

<script>
    var array4 = [1, 2, 3, 4, 5]
     delete array4[7]
      console.log(array4); // [0, 2, 3, 4, 5, empty ,empty,empty]
      console.log(array4.length); //8
</script>
3.2.8 修改元素长度

通过.length修改

<script>
      var array4 = [1, 2, 3, 4, 5];
      array4.length = 5;
      console.log(array4); //[0, 2, 3, 4, 5]
      array4.length = 20;
      console.log(array4); //[0, 2, 3, 4, 5, empty × 15]
    </script>
3.2.9 数组方法

1. 在数组前新增元素unshift

<script>
       var arr1 = [4, 5, 6]
        arr1.unshift(1, 2, 3)
        console.log(arr1); //[1, 2, 3, 4, 5, 6]
    </script>

2. 在数组后新增元素push

 <script>
      var arr1 = [4, 5, 6]
      rr1.push(7, 8, 9)
      console.log(arr1); //[1, 2, 3, 4, 5, 6, 7, 8, 9]
    </script>

3.3 遍历数组

for(初始化变量;条件表达式;操作表达式) {循环体}

<script>
      var array = ["jack", "lily", "tom", "tony"]
      for (var i = 0; i <= array.length; i++) {
          console.log(array[i]);
          // jack
          // lily
          // tom
          // tony
        }
    </script>

需求:[60,78,86,55,32,97,40,10,99]最大值和最小值

<script>
      let score = [60, 78, 86, 55, 32, 97, 40, 10, 99]
      let max = score[0]
      let min = score[0]
      for (let i = 1; i < score.length; i++) {
        if (max < score[i]) {
          max = score[i]
        }
        if (min > score[i]) {
          min = score[i]
        }
      }
      console.log(max);
      console.log(min);
    </script>

需求:将数组["一","二","三","四","五"]反转

<script>
    var arr3 = ["一", "二", "三", "四", "五"]
    var arr4 = []
    for (var i = arr3.length - 1; i >= 0; i--) {
      console.log(i);
      console.log(arr3[i]);
      arr4.push(arr3[i])
    }
    console.log(arr4);
  </script>

3.4 二维数组

需求:二维数组求和

​
<script>
    var score = [
      [98, 67, 98, 88],
      [89, 79, 75, 66],
      [66, 78, 58, 98],
      [96, 53, 42, 81]
    ]
    let sum = 0

    for (var i = 0; i < score.length; i++) {
      console.log(i); //0,1,2,3
      sum = 0
      // console.log(sum); //会得到4个sum=0
      for (var j = 0; j < score[i].length; j++) {
        console.log(score[i][j]);
        sum += score[i][j]
      }
    }
    console.log("第" + (i + 1) + "位的学生的总成绩是" + sum);

  </script>

​

3.5 数组的迭代方法

3.5.1 map数组遍历器

  map 使用某种规则映射得到一个数组

  遍历数组中的每一个元素,并对每个元素进行相应的处理,并返回新的数组

  回调函数一定要有返回值

<script>
     var arr = [12, 13, 14, 15]
      //需求;生产一个新数组arr1
      var arr1 = []
      for (let i = 0; i < arr.length; i++) {
        arr1[i] = arr[i] + 1
      }
      console.log(arr1); //[13, 14, 15, 16]

      let arr2 = arr.map(function (v, i) {
          return v + 1
        })
        console.log(arr2);//[13, 14, 15, 16]

  </script>
3.5.2 filter数组过滤器

  filter用于筛选数组中满足条件的数组并返回

  形成的新数组长度 !== 原数组长度

  回调函数执行的次数 == 数组长度

<script>
     let arr = [-10, 0, 10, -20, 38, 40]
      //需求: 
      let arr1 = []
      for (let i = 0; i < arr.length; i++) {
        if (arr[i] >= 10) {
          arr1.push(arr[i])
        }
      }
      console.log(arr1); //[10, 38, 40]

      arr.filter(function (v, i) {
        return v >= 10
      })
      console.log(arr1);//[10, 38, 40]

  </script>
3.5.3 forEach数组遍历器

  forEach也是用于遍历数组

  forEach没有返回值,不用写return

<script>
    let arr = [1, 2, 3, 4, 5, 6, 7]
    let sum = o
    for (let i = 0; i < arr.length; i++) {
      sum += arr[i]
    }
    console.log(sum); //28

    let sum1 = 0
    arr.forEach(function (value) {
      sum1 += value
    })
    // arr.forEach(val => sum1 += val)

    
  </script>

第四章 函数

4.1 函数概述

函数是由一连串的子程序(语句的集合)所组成的,可以被外部程序调用,向函数传递参数之后,函数可以返回一定的值。

通常情况下,JavaScript代码是自上而下执行的,不过函数体内部的代码则不是这样。如果只是对函数进行了声明,其中的代码并不会执行,只有在调用函数时才会执行函数体内部的代码。

这里要注意的是JavaScript中的函数也是一个对象,使用typeof检查一个函数对象时,会返回function。

4.2 函数创建

使用 函数对象 来创建一个函数(几乎不用)

语法格式:

var 函数名 = new Function("执行语句");

使用 函数声明 来创建一个函数(比较常用)

语法格式:

function 函数名([形参1,形参2,...,形参N]) {
    语句...
}

4.3 函数调用

无序函数

function demo() {
      console.log('我是一个函数');
    }

有序函数

 function sum(a, b) {
      console.log(a + b);
    }
    sum(100, 200)
    sum(999, 888)

4.4 函数参数

JS中的所有的参数传递都是按值传递的,也就是说把函数外部的值赋值给函数内部的参数,就和把值从一个变量赋值给另一个变量是一样的,在调用函数时,可以在()中指定实参(实际参数),实参将会赋值给函数中对应的形参


调用函数时,解析器不会检查实参的类型,所以要注意,是否有可能会接收到非法的参数,如果有可能,则需要对参数进行类型的检查,函数的实参可以是任意的数据类型


调用函数时,解析器也不会检查实参的数量,多余实参不会被赋值,如果实参的数量少于形参的数量,则没有对应实参的形参将是undefined

4.5 函数的返回值

 函数的返回值是指在函数调用后获得的数据

 这个数据需要通过return关键字返回,让函数外可以看到

function total1(price, num) {
      return (price * num)
    }
    console.log(total1(9999, 12))

4.6 函数进阶

4.6.1 函数表达式

函数表达式是指将函数值赋给变量的表达式

let num = 1
    console.log(num); //1

    let fun = function sum(num1, num2) {
      console.log(num1 + num2); //3
    }
    // 定义函数表达式之后,不能通过函数名调用函数
    // sum(1,2)
    // 需要通过变量名调用函数
    fun(1, 2)
4.6.2 匿名函数

当使用函数表达式时,可以删除函数的名字

let fun1 = function (num1, num2) {
      console.log(num1 + num2); //3
    }
    fun1(1, 2)

    let fun2 = function (num1, num2) {
      return num1 + num2
    }
    console.log(fun2(1, 2)); //3
4.6.3 箭头函数

 删除function关键字

 在参数()和函数体{}之间放上 =>

let fun3 = (num1, num2) => {
      return num1 + num2
    }
    console.log(fun3(1, 2)); //3

4.7 回调函数

就是在a中,传入一个函数b作为参数,参数函数b就是回调函数

function demo(a, b) {
      console.log(a + b);
    }
    demo(1, 2)
    demo(11, 22)
    demo(111, 222)

    function cal(num1, num2, fn) {
      return fn(num1, num2)
    }

    var num = cal(10, 20, function (num1, num2) {
      return num1 + num2
    }
    )
    console.log(num); //30
    console.log(cal(30, 40, function (num1, num2) { return num1 + num2 })); //70

4.8 函数作用域

4.8.1 全局作用域

  全局作用域:全局变量拥有全局作用域

  全局变量: 在函数体外声明的变量或在函数体内省略var关键字声明的变量

var name = "张三"
    let age = 18
    function fun() {
      console.log(name);
      console.log(age);
    }
    fun()
    console.log(name);
    console.log(age);
4.8.2 局部作用域

  局部作用域:局部变量/函数变量拥有局部作用域

  局部变量:在函数体内利用var关键字声明的变量

function fun1() {
      var sex = "men"
      console.log(sex); // "men"

      sex1 = "women" //sex1是省略var声明的变量,属于全局变量
    }
    fun1()
    // console.log(sex); //not defined
    console.log(sex1);
4.8.3 块级作用域

块级作用域:被块级变量所拥有,在分支语句或循环大括号中定义的变量

  一般一个花括号{}为一个代码块

    块级变量:let关键字声明的变量。

for (let i = 0; i < 5; i++) {
      console.log("循环内部" + i);
    }
    console.log("循环内部" + i); //not defined

4.9 定时器函数

4.9.1 setTimeout

 setTimeout(() => {}, timeout)

 用来设置某个函数在多少毫秒之后执行

setTimeout(() => {
      console.log("要抢票了");
    }, 3000);
4.9.2 setInterval

 setInterval(() => {}, interval);

 用来设置某个函数在多少时间间隔后反复执行

 setInterval(() => {
      console.log("要抢票了");
    }, 3000);

4.10 函数嵌套

嵌套函数:在函数中声明的函数就是嵌套函数,嵌套函数只能在当前函数中可以访问,在当前函数外无法访问。

 let demo = "111"

    // 声明函数
    function func() {
      let demo = "222"

      function fun1() {
        let demo = "333"
        console.log(demo);
      }
      console.log(demo);

      fun1()
    }

    // 使用函数
    func()

4.11 闭包函数

是一种代码形式,内部函数访问外部函数的局部变量

闭包的作用:将变量以函数的形式保护起来,解决变量污染问题

举例:js函数outer中有一个函数inner

    函数inner访问了函数outer定义的局部变量demo,此时就产生了闭包

    变量所在的函数就是闭包函数,在这里,outer是闭包函数

 function outer() {
      let demo = "123"
      function inner() {
        console.log(demo);
      }
    }

第五章 对象

5.1 概述

 对象:(object)是一种复杂数据类型

     (简单数据类型存储在栈中,复杂数据类型的内容存储在堆中,地址存储在堆中)

     对象形式:以键值对的形式存储多个数据

5.2 介绍对象

5.2.1 创建对象

创建对象有两种方式:

第一种方式:

var person = new Object();
person.name = "孙悟空";
person.age = 18;
console.log(person);

第二种方式:

var person = {
    name: "孙悟空",
    age: 18
};
console.log(person);
5.2.2 对象新增
 <script>
    let obj = {
        name: "张三",
        sex: "man",
        age: 18,
        gfs: ["小美", "小丽", "小爱"],
        func: function () {
          console.log("见一个爱三个");
        }
      }

      obj.bf = "李四"
        console.log(obj);

  </script>
5.2.3 对象修改
<script>
    let obj = {
        name: "张三",
        sex: "man",
        age: 18,
        gfs: ["小美", "小丽", "小爱"],
        func: function () {
          console.log("见一个爱三个");
        }
      }

      obj.bf = "王五"
        console.log(obj);

  </script>
5.2.4 对象删除
 <script>
    let obj = {
        name: "张三",
        sex: "man",
        age: 18,
        gfs: ["小美", "小丽", "小爱"],
        func: function () {
          console.log("见一个爱三个");
        }
      }

     delete obj.gfs
      console.log(obj);

  </script>
5.2.5  对象遍历
 <script>
    let obj = {
        name: "张三",
        sex: "man",
        age: 18,
        gfs: ["小美", "小丽", "小爱"],
        func: function () {
          console.log("见一个爱三个");
        }
      }

     for (let key in obj) {
        console.log(ley); //打印属性名
        console.log(obj[key]); //打印属性值
      }

  </script>

5.3 Math对象

<script>
    // 1. 内置对象:由JS作者提交编写好的对象,直接使用即可

    const r = 5
    const pi = 3.14
    const C = 2 * pi * r
    console.log(C);

    // a.圆周率:Math.PI
    console.log(Math.PI);
    const c = 2 * Math.PI * r
    console.log(c);

    // b.绝对值:Math.abs()
    console.log(Math.abs(-3)); //3
    console.log(Math.abs(3)); //3

    // c.求最大/最小值:Math.max() /Math.min()
    console.log(Math.max(5, 7, 2, 9, 0, 3, -1)); //9
    console.log(Math.min(5, 7, 2, 9, 0, 3, -1)); //-1

    //d.四舍五入:Math.round()
    console.log(Math.round(3.3)); //3
    console.log(Math.round(-3.3)); //-3
    console.log(Math.round(-3.6)); //-4

    //e.向上取整:Math.ceil()
    console.log(Math.ceil(1.4)); //2
    console.log(Math.ceil(-1.4)); //-1

    //f.向下取整:Math.floor()
    console.log(Math.floor(1.4)); //1
    console.log(Math.floor(-1.4)); //-2

    //g.生成一个0-1的随机小数:Math.random
    console.log(Math.random());

    //生成一个0-100之间的随机整数
    console.log(Math.random() * 101);
    console.log(Math.round(Math.random() * 100));
  </script>

5.4 Date对象

<script>
    // 时间戳:1978年
    console.log(new Date().getTime());

    // 获取年份
    console.log(new Date().getFullYear()); //2024
    // 获取月份
    console.log(new Date().getMonth());
    // 获取日期
    console.log(new Date().getDate());
    // 获取星期
    console.log(new Date().getDay());
    // 获取小时
    console.log(new Date().getHours());
    // 获取分钟
    console.log(new Date().getMinutes());

    console.log("今天是" + new Date().getFullYear() + "年" + new Date().getMonth() + "月"
      + new Date().getDate() + "日" + "星期" + new Date().getDay());


    var date = new Date()
    // 设置年份
    date.setFullYear(2004)
    //设置月份
    date.setMonth(11)
    date.setDate(23)
    //打印月份
    console.log(date.getFullYear() + "年" + date.getMonth() + "月"
      + date.getDate() + "日" + ",我出生了");



  </script>

5.5 Array对象

<script>
     var course = ["web", "java"]
      // push()在数组末尾添加元素
      course.push("JS")
      console.log(course); //['web', 'java', 'JS']

      //unshift()在数组前新增元素
      course.unshift("计算机基础")
      console.log(course); //['计算机基础', 'web', 'java', 'JS']

      //pop()删除数组中最后一个元素
      course.pop()
      console.log(course); //['计算机基础', 'web', 'java']

      //shift()删除数组中第一个元素
      course.shift()
      console.log(course); // ['web', 'java']
      course.splice(1, 1, "js", "Vue", "node")
      console.log(course);

      var arr = [1, 2, 3, 4, 5, 6, 7]
      // splice(startIndex,deleteCount) splice起始下标
      arr.splice(3, 3) //表示从下标3(数字4) 开始删除3个数字
      console.log(arr); //[1, 2, 3, 7]
      arr.splice(2, 2)
      console.log(arr); //[1, 2]
      // splice()
      arr.splice(2, 0, 3, 4, 5, 6, 7)
      console.log(arr);

      // reverse():颠倒数组中元素的索引
      arr.reverse()
      console.log(arr); //[7, 6, 5, 4, 3, 2, 1]

      var demo = [23, 65, 78, 9, 13, 7, 24, 15]
      // sort() 对数值进行排序
      // 升序排序

      demo.sort(function (a, b) {
        return a - b
      })
      console.log(demo);//[7, 9, 13, 15, 23, 24, 65, 78]
      // 降序排序
      demo.sort(function (a, b) {
        return b - a
      })
      console.log(demo); //[78, 65, 24, 23, 15, 13, 9, 7]
  </script>

5.6 String对象 

5.6.1 概述

在JS中为我们提供了三个包装类,通过这三个包装类可以将基本数据类型的数据转换为对象

String():可以将基本数据类型字符串转换为String对象
Number():可以将基本数据类型的数字转换为Number对象
Boolean():可以将基本数据类型的布尔值转换为Boolean对象


但是注意:我们在实际应用中不会使用基本数据类型的对象,如果使用基本数据类型的对象,在做一些比较时可能会带来一些不可预期的结果,在这一章节中,我们重点介绍String()对象的属性和方法。

5.6.2 String对象 
<script>
    var str = "Helloworld"

    //访问字符串长度
    console.log(str.length);// 10

    //根据字符串返回下标 (索引)
    // indexOf() 返回元素在下标中第一次出现的下标,没有则是-1
    // lastIndexOf() 返回元素在字符串中第一次
    console.log(str.indexOf("o"));//4
    console.log(str.lastIndexOf("o"));//6
    console.log(str.lastIndexOf("v"));//-1

    //根据索引返回字符串
    //chatAt()
    console.log(str.charAt(7));// r

    //字符串类型,不改变原字符串
    // slice(startIndex)
    console.log(str.slice(5)); //world
    console.log(str);

    // slice(startIndex,EndIndex) //从第一个参数(下标),截取到end的下标前的元素。
    console.log(str.slice(4, 7)); //owo

    var str1 = "hello"
    var str2 = "world"
    //: 字符串连接:concat()
    console.log(str1.concat(str2));//helloworld

    // 大小写转化
    // toUpperCase() 小写转化为大写
    // toLowerCase() 大写转化为小写
    console.log(str1.toUpperCase());//HELLO
    console.log("HELLO".toLowerCase());//hello

    // 字符串的替换
    // replace(str1,str2) 将str1替换为str2
    console.log(str);
    console.log(str.replace("world", "js"));//Hellojs

    // 字符串的分隔(将字符串转为数组)
    // split(分隔符)
    console.log(str.split());//['Helloworld']
    console.log(str.split(""));//['H', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']
    console.log(str.split("o"));//['Hell', 'w', 'rld']
  </script>

第六章 DOM

6.1 DOM概述

当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。

HTML DOM 模型被结构化为 对象树 :

通过这个对象模型,JavaScript 获得创建动态 HTML 的所有力量:

JavaScript 能改变页面中的所有 HTML 元素
JavaScript 能改变页面中的所有 HTML 属性
JavaScript 能改变页面中的所有 CSS 样式
JavaScript 能删除已有的 HTML 元素和属性
JavaScript 能添加新的 HTML 元素和属性
JavaScript 能对页面中所有已有的 HTML 事件作出反应
JavaScript 能在页面中创建新的 HTML 事件


换言之:HTML DOM 是关于如何获取、更改、添加或删除 HTML 元素的标准。



6.2 获取元素案例

6.2.1  隔行变色
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <!-- html部分 -->
  <button id="btn">点我啊,给你点颜色看看</button>
  <ul>
    <li>给你点黄色看看</li>
    <li>给你点绿色看看</li>
    <li>给你点黄色看看</li>
    <li>给你点绿色看看</li>
    <li>给你点黄色看看</li>
    <li>给你点绿色看看</li>
    <li>给你点黄色看看</li>
    <li>给你点绿色看看</li>
  </ul>

  <!-- js部分 -->

  <script>
    // 1.获取元素
    let btn = document.getElementById("btn")
    console.log(btn);
    let liList = document.getElementsByTagName("li")
    console.log(liList);

    // 获取元素
    // document.getElementById("id属性值") 根据id属性获取元素
    // document.getElementsByTagName("标签名") 根据标签名获取元素

    //2.注册事件
    btn.onclick = function () {

      //3.事件处理
      for (let i = 0; i < liList.length; i++) {
        if (i % 2 == 0) {
          console.log("黄色");
          liList[i].style.backgroundColor = "yellow"
        } else {
          console.log("绿色");
          liList[i].style.backgroundColor = "green"
        }
      }
    }

    // 元素对象.事件属性 = 事件处理函数
    // element.onclick(单击事件) = 事件处理函数

    // 元素样式操作
    // element.style. 样式属性名 ="样式属性值"
    // backgroundColor 设置背景颜色

  </script>
</body>

</html>

 

6.2.2 微博评论框
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .count {
      color: red;
    }
  </style>
</head>

<body>
  <div class="box">
    <!-- textarea 多行文本框 -->
    <!-- placeholder 占位符 -->
    <!-- maxlength 最大字符量 -->
    <textarea name="" id="" cols="30" rows="10" placeholder="说点什么吧" maxlength="140"></textarea>
  </div>
  <span class="count">0</span>
  <span>/</span>
  <span>140</span>

  <script>
    // 1.获取元素
    let area = document.querySelector("#area")
    console.log(area);
    let count = document.querySelector(".count")
    console.log(count);

    // 根据css选择器获取元素
    // document.querySelector("id选择器") 根据id选择器获取元素
    // document.querySelector(".class类选择器") 根据class类选择器获取元素

    //2.设置事件
    area.oninput = function () {
      // console.log(this.value);// 打印输入框的内容
      // console.log(this.value.length);// 打印输入框内容的长度
      count.innerHTML = this.value.length
    }
    // 元素对象.事件属性 = 事件处理函数
    // element.oninput(输入事件)=事件处理函数
    // 设置内容
    // element.innerHTML =“HTML内容”

  </script>
</body>

</html>
 
6.2.3 开关灯
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <input type="button" value="关灯" id="btn">
  <script>
    // 1.获取元素
    let btn = document.getElementById("btn")
    console.log(btn);

    //2.事件处理
    //按钮点击事件
    btn.onclick = function () {

      // document.body 获取文档中的body标签
      let body = document.body

      if (this.value == "关灯") {
        this.value = "开灯"
        // this.style.backgroundColor = "black"
        body.style.backgroundColor = "black"
      } else {
        this.value = "关灯"
        // this.style.backgroundColor = "white"
        body.style.backgroundColor = "white"
      }
    }


    // 元素对象.事件属性 = 事件处理函数
    // element.onclick(单击事件) = 事件处理函数

    // 设置内容
    // element.innerHTML =“HTML内容”
  </script>
</body>

</html>
 

6.3 获取内容操作 

6.3.1 真香
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <div id="text">我王境泽就是饿死,死外边,从这里跳下去,也不会吃你们的东西</div>
  <input type="button" value="王子变形记" id="btn" onclick="changeText()">

  <script>

    function changeText() {
      document.getElementById("text").innerHTML = "真香"
    }

    // 设置内容
    // element.innerHTML =“HTML内容”
  </script>


</body>

</html>

 

点击按钮之后:

6.3.2 显示实时时间
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    p {
      font-size: 50px;
      text-align: center;
    }

    span {
      /* 设置字体加粗 */
      font-weight: bolder;
      color: blue;
    }
  </style>
</head>

<body>
  <p>现在是<span id="clock">09:28:00</span></p>
  <!-- <input type="button" value="测试按钮" onclick="showTime()"> -->
  <script>
    function showTime() {
      var date = new Date()

      console.log(date.getHours());
      console.log(date.getMinutes());
      console.log(date.getSeconds());

      // var text = date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds()
      // console.log(text);
      // document.getElementById("clock").innerHTML = text

      var text2 = time(date.getHours() + ":" + time(date.getMinutes()) + ":" + time(date.getSeconds()))
      document.getElementById("clock").innerHTML = text2
    }

    function time(t) {
      if (t < 10)
        t = "0" + t
      return t
    }

    // 定时器函数
    // setIterval
    setInterval(showTime, 1000)
  </script>
</body>

</html>

 6.4 元素样式操作

6.4.1 改变盒子大小
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .box {
      width: 50px;
      height: 50px;
      background-color: blue;
      margin: 50px auto;
    }
  </style>
</head>

<body>
  <div class="box" id="box">小</div>

  <script>
    // 1.获取元素
    let box = document.getElementById("box")

    // 定义一个变量。存储用户的点击数
    var i = 0

    // 2.注册事件
    box.onclick = function () {
      ++i
      console.log(i);
      // 单击次数为奇数,变大
      if (i % 2) {
        this.style.width = "500px"
        this.style.height = "500px"
        this.innerHTML = "大"
      } else {
        // 单击次数为偶数,变小
        this.style.width = "50px"
        this.style.height = "50px"
        this.innerHTML = "小"
      }
    }
  </script>
</body>

</html>

点击按钮之后:

 6.4.2 单击按钮变色
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <button>按钮一</button>
  <button>按钮二</button>
  <button>按钮三</button>
  <button>按钮四</button>
  <button>按钮五</button>
  <button>按钮六</button>

  <script>
    // getElementsByTagName("button")获得页面中所有标签名为button的数组
    var btns = document.getElementsByTagName("button")
    console.log(btns);

    // 遍历btns数组,为数组中的每一个元素设置点击事件
    for (let i = 0; i < btns.length; i++) {
      console.log(i);
      btns[i].onclick = changeColor
    }

    function changeColor() {
      for (let j = 0; j < btns.length; j++) {
        //this为正在点击的按钮
        if (btns[j] == this) {
          console.log(this);
          console.log(btns[j]);
          this.style.backgroundColor = "pink"
        } else {
          console.log(btns[j]);
          btns[j].style.backgroundColor = "gray"
        }
      }
    }
  </script>
</body>

</html>

点击按钮之后:

6.4.3 一闪一闪亮晶晶
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <img src="./xx.png" alt="" id="star">

  <script>
    let star = document.getElementById("star")

    // onmouseover 鼠标移入事件
    star.onmouseover = function () {
      // display = "none" 设置元素隐藏
      star.style.display = "none"
    }

    // onmouseout 鼠标移出事件
    star.onmouseout = function () {
      // display = "block" 设置元素显示
      star.style.display = "block"
    }
  </script>
</body>

</html>
 

鼠标移出后为空白

6.4.4 我方了 
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .box {
      width: 200px;
      height: 200px;
      background-color: blue;
    }

    .btn {
      margin: 20px;
    }

    .changeBox {
      border-radius: 50%;
    }
  </style>
</head>

<body>
  <!-- 当给box盒子增加changeBox类名时,圆角弧度的类名就也添加给了这个盒子 -->
  <!-- 需要设置点击事件,自动的完成changeBox类名的移出和添加 -->
  <div class="box"></div>
  <!-- <div class="box changeBox"></div> -->
  <button class="btn">我圆了</button>
  <button class="btn">我方了</button>

  <script>
    // getElementsByClassName("类名") 通过类名获取元素,得到所有这个类名的数组
    var box = document.getElementsByClassName("box")
    var btns = document.getElementsByClassName("btn")
    console.log(box);
    console.log(btns);

    btns[0].onclick = function () {
      console.log(box[0].classList); // ['box', value: 'box']
      box[0].classList.add("changeBox")
      console.log(box[0].classList); //['box', 'changeBox', value: 'box changeBox']
    }

    btns[1].onclick = function () {
      console.log(box[0].classList); // ['box', value: 'box']
      box[0].classList.remove("changeBox")
      console.log(box[0].classList); //['box', 'changeBox', value: 'box changeBox']
    }

    // element.classList:获取元素的类名列表
    // element.classList.add("类名"):为元素添加类名
    // element.classList.remove(“类名”):为元素移除类名
  </script>
</body>

</html>

点击我圆了:

6.5 元素属性操作

6.5.1 我哭了 
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <img src="./wkl.jpg" alt="" width="400px" height="300px" id="pic">
  <script>
    // 1.获取图片元素
    var pic = document.getElementById("pic")
    console.log(pic);

    // 2.为元素设置事件
    // onmouseenter 鼠标移入事件
    pic.onmouseenter = function () {
      this.src = "./wzd.jpg"
    }

    // onmouseleave 鼠标移出事件
    pic.onmouseleave = function () {
      this.src = "./wkl.jpg"
    }
  </script>
</body>

</html>

鼠标移入后:

6.5.2 404
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <input type="text" placeholder="请输入内容">
  <button>搜索</button>

  <script>
    let input = document.querySelector("input")
    let btn = document.querySelector("button")

    // 2.设置事件
    btn.onclick = function () {
      // 修改input属性的value属性
      input.value = "404NotFound"

      // 修改button标签的disabled,开启禁用模式
      this.disabled = true
    }
  </script>
</body>

</html>
 
6.5.3 显示和隐藏密码 
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<style>
  img {
    width: 20px;
    height: 20px;
    margin-left: 10px;
  }

  .box {
    display: flex;
  }
</style>

<body>
  <div class="box">
    <input type="text" id="input">
    <img src="./by.jpg" alt="" id="img">
  </div>
  <!-- 当input标签的type属性为password时,为密码框
    <input type="password"> 
  -->

  <script>
    let input = document.getElementById("input")
    let img = document.getElementById("img")

    img.onclick = function () {
      if (input.type == "text") {
        input.type = "password"
        img.src = "./by.jpg"
      } else {
        input.type = "text"
        img.src = "./zy.jpg"
      }
    }
  </script>
</body>

</html>

隐藏后:

6.6 节点操作案例

6.6.1 删除水平线
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <h1>JavaScript程序设计</h1>
  <hr />
  <h2>什么是JavaScript</h2>
  <p>JavaScript是一门基于对象和事件驱动的嵌入式脚本语言</p>
  <hr />
  <h2>第一部分 JavaScript概述</h2>
  <p>JavaScript的发展历史</p>

  <input type="button" value="删除水平线" onclick="delhr()">

  <script>
    function delhr() {
      let hrs = document.querySelectorAll("hr")
      console.log(hrs);// [hr, hr]

      for (let i = 0; i < hrs.length; i++) {
        var hr = hrs[i]
        console.log(hr);

        // parentNode 获取父节点
        console.log(hr.parentNode);

        // previousSibling 获取上一个兄弟节点
        console.log(hr.previousSibling);
        // previousElementSibling 获取上一个兄弟节点原素
        console.log(hr.previousElementSibling);
        // nextSibling 获取下一个兄弟节点
        console.log(hr.nextSibling);
        // nextElementSibling 获取下一个兄弟节点元素
        console.log(hr.nextElementSibling);

        // 移除节点
        // node.removeChild(child)
        // node表示父节点,child表示node中需要被移除的子节点
        hr.parentNode.removeChild(hr)
      }
    }
  </script>
</body>

</html>

 

点击按钮后:

 6.6.2 简易留言板

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="./02-节点操作案例2-简易留言板.css">
</head>

<body>
  <h1>留言板</h1>
  <ul></ul>
  <textarea name="" id="" placeholder="请输入您的留言"></textarea>
  <button class="sub">发布</button>

  <script>
    let ul = document.querySelector("ul")
    console.log(ul);
    let tr = document.querySelector("textarea")
    console.log(tr);
    let btn = document.querySelector("button")
    console.log(btn);

    btn.onclick = function () {
      // textarea标签的value属性,指在文本框输入的内容
      console.log(tr.value);

      //3. 非空判断
      if (tr.value == "") {
        alert("您没有输入任何的内容")
        return false
      } else {

        // 4.创建节点
        // document.createElement("标签名")
        var li = document.createElement("li")

        // 5.将text多行文本框的内容赋值给li元素
        li.innerHTML = tr.value

        // 8.删除按钮
        // 8.1 创建一个删除按钮(createElement)
        //8.2 为删除按钮增加内容(innerHTML)
        //8.3 为删除按钮增加点击事件(onclick = function(){})
        //8.4 点击删除按钮,移除父元素(removeChild)
        //8.5 把删除按钮添加到li元素中(li.appendchild(button))
        var btn2 = document.createElement("button")
        btn2.innerHTML = "删除"
        btn2.onclick = function () {
          ul.removeChild(li)
        }
        li.appendChild(btn2)

        // 6. 添加节点
        // insertBefore() 将一个节点添加到父节点的指定节点的前面
        // 第一个参数是要添加的节点
        // 第二个参数是父节点中指定的子节点
        ul.insertBefore(li, ul.children[0])

        //7.将文本框内容情况
        text.value = ""
      }
    }
  </script>
</body>

</html>
* {
  margin: 0;
  padding: 0;
}

body {
  padding: 10px;
}

div {
  border: 3px solid seagreen;
  width: 700px;
}

h1 {
  text-align: center;
  color: yellowgreen;
}

ul {
  margin-top: 50px;
  width: 500px;
  height: 200px;
  border: seagreen 3px dashed;
  margin: 30px auto;
  list-style: none;
}

li {
  width: 400px;
  padding: 5px;
  background-color: #eee;
  font-size: 14px;
  margin: 15px auto;
}

li a {
  float: right;
}

textarea {
  width: 400px;
  height: 50px;
  border: 3px solid seagreen;
  outline: none;
  resize: none;
  display: block;
  margin: 20px auto 5px;
}

.sub {
  display: block;
  background-color: seagreen;
  color: seashell;
  width: 200px;
  height: 30px;
  margin: 10px auto;
}

.remove {
  float: right;
}

  • 26
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值