JS- ECMAScript (基础语法)

284 阅读9分钟

01-JavaScript-变量-数据类型

什么是JavaScript ?

是一种运行在客服端(浏览器)编程语言,可以实现人机交互效果

作用: 网页特效 (监听用户的一些行为让网页作出对应的反馈)

​ 表单验证 (针对表单数据的合法性进行判断)

​ 数据交互 (获取后台的数据, 渲染到前端) ****

​ 服务端编程 (node.js)


JavaScript组成部分:
1 ECMAScript (基础语法)

​ 规定了js基础语法核心知识。

​ 比如:变量、分支语句、循环语句、对象等等

2 web APIs ( DOM、BOM) )

​ DOM 操作文档,比如对页面元素进行移动、大小、添加删除等操作

​ BOM 操作浏览器,比如页面弹窗,检测窗口宽度、存储数据到浏览器等等

1648216796251

JS 书写位置

JS有三种引入方式: 内联 ,内部 ,外部(常用)

1 内部引入:

直接写在html文件里,用script标签包住 , script标签写在上面

1648217113435

2 外部引入:

代码写在以.js结尾的文件里 , 通过script标签,引入到html页面中。

1648217124945

3 内联引入:

代码写在标签内部

1648217229565

注意事项: 书写的位置尽量写到文档末尾 前面 ,外部 js 标签中间不要写代码,否则会被忽略

JS注释

目前有两种注释方式:

1 单行注释:

​ 符号://

​ 作用://右边这一行的代码会被忽略

​ 快捷键:ctrl + /

2 块注释 :

符号:/* */

作用:在/* 和 */ 之间的所有内容都会被忽略

快捷键:shift + alt + A

JS结束符

1 分号; 可以加也可以不加

2 注意换行默认为结束符

看工作需求而定

JS输入与输出语法
1 输入语法:

在网页弹出一个对话框,用于提示用户输入文字

属性:   prompt('') 
name=prompt('请输入你的姓名');
2 输出语法:(有3)
1  控制台输出语法,程序员调试使用 (常用)
属性: console.log()
console.log('控制台打印');

2 向body内展示内容, 如果输出的内容写的是标签,也会被解析成网页元素 (常用)

属性:document.write()
document.write('要输出的内容');

3 页面弹出警告对话框 (不常用)

属性: alert()
alert('要输出的内容')

4 可以获取多个输入,进行输出

let  username = prompt('你叫什么名字');
      address = prompt('你家住哪里');
      foods = prompt('你喜欢吃什么');
      music = prompt('你喜欢自己一个听音乐吗');
      sports = prompt('你喜欢运动');

      // 输入一下  到网页中
      // console.log(username);
      // console.log(address);
      // console.log(foods);
      // console.log(music);
      // console.log(sports);

      // 能不能在一行上直接输出  不要换行  
      // 使用 一个 +  表示连接 
      console.log(username + address + foods + music + sports);
3 思维导图:

1648218170869

变量

变量相当于是一个容器,可以存装数据

1648218359193

1 声明变量 (创建变量)

要想使用变量, 首先需要创建变量(专业说法: 声明变量)

​ 变量声明(名字)最好见明之意

​ 变量名不能出现重复

注意:

关键字 和 变量的名称 之间要加 空格

创建一个变量 名字就叫做 let var if for ...的内置关键字 都不能使用

 let 关键字   age 变量的名称
 let  age
2 变量赋值

定义了一个变量后,你就能够初始化它(赋值)。在变量名之后跟上一个“=”,然后是数值。

1648219992728

let age  变量定义
age=18   变量的赋值
document.write(age);  网页输出内容

可以同时声明多个变量与赋值:

let name='张三',age=18,where='中国'
console.log(我叫${name},今年${age}岁,住在${where})
3 变量的声明,赋值使用

复写:

      let username        //变量声明 (username)
        username = '玩翠花' //变量赋值('玩翠花')
 		console.log(username);  变量使用   注意:变量使用里面不能放引号 			 (username)

        let height       //变量声明
        height = '1米7'   //变量赋值
     
        let wight         //变量声明
        wight = '200斤'   //变量赋值
        // 变量声明加赋值 常用简写
        let name = '变量声明加赋值';

        document.write (username)
        document.write (height)
        document.write (wight)
        console.log(name)

连写:

// 一次多次声明加赋值  连写   注意要加逗号隔开
        let username1 = '变量声明加赋值加连写', height1 = '1米7' ,
            wight1= '200斤';
        console.log(username1,height1,wight1);		
4 变量交换

需求: 有2个变量: num1 里面放的是 10, num2 里面放的是20

​ 最后变为 num1 里面放的是 20 , num2 里面放的是 10

核心思路:使用一个 临时变量 用来做中间存储

步骤: 1. 声明一个临时变量 temp

​ 2 把num1的值赋值给 temp

		 3 把num2的值赋值给num1 

​ 4 把temp的值给num2

1648257414140

 <script>

        // let figure = '20' , name = '张三'
        // console.log(figure,name);

        // 声明三个变量 2个赋值 一个空盒子
        let num1 = '10', num2 = '20',temp;
        //  设置 空的变量 存放 num1的值       num1 值 移到空盒子
        temp=num1;
        // 设置 num1 等于 num2 
        num1=num2;
        // 设置 num2 等于之前num1 的值(temp)
        // 思路在于:多创一个变量 用于  临时存放  
        numr2=temp;
        console.log(num1,num2);
        
    </script
5 变量的本质

变量的本质是什么

内存:计算机中存储数据的地方,相当于一个空间

变量:是程序在内存中申请的一块用来存放数据的小空间

1648257793579

6 变量命名规则与规范

规则:必须遵守,不遵守报错

规范:建议遵守,不遵守不会报错,但不符合业内通识

  1. 规则:

    不能用关键字

    关键字:有特殊含义的字符,JavaScript 内置的一些英语词汇。例如:let、var、if、for等

    1648259773572

    只能用下划线、字母、数字、$组成,且数字不能开头

         // 符号开头可以
            let  _hello='123' //下划线开头
            let  $hello='123' //$
            let  hello='123'  // 字母开头
            // let 123dadasd='132'  //不能以数字开头
    

    字母严格区分大小写,如 Age 和 age 是不同的变量

            // 字母区分大小
          let  Age = '用户1'; // 大写 单独
          let  age = '用户2'; // 小写 单独
    
  2. 规范:

起名要有意义

遵守小驼峰命名法

第一个单词首字母小写,后面每个单词首字母大写。例:userName

遵守大驼峰命名法

第一个单词首字母和后面每个单词首字母大写。例:UserName

      // 命名有意义
      // let a,b,c,d; // 不推荐 !!

      let height = '100';
      // 如果变量单词比较多
      let userName = '姓名'; // 推荐的
      let userHeight = '100'; // 推荐的

      let shoppingSupermarketShop = '111'; // 小驼峰  首字母小写
      let ShoppingSupermarketShop = '111'; // 大驼峰  首字母大写
7 拓展 数组

数组(Array)是一种可以按顺序保存多个数据

let    数组名  [ 数据1, 数据2,数据3,...数据n]

let name=['小明','小红','小米',....]

	name[0]
	name[1]

数组是按顺序保存,所以每个数据都有自己的编号

计算机中的编号从0开始,所以小明的编号为0,小红编号为1,以此类推

在数组中,数据的编号也叫索引或下标

let    数组名  [ 数据1, 数据2,数据3,...数据n]

let name=['小明','小红','小米',....]

console.log(name[0])	
console.log(name[1])
取哪个就选哪个下标

1648260661419 数组可以存储任意类型的数据


数据类型

js数据类型整体分为两大类:

基本数据类型:
1 数据类型 – 数字类型(number)

即我们数学中学习到的数字,可以是整数、小数、正数、负数。

let score = 100;/正整数
let price = 12.345;//小数
let temperature = -40;1/负数

数字类拼接:

数字类如果加上 + 号,那么他的值则会相加

        注意: 数字不能使用引号,不然就会变成字符串
        
        数字 使用加号 , 数值就会加起来   100+200= 300
        let num1=100;
        let num2=200;
        let sum=num1+num2
        console.log(sum);  sum =300
2 数据类型 – 字符串类型(Srting)

通过单引号( '') 、双引号( "")或反引号( ` )包裹的数据都叫字符串,单引号和双引号没有本质上的区别, 推荐使用单引号。

let user_name = '小明';//使用单引号
let gender =“男";//使用双引号
let str = '123';//看上去是数字,但是用引号包裹了就成了字符串了
let str1 = '';//这种情况叫空字符串

注意事项: 1. 无论单引号或是双引号必须成对使用

​ 2. 单引号/双引号可以互相嵌套,但是不以自已嵌套自已(口诀:外双内单,或 者外单内双)

​ 3.必要时可以使用转义符 \,输出单引号或双引号

字符串拼接:

当数字和字符串拼接是,会拼接在一起,而不是加在一起

        //  字符串 使用加号,文字就会拼接在一起  阿珍爱上阿强
        let num1='阿珍爱'
        let num2='上阿强'
        let sum=num1+num2
        console.log(sum);  sum=阿珍爱上阿强
3 数据类型 – 布尔类型(Boolean)

它有两个固定的值 truefalse

表示肯定的数据用 true(真),表示否定的数据用 false(假)

   <script>
      /* 
      boolean 布尔  只有两种值  真  true 假 false
       */

      //  你吃饭了吗
      let isEat = true;

      // 你睡觉了没有

      let isSleep = false;

      // 有什么用 ? 还没有学习到  条件语句 暂时 感觉不到它的作用

      // 感受

      // 如果你吃饭了, 我现在就去吃大餐
      // 如果你还没有吃饭, 我现在就去吃沙县
    </script>
4 数据类型 –未定义类型(undefined)

未定义是比较特殊的类型,只有一个值 undefined。

只要出现 undefined 就说明这变量并没有赋值

只声明,不赋值.那么在控制台就会显示出 undefined 
let age;
console.log(age);

1648262239789

5 数据类型 – null(空类型)

null 表示 值为 空

let age=null

null 和 undefined 区别:

  1. undefined 表示没有赋值
  2. null 表示赋值了,但是内容为空
  3. null 是赋值了,但是值还没确定是什么

数据类型-检测数据类型
typeof 检测数据的使用

给控制台加上 typeof 显示出,当前变量属于那种类型

let age = 18
let uname =‘刘德华'
let flag = false
let buy
console.log(typeof age)l // number
console.log(typeof uname)l // string
console.log(typeof flag) // booLean
console.log(typeof buy) // undefind

数据类型-类型转换(显示,隐藏)
1 隐式转换

如果把数字和字符串放在一起,系统会默认把字符串的旁边数字类型转成字符串

let age=18   数字
	age2='22'  字符串
console.log(age+age2)  控制台显示为:  1822

*-/ 都可以把旁边的 字符串 转成 数字类型

      let num2 = '2';

      let num3 = num2 - 0; // num3 是一个数字类型
      console.log(typeof num3);

    //   在变量前面加 + 就可以把 字符串 转换成 数值
      let num4 = +num2; //  也是可以的!
      console.log(typeof num4);

在数字类型 后面加上 +'',就会把数字类型转换成字符串类型

	    let num1=123 +''  //隐藏转换  (常用)
        console.log(typeof num1);
2 显示转换

字符串类型转换数字类型 (Number)

let num2=Number(num1)

        // 注意事项: 字符串转换后面要加括号
 
         字符串 转换成 数值  
          number 能把字符串转成 数值
          转换成功就是数字  失败就会成 NaN 也是数值
        let num1='12'
        let num2=Number(num1)
        document.write(num2)

数字类型转换字符串类型 (String)

​ let str=String(num1)

        let num1=123
        let str=String(num1)  //显示转换 (常用)
        console.log(typeof str);

 	    let str=num1.toString()  //显示转换  (不常用)
        console.log(typeof str);

去小数点的 parsseInt

保留小数点的 parseFloat

    <script>
        // 注意事项: 字符串转换后面要加括号
 
        //  字符串 转换成 数值  
        //   number 能把字符串转成 数值
        //   转换成功就是数字  失败就会成 NaN 也是数值
        // let num1='12'
        // let num2=Number(num1)
        // document.write(num2)

        //   直接用 + 号更加方便快捷 (常用)
          let num1='999'
        //   方法1:
        //   let num2=+num1
        //   console.log(num2); 
        // 方法2:
          console.log(Number(num1));


        //   parsseInt  会去掉小数点后面的值 (常用)
        let num3='32.222'
        let num4=parseInt(num3)
        console.log(num4);

        //  parseFloat  会保留小数点后面的值  (少用)
        // let num1='52.222'
        // let num2=parseFloat(num1)
        // console.log(num2);

    </script>
思维导航:

1648264040881

反引号的使用
作用

拼接字符串和变量

使用

必须要用 `` 包裹着内容

内容拼接变量时,用 ${} 包住变量

    <script>
        let  userName=prompt('请输入您的姓名')
        let age=prompt('请输入您的年龄')
        document.write(`大家好,我叫${userName},今年${age}岁了`)
    </script>
docunment.writ网页输出

可以在 JS框架 里输入HTML的标签结构 ,然后再网页中呈现出来

    <script>
      // 把内容 输出到   body标签中

      // document.write("呵呵 我又来啦 😶");
      // document.write(`<h1>大标题! <h1/>`);

      // let str =`<button>大大的按钮</button>`;

      // let str =`<input type="text" > <button>大大的按钮</button>`;

      // 反引号 还可以换行来写代码
      // 如果换行了 那么就只能使用 反引号
      // 如果不换行 用那种引号都可以
      let str = `
        <div>
      <p>
        <button>按钮又来啦</button>
      </p>
    </div>
        `;
      document.write('<h1>11111</h1>');

      /* 
      1 document.write 可以把一个 标签形式的字符串 重新插入到body标签里
      2 写标签字符串的时候  
        如果要换行  只能使用 反引号
        没有换行 用哪种方式都可以

        只要是写标签字符串 都可以使用反引号-模版字符串

      3 不要直接在 字符串里面 一个一个字母写 标签
        要现在 body标签中 使用 快捷键 先生成 标签 然后再复制回去
      
       */
    </script

docunment.writ网页输出-综合案例:

实现步骤:

1.先把静态效果在body上布局出来

    <table border="1">
        <thead >订单付款确认页面</thead>
        <tbody >
            <tr>
                <th>商品名称</th>
                <th>商品名称</th>
                <th>商品名称</th>
                <th>商品名称</th>
                <th>商品名称</th>
            </tr>
            <tr>
                <td>小米手机</td>
                <td>2999元</td>
                <td>1</td>
                <td>商品总价</td>
                <td>黑马地址</td>
            </tr>
        </tbody>
    </table>`)

2.然后在 js框架 实现弹窗输入(prompt)

        let  matter=prompt('请输入商品名称')
        let  matter2=+prompt('请输入商品价格')
        let  matter3=+prompt('请输入商品数量')
        let  matter4=matter2*matter3  // 请输入商品总价
        let  matter5=prompt('请输入收货地址')

3.把body的静态效果插入到 JS框架 上

        document.write(
        `   <div class="box">
        <h1>订单付款确认页面</h1>
        <table>
        <tr>
            <th>商品名称</th>
            <th>商品价格</th>
            <th>商品数量</th>
            <th>总价</th>
            <th>收货地址</th>
            
        </tr>
        <tr>
            <td>${matter}</td>
            <td>${matter2}元</td>
            <td>${matter3}</td>
            <td>${matter4}元</td>
            <td>${matter5}</td>
        </tr>
        </table>
            </div>`);

效果图:

1648265834987

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        body {
            display: flex;
            align-items: center;
            justify-content: center;
        }
        h1 {
            text-align: center;
        }
        table {
            text-align: center;
            width: 400px;
            height: 80px;
            border: 1px solid #000;
            border-collapse: collapse;
        }
        th,td {
            border: 1px solid #000;
        }
    </style>
</head>
<body>
    
  
    <script>
        let  matter=prompt('请输入商品名称')
        let  matter2=+prompt('请输入商品价格')
        let  matter3=+prompt('请输入商品数量')
        let  matter4=matter2*matter3  // 请输入商品总价
        let  matter5=prompt('请输入收货地址')
 

        document.write(
        `   <div class="box">
        <h1>订单付款确认页面</h1>
        <table>
        <tr>
            <th>商品名称</th>
            <th>商品价格</th>
            <th>商品数量</th>
            <th>总价</th>
            <th>收货地址</th>
            
        </tr>
        <tr>
            <td>${matter}</td>
            <td>${matter2}元</td>
            <td>${matter3}</td>
            <td>${matter4}元</td>
            <td>${matter5}</td>
        </tr>
        </table>
            </div>`);
    </script>
</body>
</html>

02-JavaScript-运算符-条件语句-while循环

运算符:1~6

1 算术运算符

有 加 减 乘 除 求余(取模)

同时使用多个运算符编写程序时,会按着某种顺序先后执行,我们称为优先级

JavaScript中 优先级越高越先被执行,优先级相同时以书从左向右执行

总结: 先乘除后加减,有括号先算括号里面的 ,使用 () 可以提升优先级

        // 算术运算符  加减乘除  求余(取模)  
        let num1=10
            num2=2
        // 加法
       console.log(num1+num2);   //12
        // 减法
       console.log(num1-num2);   //8
        // 乘发
       console.log(num1*num2);    //20
        // 除法
       console.log(num1/num2);    //5

        // 求余=取模  获得整数
        // 除法运算  获取除法运算后 剩下的余数
       console.log(10%5);  // 0  除得尽就为0   10可以整除5  所以取值为0

       console.log(10%3);   // 1   除不尽就去剩余整数  10除不尽3  所以取值余数 1

        // 如果一行捏  出现多个算术运算符 
        // 就先乘除后加减,如果有括号就先算括号
        console.log(1+1*2);
        console.log((1+1)*2);
2 圆的面积计算 (Math.PI*2)
        // π * r 的平方
        // 在JS中,通过什么来代表  π
        //  Math.PI
        // console.log(Maath.PI);

        let r=prompt('请输入圆的半径')
        
        console.log('圆的面积是: '+Math.PI*r*r );
3 赋值运算符

例如: let num=1

​ num=num+1

​ console.log(num); =2

赋值运算符: num=1 num += 1 控制台输出结果就是 num=2

1648381787226

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


        // let num=1
        //     num+=3
        // console.log(num);  //4


        // 加减乘除 求余  都一样
        let num=10
            num+=2
            num-=2
            num*=2
            num/=2
            num%=2
        console.log(num);

4 一元运算(自增&自减)

自增和自减一样运算

前置自增:

++num 代表 当前 变量 直接+1

num=1

console.log(++num) //2

后置自增:

num++ 代表 先执行num的值,然后再执行num+1

num=1

console.log(num++) // 1

console.log(num) // 2

1648382741022

1648382572863

        let i=1
        // 自增
        // 前置自增 
        //  ++每次只加1
        // 1+1+2
        console.log(++i+2); //4


        let r=1
        // 后置自增
        // 先执行结果 r+2 =3
        // 再执行r结果 r++ r=2
        console.log(r++ +2);  //3
        console.log(r);//2

        let  a=5
        //          第一个值 5   a+1=6
        //      第二个值  7   ++a(6)=7
        //       第三个值 7   a为7
        console.log(a++ + ++a +a);//19
5 比较运算符

( > ): 左边是否大于右边

<: 左边是否小于右边

( >=): 左边是否大于或等于右边

<=: 左边是否小于或等于右边

==: 左右两边是否相等 (只比较结果,不判断类型) 1 = "1" true

===: 左右两边是否类型和值都相等 (判断相等 判断类型 也判断值)

!==: 左右两边是否不全等 (不相等 判断类型也判断值 )

比较结果为boolean类型,即只会得到true或false

      //  比较后的结果 只有一个 布尔类型 true , false

      console.log(3 > 10); // 打印什么结果 false
      console.log(3 > 1); //  true

      console.log(3 < 10); //  true
      console.log(3 < 3); // false

      console.log(3 <= 3); // 小于或者等于 3

      // 判断是否相等 要用 两个 "="  号
      console.log(3 == 2); // false

      // let num = 4;
      // num = 5; // 只写一个等于号 赋值
      // console.log(num == 5); // 两个等于号才是判断

      // 判断 3 不等于 5
      // console.log(3!=5); // !=  不等于

      // 拿数字和字符串比较
      console.log(3 == '3'); // true  因为两个 == 只会判断值 而不会判断类型

      console.log(3 === '3'); //  flase  3个等于号  既要判断类型 也要判断值

      console.log(3 === 3); // true

      console.log(3 != 3); // false
      console.log(3 != '3'); // false

      console.log(3 !== '3'); // true

      console.log('============');

      //  比较 一般都是对数字做比较
      //  对于字符串做比较 更多是判断两者是否相等
      // console.log('A' === 'B');

      // 如果拿字符串去 大小的比较,判断的标准是
      // 先把字符串 拿去做 转数字
      // 转完了数字之后, 才根据数字做大小比较!

      console.log('A' > 'B'); // 65 > 66   了解即可 !!!
      console.log('问问' > '谢谢');

      // NaN = A    ||    NaN = B
      console.log(NaN === NaN); // false 不能以为 两者代码一样就相等 (不是一个数字    )

      // js 处理小数 有问题 后面会补充 精度的问题!!
      console.log(0.4 + 0.2 === 0.6);  //false

      // 比较运算符  会自己将 类型转换 去比较
      // console.log(4 > '3');  //true
    //   最好这样写,比较严谨
      console.log(4 > Number('3'));
6 逻辑运算符

&& 名称:逻辑与 特点: 符号两边都为 true 结果才为 true (一假则假)

|| 名称:逻辑或 特点:符号两边有一个true 结果就为 true (一真则真)

! 名称:逻辑非 (取反) 特点:是 true 就变 false 是false就变true (是真就假,是假就真)

1648383634507

      /*
      有个数据  大于5 而且 小于 10
       */
      let num = 6;

      console.log(num > 5 && num < 10); // true

      console.log(num > 5 && num < 4); // 一假则假  false

      // 我有钱包    要不 等于 1块钱  要不就 等于  0

      let money = 1;
      // 一真则真
      console.log(money === 1 || money === 0); // 只要满足了随便一个条件 那么这个钱包就是我的

      let gender = true; // true 男生

      console.log(gender); // true 
      console.log((!gender));  // 取反了 false 
6-1 短路运算

短路:只存在于 && 和 || 中,当满足一定条件会让右边代码不执行

1 && 一假则假 && 左边为false (假) 右边就不再去执行

console.log(2 > 10 && 1 < 3 && 3 > 1 && 9 > 5 && 5 < 10 && 8 > 2);

示例: 左边成立了 右边才会去执行

​ rain=true rain && console.log('去玩');

2 || 只要 || 左边 成立了为true (真),右边就不再去执行

console.log(100 > 3 || 2 > 6 || 9 > 10 || 10 > 11 || 13 > 20);

​ 示例: 左边不成立了 右边才会去执行

​ rain =false;

rain || console.log('去玩');

1648385450578

      // 一假则假  && 左边为false 右边就不再去执行
      console.log(2 > 10 && 1 < 3 && 3 > 1 && 9 > 5 && 5 < 10 && 8 > 2);

      // 工作中常见的写法
      // 如果今天还下雨 那我就去吃海鲜
      //   不下雨 不去吃海鲜了
      // let rain = false;

      // 左边成立了 右边才会去执行
      // rain && console.log('下雨 去吃海鲜');

      // 逻辑或 一真则真
      // 只要 || 左边 成立了为true,右边就不再去执行
      console.log(100 > 3 || 2 > 6 || 9 > 10 || 10 > 11 || 13 > 20);

      // 工作中 常用的技巧
      // 如果下雨,那么我就去玩了
      let rain = false ;
      rain || console.log('去玩');

      // 两个短路运算  逻辑或 和 逻辑与 
      //   工作中的语法  逻辑与来说   满足了 就去执行
      //   工作中的语法  逻辑或来说   不满足了 就去执行

条件语句

有表达式和语句

表达式 3+4 语句 alert() 弹出对话框

区别: 表达式计算出一个值,但语句用来自行以使某件事发生(做什么事)

if
单分支

满足条件,去执行

if (条件){

满足条件要执行的代码

}

        let score=prompt('请输入您的分数');
        // if 单分支 如果用户输入大于700
        //  就会执行一下代码
        // 如果小于700,就不会执行
         if (score>700) {
             alert('恭喜您,被录取了')
         }
双分支

if (条件){

满足条件要执行的代码

}else {

不满足条件就执行的代码

}

        let score=+prompt('考试分数')
        // if 双分支
        // 满足条件就执行第一个
        // 不满足条件,就执行第二个
        if(score>700){
            alert('蓝翔,欢迎你!')
        }else {
            alert('怀恨去北大!')
        }
多分支

if ( 条件1 ){

满足 条件1 要执行的代码

}else if( 条件2 ){

满足 条件2 要执行的代码 //可以设置N个条件和执行代码

}else {

不满足以上条件就执行的代码

}

        let  day=+prompt('请输入今天星期几');
//    如果不满足以下 1~5 条件,就会去执行 else
        if(day===1){
            console.log('煲仔饭');
        }else if(day===2){
            console.log('马杀鸡');
        }else if(day===3){
            console.log('烤全羊');
        }else if(day===4){
            console.log('吃牢饭');
        }else if(day===5){
            console.log('吃肉');
            // 可以有n个,只要输入相关的条件
        }else {
            // 以上都不满足条件,就执行
            console.log('吃白饭');
        }
思维导图:

1648386225951

三元表达式

其实是比 if 双分支 更简单的写法,有时候也叫做三元表达式

一般用于取值

符号: ?: 配合使用

语法: 条件 ? 满足条件执行的代码 : 不满足条件 执行的代码

        //  num3的取值是
        // num1大于num2,就取num1,
        // num2大于num1,就取num2,
        let num1=+prompt('请输入一个数字')
            num2=+prompt('请输入一个数字')
            num3=( (num1>num2) ? num1 : num2)
            console.log(num3);

易简计算器案例:


      /* 
      1 获取用户的三个输入
        前两个是数字 
        后一个是 运算符  "+" "-"  "*"  "/ "

      2 判断当前的运算符是什么
        if(  是➕ )  执行 数字相加
        else if  ➖  执行数字相减少
        else if  ✖   执行数字想乘
        else if  ➗  执行数字相除
       */

      let num1 = +prompt('请输入第一个数字');
      let num2 = +prompt('请输入第二个数字');
      let operator = prompt('请输入 "+" "-"  "*"  "/ " 任意一种');

      // 判断当前的操作符 是什么
      if (operator === '+') {
        console.log(num1 + num2);
      } else if (operator === '-') {
        console.log(num1 - num2);
      } else if (operator === '*') {
        console.log(num1 * num2);
      } else if (operator === '/') {
        console.log(num1 / num2);
      }
断点调试

作用: 学习时可以帮助更好的理解代码运行,工作时可以更快找到bug

1 在浏览器中,右键检查

2 选择控制台

3 选择代码文件

断点:在某句代码上加的标记就叫断点,当程序执行到这句有标记的代码时会暂停下来

1648468740010

while循环

循环:重复执行某段代码 ,可以执行无数次

while 循环注意事项:

循环的本质就是以某个变量为起始值,然后不断产生变化量,慢慢靠近终止条件的过程。 所以,循环需要具备三要素:

1 变量起始值 :

let  i = 1;

2 终止条件(没有终止条件,循环会一直执行,造成死循环)

while(i<=3){
    document.write('我会循环3次')
    i++
}

3 变量变化量(用自增或者自减)

1648469060829

while循环案列示范

1 循环案例(爱不爱我)

需求: 问是否 爱我 是就 不再问了 不是的就一直问

分析

​ 一直问 prompt 一直被执行 肯定要放在 while循环里面

​ 决定能否继续循环的条件是什么。。。

​ str !== "爱" 如果用户输入的不是 爱 ,就会一直弹窗询问

​ 直到用户输入 爱 ,就结束弹窗

代码示例:

      //  1 定义 初始变量
      let str; // undefined

      // 2 判断的条件  (满足什么条件 就继续 执行循环)

      while (str !== '爱') {
        // 弹窗
        str = prompt('你爱不爱我?');
      }

2 参考案例:(ATM易简)
    /*  需求:
    1 打开网页的时候出现一个弹窗
    显示一下内容
    1 存款
    2 取款
    3 查看余额
    4 退出
     
    2  用户就需要输入一些内容
      1 用户输入"1"
      会继续弹窗,会问上面1 的内容
      2 用户输入"2"
      会继续弹窗,会问上面1 的内容
      3 用户输入"3"
     会继续弹窗,会问上面1 的内容
      4 用户输入"4"
        退出弹窗   退出循环 

     定义一个变量,num 在不输入 4 的情况下一直循环,一直弹窗询问

    再定义一个变量, money 数字为0 
        
    
    */

        let num;
            money=0
 // 定义一个变量,让他在不输入 4 的情况下一直循环,一直弹窗询问
        while(num!==4){
            num=+prompt(`请输入你的操作:
        1.取款
        2.存款
        3.查看余额
        4.退出
        `);
        if(num===1){
            let num1=+prompt('请输入你的存款数量')
           money+=num1
        }else if(num===2){
           let num2=+prompt('请输入你的存取款数量')
            money-=num2
        }else if(num===3){
           alert(money)
        }else if(num===4){
            console.log('开始退出');
        }
        }
3 三角星案例:
      /* 
      第一个循环 控制的 行数
      现在需求 
      1 行数没有改变 
      2 列数 发生了变化! 
        要知道 改变列数 代码(5)     index1<= 5    
        1 第一次循环    列数 :1 
        2 第二次循环    列数 : 2 
        3 第三次循环    列数 : 3 

        4 发现 不能写死成 5  而是 换成一个变量 
        变量 可以实现  第一次循环 1  第二次循环 2 

      
       */

      for (let index = 1; index <= 5; index++) {
        // 第二个循环中   判断条件 5 => index(第一层循环的变量值)
        for (let index1 = 1; index1 <= index; index1++) {
          document.write('⭐');
        }
        document.write('<br/>');
      }
4 九九乘法表案例:
    <style>
        *{
            padding: 0;
            margin: 0;
        }
        span {
            display: inline-block;
            border: 1px solid #000;
            padding: 0 10px;
            line-height: 20px;
            height: 20px;
            width: 100px;
            margin-bottom: 5px;
            margin-right: 5px;
            text-align: center;
        }
    </style>
</head>
<body>
    <script>

        for (let index1 = 1; index1 <=9; index1++) {
            for (let index = 1; index <=index1; index++) {
                num=index*index1
            document.write(`<span>${index}*${index1} = ${num }</span>`)
            
        }
           document.write(`<br/>`)
        }
    </script>

03-JavaScript-for循环-数组

continue (会跳过本次循环,开始下一次循环)

设置指定的条件后,在执行到此处时,会跳过次循环,继续执行下一个循环

      // 只显示 奇数 单数
      for (let index = 1; index <= 10; index++) {
        // 判断当前的index是不是奇数 是奇数就跳过不执行
        if (index % 2 === 0) {
          continue;
        }
        console.log(index);
      }

1648470558946

break (退出循环) break 能用则用

在设置指定的条件后,循环到此处就会终止循环

        for (let i = 1; i <10; i++) {
            // 循环到7就停止,不在执行
            if(i===7){
                break
            }
            console.log(`第${i}个`);
        }

1648470566654

思维导图:

1648470630591

for循环与嵌套

注意:

for循环 一般用于有循环次数的

while循环 无限次数循环的 如 爱不爱我 案例 就要用

for循环嵌套,一个循环里再套一个循环,一般用在for循环里

1648470920081

      for (let index1 = 1; index1 <= 3; index1++) {
        document.write(`第${index1}天<br/>`);
        // 第一天要背5个单词
        // 执行5次背单词的 开始
        for (let index2 = 1; index2 <= 5; index2++) {
          document.write(`记住第${index2}个单词<br/>`);
        }
      }

嵌套循环-参照案列:

用户输入N天背N个单词

        //  4 和 9 要改成 用户的输入!!
      // 4 表示天数
      let day = +prompt('请输入天数');
      // 9 表示单词个数
      let num = +prompt('请输入背单词的个数');

      for (let index1 = 1; index1 <= day; index1++) {
        document.write(`第${index1}天<br/>`);

        for (let index2 = 1; index2 <= num; index2++) {
          document.write(`记住第${index2}个单词<br/>`);
        }
      }
数组

概念: 数组(Array)是一种可以按顺序保存数据的数据类型

使用场景: 一般是配合for循环来使用

数组里面可以放任意的数据类型,但是不建议. 一般都是放同一种类型

1 声明语法:
	数组名   0     1     2      3     4      5    6       编号也叫索引或下标
let arr=['小明','小红','小黑','小黄','小绿','小刚,'小久']
    arr[0]    //小明
	arr[3]   //小黑
console.log(arr.length)   //  长度为  7

计算机中的编号从0开始,所以小明的编号为0,小红编号为1,以此类推

在数组中,数据的编号也叫索引或下标

可以通过下标来读取数据

2 基本术语:

1 元素:数组中保存的每个数据都叫数组元素

2 下标:数组中数据的编号

3 长度:数组中数据的个数,通过数组的 length 属性获得

3 长度属性 (结合 等于号=)

数组的长度是动态的,随着数组的下标变动而变动

.length 长度属性
arr.length = 7 ;
4 增删与删除属性值 (用的时候肯定有括号 () )
属性值数组名.属性值作用
pusharr.push (常用)在数组的未尾添加新的元素(会自己增加长度属性值)
unshiftarr.unshift在数组的开头添加新的元素(会自己增加长度属性值)
shiftarr.shift (常用)删除数组开头的第一个元素(会自己减少长度属性值)
poparr.pop (常用)删除数组未尾的第一个元素(会自己减少长度属性值)
splicearr.splice (常用)指定下标来删除元素 (要删除的元素的下标,删除几个)
拓展-应用arr[arr.length-1]可以直接获取数组的最后一个元素
拓展-应用arr[8]='元素'可以指定新增或者修改元素
拓展-应用arr.length=0可以将数组快速删除全部元素
拓展-应用arr=[ ]可以将数组快速删除全部元素
5 数组-拓展:

​ 1 获取数组的最后一个元素 arr[arr.length - 1] 常用的规则!!

arr[arr.length-1]
就可以直接打印出数组中最后一个元素

​ 2 新增或者修改数组元素

​ 1 如果 10这个位置已经有元素 那么 就是修改

​ 2 如果 10这个位置没有元素 添加就可以了 最终数组的度变成 10+1

  arr[10]='南瓜'  

​ 3 数组 可以存放任意类型的数据 可以这么做,但是不建议 我们建议 一个数组内的数据类型要统一!!

let arr = ['西瓜', 100, null, true, NaN, undefined, 80]; 
 4 数组快速清空或者删除元素的方式 
	 arr.length = 0  
数组长度为  0

指定元素删除

      let arr = ['西瓜', '香蕉', '麻瓜'];
      // 现在想要删除 香蕉,麻瓜

      // splice("想要删除的元素的下标","想要删除几个");

      // 删除数组中的下标为1的元素,
      // 从 1 的位置开始 想要删除几个
      arr.splice(1, 2);
      console.log(arr);   // 西瓜

指定元素删除,也可以用于增加

      //  指定位置来插入元素
      // splice("想要删除的元素的下标","想要删除几个","在该下标位置添加元素");

      // 在 1的位置,删除0个元素,增加一个红薯
      // let arr = ['西瓜', '香蕉', '麻瓜'];
      // ['西瓜', '红薯', '香蕉', '麻瓜'];
      arr.splice(1, 0, '红薯');
      console.log(arr);

思维导图:

1648643818039

数组的快键应用:

1648643843201

案例示范:
1 数组-取最大值与最小值案例:
    <script>
        // 求数组最小值也是相同  大于改小于即可

        let arr=[2,6,1,77,52,25,7]
        // 设置一个变量等于数组的第0个元素
        let max=arr[0]
        let min=arr[0]
        for (let index = 0; index < arr.length; index++) {
            // 如果当前数组的值大于 man
            if(arr[index]>max){
            // 就设置  man 等于 这个数组元素
                max=arr[index]
            }
              // 如果当前数组的值小于 min
            if(arr[index]<min){
                 // 就设置  min 等于 这个数组元素
                min=arr[index]
            }
        }
        console.log(max);
        console.log(min);
    </script
2 数组-求和和平均数案例:
     // 数组
      let arr = [2, 6, 1, 7, 4];
      // 存放总的数据
      let sum = 0;
      // 循环
      for (let index = 0; index < arr.length; index++) {
        // 使用变量 来存放数组中的每一个数值
        sum += arr[index];
      }
      console.log(sum); // 和 20
      // 平均值 =   和 / 数组的长度
      console.log(sum / arr.length);
3 数组-过滤应用案例:
        // 取数组1里面大于 10 的放进数组2中
        // 设2个数组,一个存放数字,
        let arr1=[2,0,6,1,77,0,52,1,25,7]
        // 一个存放过滤好的元素
            arr2=[];
         // 对第一个数组进行循环
            for (let index = 0; index < arr1.length; index++) {
        // 第一个数组中的元素,大于10的就被筛选进去
                if(arr1[index]>=10){
        // 把筛选好的元素,添加到新数组中
                    arr2.push(arr1[index])
                }
                
            }
            console.log(arr2);
4 数组-动态柱生成图案列:
    <style>
        *{
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        ul {
            list-style: none;
            border-left: 1px solid #000;
            border-bottom: 1px solid #000;
            width: 1000px;
            height: 600px;
            margin: 100px auto;
            display: flex;
            justify-content: space-around;
            align-items: flex-end;
            color:#333
        }
        li {
           
            position: relative;
            width: 100px;
            background-color: blue;
        }
        /* li:nth-child(1){
            height: 300px;
        }
        li:nth-child(2){
            height: 440px;
        }
        li:nth-child(3){
            height: 120px;
        }
        li:nth-child(4){
            height: 210px;
        } */
        span {
            position: absolute;
            left: 50%;
            top:-21px;
            transform: translateX(-50%);
        }
        div {
            position: absolute;
            top: 100%;
            left: 0;
            width: 100%;
            text-align: center;
        }
    </style>
</head>
<body>
    <script>
        // 先声明ul的变量,然后再让li循环4次
        let liHtml='<ul>'
        //设一个数组为0,让用户输入元素进去再让li继承他的元素
        let liHeight=[]

        // 这里的循环是让用户输入数据,然后再添加到数组中
            for (let index1 = 0; index1 <4; index1++) {
          let num=+prompt(`请输入你第${index1}季度的数据`)
             liHeight.push(num)   
            }

            // 这里的循环的是让 li和里面的标签出现4个 和CSS样式
        for (let index = 0; index < 4; index++) {
        // 在li 里面设CSS样式,继承数组中的元素
            //   取值数组的元素 0~3  所以取  liHeight[index]            
            liHtml+=(`<li style="height:${liHeight[index]}px;">
                         <span>${liHeight[index]}</span>
                         <div>第${index+1}季度</div>
                      </li>`) 
        }
            liHtml+='</ul>'
        document.write(liHtml)
    </script>
</body>

04-JavaScript-函数-作用域-作用域链

函数:

function

是被设计为执行特定任务的代码块

是专门执行特定任务的代码片段

说明:

函数可以把 具有相同 或 相似逻辑 的代码“包裹”起来,通过函数调用执行这些被“包裹”的代码逻辑,这么做的优势 是有利于 精简代码方便复用。

函数的作用

可以 简化代码

      let arr1 = [1, 3, 2, 66, 33, 22];
      let arr2 = [1, 3, 2, 663, 33, 22];
      let arr3 = [1, 3, 2, 665, 33, 22];

    //   调用函数
      let max1 = getMax(arr1);  //66
      let max2 = getMax(arr2);  //663
      let max3 = getMax(arr3);   //665

      console.log(max1, max2, max3);

    //   声明函数
	//取数组的最大值
      function getMax(arr) {
        let max = arr[0];
        for (let index = 0; index < arr.length; index++) {
          if (arr[index] > max) {
            max = arr[index];
          }
        }
        return max;
      }

方便复用

    //   调用函数
      let max1 = getMax(arr1);  //66
      let max2 = getMax(arr2);  //663
      let max3 = getMax(arr3);   //665

      console.log(max1, max2, max3);

封装程序功能

      function getMax(arr) {
        let max = arr[0];
        for (let index = 0; index < arr.length; index++) {
          if (arr[index] > max) {
            max = arr[index];
          }
        }
        return max;
      }
函数使用

先声明语法

	//  函数名
function getMax(){
    //函数体
    document.write('你好')
}

函数名命名规范

和变量命名基本一致

尽量小驼峰式命名法

前缀应该为动词

命名建议:常用动词约定

动词含义
can判断是否可执行某个动作
has判断是否含义某个值
is判断是否为某个值
get获取某个值
set设置某个值
load加载某些数据

目标:掌握函数语法,把代码封装起来

注意:声明(定义)的函数必须调用才会真正被执行,使用 () 调用函数

        function sayHi(){
            document.write(`你真好!<br/>`)
            document.write(`你真棒!<br/>`)
            document.write(`你真潮巴!<br/>`)
        }
	//调用两次,就已经输出2次了  上面已经打印输出
        sayHi();
	    sayHi();

我们曾经使用的 alert() , parseInt() 这种名字后面跟小括号的本质都是函数的调用

函数体:

函数体是函数的构成部分,它负责将相同或相似代码“包裹”起来,直到函数调用时函数体内的代码才 会被执行。函数的功能代码都要写在函数体当中。

函数不调用自己不执行

调用方式: 函数名()

随时调用,随时执行,可重复调用

        function sayHi(){
            //里面的代码就是函数体
            document.write(`你真好!<br/>`)
            document.write(`你真棒!<br/>`)
            document.write(`你真潮巴!<br/>`)
        }
	//调用两次,就已经输出2次了  上面已经打印输出
        sayHi();
	    sayHi();
函数传参(形参,实参)

函数的声明与调用

参数列表

传入数据列表

声明这个函数需要传入几个数据

多个数据用逗号隔开

function 函数名(参数列表){
函数体
}

单个参数

function getMax(num){
    document.write(num*num)
}

多个参数

function getMax(num1,num2){
     document.write(num1+num2)
}

1648736481749

1 形参:声明函数时写在函数名右边小括号里的叫形参(形式上的参数)

2 实参:调用函数时写在函数名右边小括号里的叫实参(实际上的参数)

3 形参可以理解为是在这个函数内声明的变量(比如 num1 = 10)实参可以理解为是给这个变量赋值

4 开发中尽量保持形参和实参个数一致

5 我们曾经使用过的 alert('打印'), parseInt('11'), Number('11') 本质上都是函数调用的传参

6 函数的形参和实参可以有多个

注意: 形参和实参中间要用 逗号 隔开

函数的返回值

定义函数的时候 可以决定函数拥有返回值

return 100; 就是函数返回值

如果函数内部 没有写return 的话 默认就是返回了 undefined

      function getMax() {
        // 100 就是 函数在执行完毕的时候 会返回的数据
        return 100;
      }

      let num1 = getMax(); // num1 =100

      console.log(num1);

1648738342400

用return 返回数据

      /* 
      1 不能同时执行多次return 第一个return生效 
      2 函数内部 如果写了return ,那么它下面的代码就不会执行!! 
      3 如果一个函数 没有写return 相当于 写了 return undefined
       */
      function getMax() {
         return 20;  //return 20 就是他的返回值
     //   return undefined;
      }

      let num = getMax();
      console.log(num);   //20

注意细节:

1 在函数体中使用 return 关键字能将内部的执行结果交给函数外部使用

2 函数内部只能出现 1 次 return,并且 return 后面代码不会再被执行,所以 return 后面的数据不要换行写

3 return会立即结束当前函数

4 函数可以没有 return,这种情况函数默认返回值为 undefined

作用域

作用域概述 :

通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这 个名字的作用域。作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。

1 全局作用域

作用于所有代码执行的 环境(整个 script 标签 内部)或者一个独立的 js 文件

      // script标签内的运行环境就是全局作用域
      let num = 100; // 全局作用域

      function getMax() {
        // 这个区域内就不属于全局作用域
        // 局部作用域 或者 也叫做 函数作用域
        let num2 = 200;
      }

      for (let index = 0; index < 4; index++) {
        // 块级作用域
      }

      while (true) {
        // 块级作用域
      }
      if (true) {
        // 块级作用域
      }
2 局部作用域(函数作用域)

作用于函数内的代码环 境,就是局部作用域。 因为跟函数有关系,所 以也称为函数作用域。

3 块级作用域 { } ;

块作用域由 { } 包括,if语 句和for语句里面的{ }等

变量的作用域 1~3
1 全局变量 (全局有效)

函数外部 let 的变量

全局 变量 在任何区域都 可以访问和修改

      // 直接写在全局作用域下的变量 =  全局变量  在任意的地方来访问

      let num = 100; // 全局变量   在任何地方都可以访问 

      function getMax() {
        console.log('函数 访问全局变量', num);
      }

      getMax();

      for (let index = 0; index < 2; index++) {
        console.log('for循环内 块级作用域 访问全局变量', num);
      }

      if(true){
        console.log("if语句 也 可以访问全局变量",num);
      }
2 局部变量 (局部有效)

函数内部 let 的变量

作用于函数内的代码环 境,就是局部作用域。 因为跟函数有关系,所 以也称为函数作用域

局部变量只能在当前函 数内部访问和修改

      // 局部变量
      // 如果是在函数内部定义的变量 就叫做局部变量
      // 局部变量 不能在 它的大括号之外使用的,否则就会报错!! 
      
      let msg = 10000; // 全局变量

      // 局部变量  函数内部 声明的变量
      function getMax() {
        // 声明一个数字
        let num = 200; // 局部变量
        console.log(num); // 200
      }
      // 函数调用
      getMax();
      // 局部变量 不能在 超出它的大括号来使用
      console.log(num); //会报错
3 块级变量 ( { } 类有效)

{ } 内部的 let 的变量

let定义的变量,

.let定义的变量,只能在 块作用域里访问,不能跨 块访问,也不能跨函数访 问

      // 块级变量 就是我们在块级作用域内 定义的变量
      // 块级变量 类似局部变量,也是超出了自身的大括号 不能使用

      for (let index = 0; index < 2; index++) {
        // num 块级变量 
        let num = 100;
        console.log(num); // 100
      }
      console.log(num);// 使用块级变量  出错!! 

变量有一个坑, 特殊情况:

如果函数内部或者块级作用域内部,变量没有声明,直接赋值,也当全局变量看,但是强烈不推荐 但是有一种情况,函数内部的形参可以看做是局部变量。

function getMax(){
    num=100;  //这个变量在函数体内没有声名,直接赋值,所以可以当做全局变量看,但不推荐
}
console.log(num)  //100
变量访问原则-作用域链

只要是代码,就至少有一个作用域

写在函数内部的局部作用域

如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域

根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访 问,就称作作用域链

就近原则 判断是要根据 函数的定义 来判断 而不是函数的调用

      // 判断当前变量 输出是什么  
      // 就近原则   判断是要根据 函数的定义 来判断 而不是函数的调用 
      // 函数的定义 代码位置来判断  100  这个!! 
   
      let num = 100;
      function func1() {
        let num = 200;
        // 函数的调用 
        fun2();
      }

      // 函数的定义-声明 
      function fun2() {
        //当自己没有值,就会取父级的值(100),而不会去取与他并级的 func1的值(200)  
        console.log(num);
      }
      func1();   //100
匿名函数
1 具名函数

1.声明 : function fn() {}

2.调用: fn()

1.将匿名函数赋值给一个变量,并且通过变量名称进行调用 我们将这个称为函数表达式

2.语法: 函数表达式

let fn = function () {
 //   函数体
}
调用
fn() ;  //函数名()
2.匿名函数: function() {}
      // 匿名函数  = function () {}; 匿名函数 了解即可 

      //    let func2 = function () {};  叫做 函数表达式 
      // 表达式 可以表示结果的一段代码  函数表达式  了解 
      let func2 = function () {
        console.log("123");
      };
      // 调用
      func2(); // '123'
3 自执行函数

1 作用:

​ 防变量污染

​ 执行一次性的任务

2 特点:

在定义函数的同时也执行函数

( ) ( ) 在第一个括号里面放自执行函数体

      // // 自执行函数   ()()   在第一个括号里面放自执行函数体 
      (function () {
        let msg = 123;
        // 设置 页面的标题 =  月薪过万
        document.title = '月薪过万';
        // 设置 页面的背景颜色 =  黄色
        document.body.style.backgroundColor = 'yellow';
      })();

      console.log(msg);
案例示范:
设置时间
    <style>
        div {
            display: flex;
            justify-content: space-evenly;
            align-items: center;
            width: 700px;
            height: 80px;
            background-color: red;
        }
        span {
           display: flex;
           justify-content: center;
            font: 1px;
            font-size: 30px;
            color: aliceblue;
        }
    </style>
</head>
<body>
  
    <script>     
       function getTime(){

        let  num=+prompt('请输入时间')
        // 年
        let year=parseInt(num/60/60/24/30/12)
        year=(year<10 ? '0'+year : year)
        // 月
        let moon=parseInt(num/60/60/24%12)
        moon=(moon<10 ? '0'+moon : moon)
        // 天
        let day=parseInt(num/60/60/24%30)
            day=(day<10 ? '0'+day : day)

        //    时
        let   h= parseInt(num/60/60%24)
            h=(h<10 ?'0'+h : h)
        //    分
        let     m=parseInt(num/60%60)
            m=(m<10 ? '0'+m : m)
        //    秒
        let    s=parseInt(num%60)
            s=(s<10 ? '0'+s : s)
       
        document.write(`
        <div>
        <span>${year}年,</span>
        <span>${moon}月,</span>
        <span>${day}天,</span>
        <span>${h}时,</span>
        <span>${m}分,</span>
        <span>${s}秒</span>
         </div>
        `)
       }
        getTime()
    </script>
</body>

05-JavaScript-对象-Math内置对象

1对象是什么?

1 对象(object):JavaScript 里的一种数据类型

2 可以理解为是一种无序的数据集合

3 用来描述某个事物,例如描述一个人

1人有姓名、年龄、性别等信息、还有吃饭睡觉打代码等功能

​ 2 如果用多个变量保存则比较散,用对象比较统一

比如描述 班主任 信息:

​ 1 静态特征 (姓名, 年龄, 身高, 性别, 爱好) => 可以使用数字, 字符串, 数组, 布尔类型等表示

​ 2 动态行为 (点名, 唱, 跳, rap) => 使用函数表示

2 对象使用

对象声明语法

	对象名
let  person = {
    属性名 : 属性值 ,
    方法名 : 函数
}

对象是有 属性 和 方法 组成的

属性:信息或特征(名词) . 比如 手机尺寸、颜色、重量等…

方法: 功能或叫行为(动词). 比如 手机打电话、发短信、玩游戏,敲代码…

对象的属性

数据描述性的信息称为属性,如人的姓名,身高,年龄,性别等,一般是名词性的

    //   声明一个对象,对象里有属性和方法
    // 属性:特征,基本信息
    // 方法:行为 ,就是一个 函数  函数要是用 函数()
      let person={
    // 属性:特征,基本信息   多个属性要以 逗号 隔开
          uname:'小明',
          age:25,
          sex:'男',
          hobby:'睡觉'
      }
    //   打印数据类型
      console.log(typeof person);
    //   打印对象属性
      console.log(person);

注意:

1 属性都是成 对出现的,包括属性名和值,它们之间使用英文 : 分隔

2 多个属性之间使用英文 , 分隔

3 属性就是依附在对象上的变量(外面是变量,对象内是属性)

4 属性名可以使用 "" 或 '',一般情况下省略,除非名称遇到特殊符号如空格、中横线等

属性访问

声明对象,并添加了若干属性后,可以使用 . 或 [] 获得对象中属性对应的值,我称之为属性访问。

简单理解就是获得对象里面的属性值

属性 . 的访问

let person={
    name:'小明'
}
console.log(person.name)//小明

属性 [ ] 的访问

let person={
    name:'小明'
}
console.log(person['name'])//小明

**注意:**如果打印了对象里面没有的属性,那么就会打印出 undefined

  // 如果打印了对象里面没有的属性,那么就会打印出  undefined
    console.log(goods.aaaa);   //  undefined
对象中的方法

数据行为性的信息称为方法,如跑步、唱歌等,一般是动词性的,其本质是函数。

      let person = {
        name: 'andy',
        sayHi: function (msg) {
          document.write(msg);
          return '来自于 person的问候';
        },
      };

      // 方法 其实就是一个函数
      // 函数 是接收参数
      // 函数 有返回值
      // 函数的使用  函数()
      person.sayHi('大家好 <br/>'); // 页面上会出现  “你好”   1
      person.sayHi(' hello  <br/>'); // 页面上会出现  “你好”   1


      
      let result = person.sayHi(' ');

      console.log("===========");
      console.log(result);//  来自于 person的问候      就会拿到函数的返回值

**注意:**如果使用函数的返回值,

声明一个变量 等于 函数调用 ( ' ' ), 里面必须要加 引号 不然会报错

      let person = {
        sayHi: function () {
          return '来自于 person的问候';
        },
      };
let result = person.sayHi(' ');
      console.log(result);//  来自于 person的问候      就会拿到函数的返回值

1 方法是由方法名和函数两部分构成,它们之间使用 : 分隔

2 多个属性之间使用英文 , 分隔

3 方法是依附在对象中的函数

4 方法名可以使用 "" 或 '',一般情况下省略,除非名称遇到特殊符号如空格、中横线等

对象中的方法访问

声明对象,并添加了若干方法后,可以使用 . 调用对象中函数,我称之为方法调用。

注意: 千万别忘了给方法名后面加小括号

let person = {
    sayHi:function(){
        document.write('你好')
    }
}
//对象名 方法名    
person.sayHi()

对象方法的使用和函数一致

对象方法访问输入容易出错的小问题

1 没加冒号 console.log(person[username]); // 中括号里 代码没有加字符串 表示一个变量

2 没这个属性,全局也没这个变量 console.log(person[color]); // 中括号里 代码没有加字符串 表示一个变量 全局域没有这个变量的话,就会报错

3 对象中没设这个属性 console.log(person.sdfdfdfd); // undefined 对象中没这个属性,就会出 undefined

      let username = 'color';
      let person = {
        username: '海贼王',
        color: 'yellow',
      };

      // 访问它
      console.log(person.username); // 固定用户
      console.log(person['username']); //
      // // person['color'];

      console.log(person[username]); // 中括号里 代码没有加字符串 表示一个变量
      // console.log(person[color]); // 中括号里 代码没有加字符串 表示一个变量  全局域没有这个变量的话,就会报错


      // console.log(person[color]); //  color是一个变量  没有这个变量  报错
      // console.log(person.sdfdfdfd); // undefined
操作对象 - 增 删 改 查 语法

增加属性与修改属性:

1 增加属性和修改属性都是同样的写法

2 如果该属性对象中没有,表示新增

3 如果该属性对象中已经存在,表示修改

      let person = {
        // username: '程序猿',
      };

      // 增加 一个新的属性
      // person.username="普通人";

      // 修改
      person.username = '普通人';

      // 增加属性和修改属性都是同样的写法
      // 如果该属性对象中没有,表示新增
      // 如果该属性对象中已经存在,表示修改
      // person.username = '普通人';

      console.log(person);

增加方法:

也可以动态为对象添加方法,动态添加与直接定义是一样的,只是语法上更灵活

      let person = {};
      // 新增一个方法  匿名函数 固定写法
      person.sayHi = function  () {
        document.write('这个是我们新增的sayHi 方法');
      };
      person.sayHi(); // 调用方法

注:无论是属性或是方法,同一个对象中出现名称一样的,后面的会覆盖前面的。

删除属性: delete

delete person.username;

给属性值前面加 delete 就会删除这个属性,在打印就会报 undefined

      // 声明一个对象
      let person={
        username:"海贼王"
      };
      // 不想看了  给删除掉
      delete person.username;  // 删除对象中的  username属性

      console.log(person.username); // undefined 
3 遍历变量 for in

能够遍历输出对象里面的元素

1 数组和对象 都可以遍历

2 数组的遍历 使用 for循环

3 对象的遍历 使用 forin

4 对对象遍历的时候 可以直接获取到 对象的属性名

5 根据对象的属性名获取对象的熟悉值 person[k]

一定记住: k 是获得对象的属性名, 对象名 [ k ] 是获得 属性值

    // 创建一个对象
      let person = {
        age: 18,
        username: '普通人',
        height: 180,
      };
      // 遍历对象  forin
      for (let k in person) {
        // console.log(k);
        // console.log(person.k); // 找对象中  属性名 "k"
        // console.log(person['k']); //  找对象中  属性名 "k"

        // k 表示变量 k = "username"
        // console.log(person[k]);
        // person["username"] // k 表示变量 k = "username"

        console.log(`属性名:${k}  属性值${person[k]} `);
      }
4 Math 内置对象

Math js内置的数学对象 里面会包含有关于数学操作的相对 方法或者属性

属性含义打印 公式结果
random()返回一个随机数 包含0 不包含1console.log(Math.random());随机数0~1
Math.ceil()向上取整console.log(Math.ceil(0.1));1
Math.floor()下取整console.log(Math.floor(0.9));0
Math.round()四舍五入console.log(Math.round(0.5));1
Math.max()求最大值console.log(Math.max(1,2,3,4,5,6,77,4))77
Math.min()最小值console.log(Math.min(1,2,3,4,5,6,77,4))1
Math.pow()幂运算 对某个数字 平方console.log(Math.pow(2, 2));4
Math.pow()幂运算 对某个数字 立方console.log(Math.pow(2, 3));9
Math.abs()绝对值 只能给负数绝对console.log(Math.abs(-2));2
5 基本数据类型和引用数据类型

基本类型

Number 数字类型, toString 字符串类型, Boolean布尔类型, undefined 未赋值未定义空类型, null 已赋值 未定义空类型,

基本类型会存放在 栈 空间 适合存放具体具体大小的数据, 这一些数据一般变化不会太大

注意:

基本类型

如果只是复制属性 给其他变量 ,那么其他变量改属性值 也不会影响原变量属性值

只要是不更改 原变量属性值 ,那么他就是他原本的 值

164838257299


引用类型

数组 [ ] , 函数 function (){} , 对象 {}

引用类型会存放在 堆 空间 适合存放可能会经常改变大小的数据,这一些数据变化比较大

注意:

引用类型

他们的值的把地址存放在 栈 空间 ,而真正存放数据的是在 堆 空间

如果创建一个新的变量 = 旧的的数据 本质只是把旧的数据的地址复制了一份给新的数据 新旧两个数据地址指向是同一个 堆 空间中的数据 修改了新数据,l旧数据也会被修改

1648382572867

      let num = 100; // 基本数据类型  放心的是复制吧 新旧两个数据 互不影响
      let num2 = num;
      num2 = 10000;
      console.log(num); // 100 互不影响

      let person={username:"悟空"};// 引用数据类型

      let person2=person;  // 引用地址的传递 复制而已  新旧数据 本质是一样的  会收到影响 

      person2.username="八戒";
      console.log(person);// 也是八戒 新旧数据 本质是一样的
6 补充-不常用 (switch-case)-(do-while)
switch-case 条件语句

注意:只能用于 条件===什么 才执行,其他条件都不行

1 switch-case 功能和 if else-if else 一模一样

2 switch-case-break-defaul

① switch(day) 想要对 day做判断

② case 1 : day ===1 满足条件

③ break 打断当前的case

④ default 如果以上的 case 都不满足,最终 执行default里面的代码

      let day = 1;
      switch (day) { // 你要判断谁
        case 1: //  if  (day === 1)
        // 执行 1 的业务逻辑
        console.log('白饭');
        case 2:
          console.log("喝粥");
          break
        case 3:
          console.log("海鲜");
          break
        default:
          // 以上都不满足 就执行代码
          console.log("不吃啦");
      }
do-while (先执行,再判断条件)

1 先执行一次 do里面的代码,然后再去执行while里面的程序

2 哪怕 while里面的条件不成立 也会先执行一次do中的代码

      /* 
      1 循环 3种写法
        1 for 循环
        2 while 循环
        3 do while 循环 很少
          1 先执行一次 do里面的代码,然后再去执行while里面的程序
          2 哪怕  while里面的条件不成立 也会先执行一次do中的代码
       */

      let index = 0;
      do {
        console.log('执行了do 里面的代码',index);
        index++
      } while (false);
案例示范:
1 学生信息收集表

数组与对象总和使用

    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        table {
            width: 800px;
            margin: 100px auto;
            text-align: center;
            border-collapse: collapse;
        }
         th {
            background-color: rgba(102, 102, 102, 0.466);
        }
        
    </style>
</head>
<body>
    <script>
    let students = [
        {name:'小明',age:'18',gender:'男',hometown:'河北省'},
        {name:'小红',age:'19',gender:'女',hometown:'河南省'},
        {name:'小刚',age:'17',gender:'男',hometown:'山西省'},
        {name:'小丽',age:'18',gender:'女',hometown:'山东省'},
    ]
    let tableHtml = ` <table border='1'>
            <caption>学生列表</caption>
            <thead>
            <tr>
                <th>序号</th>
                <th>姓名</th>
                <th>年龄</th>
                <th>性别</th>
                <th>家乡</th>
            </tr>
            </thead>
            <tbody>`;
            //遍历生成tr  根据对象 students里面数组的长度来生 遍历生成tr
        for (let index = 0; index < students.length; index++) {
            //开头
            /*   tableHtml += `<tr><td>${index+1}</td>`;

                <tr>         
                    <td> ${0+1} </td>
                    <td> ${1+1} </td>
                    <td> ${2+1} </td>
                    <td> ${3+1} </td>            
            */
                tableHtml += `<tr><td>${index+1}</td>`;

                  // 对 对象 做 forin遍历  students[index]

                //   k 是获得对象的属性名, 对象名[k] 是获得 属性值
                // (name:'小明',age:'18',gender:'男',hometown:'河北省')
                //[k]:属性名    name   age  gender  hometown
                //students[index][k]:属性值    小明 18  男  河北省
                for (let k in students[index]) {
                //定义一个变量=对象[数组]   person = students[index]   
                // let person = students[index]; // 数组中的每一个对象
                tableHtml += `<td>${person[k]}</td>`;
                /* 
                遍历结果
                <td>小明</td>
                <td>18</td>
                <td>男</td>
                <td>河北省</td>
                */    
                }
             //结尾
             //  </tr>   对应57行的开头<tr>完成一次循环
            tableHtml += `</tr>`
            } 
            // 对应table 表格的开头
        tableHtml += ` </tbody> </table>`;
    document.write(tableHtml);
    console.log(students);
2 随机显示姓名-不重复出现
    <script>
      // 数组
      let arr = [ '赵云','黄忠','关羽','张飞','马超','刘备','曹操','刘婵'];

      function getRandom(min, max) {
        // 区间的 规律
        return Math.round(Math.random() * (max - min) + min);
      }

      // 获取一次 随机数
      // let index = getRandom(0, arr.length - 1);
      // console.log(arr[index]);
      // // 删除数组中的某一个元素
      // arr.splice(index,1);

      // 死循环  只要你数组长度>0  我就执行重复的代码
      while (arr.length > 0) {
        let index = getRandom(0, arr.length - 1);
        console.log(arr[index]);
        arr.splice(index, 1);// 根据元素的下标来删除对应的那个数据  数组中少了一个已经显示过的数据  再次随机输出肯定不会重复
      }
    </script>
3 猜数字-不对就一直执行案例
    <script>
      /* 
      1 打开页面的时候 随机生成1-10的数字 (昨天讲解过 总结公式或者规律)
        num1 
      2 开启循环
        1 弹出输入框 来接收用户的输入 num2
        2 判断num1和num2之间的关系
        3 。。。
          如果 大于
          如果 小于
          如果 等于  循环结束 break
       */

      //  let num1=Math.round( Math.random*(最大值-最小值)+最小值 )
      //  let num1=Math.round( Math.random*(10-1)+1 )

      // 这一种方法可以实现  使用这种方法来完成案例
      // 案例都完成了, 还没有其他的方式来实现区间 
      let num1 = Math.round(Math.random() * 9 + 1);// 计算区间的做法不唯一 

      // 死循环
      while (true) {
        let num2 = +prompt('请输入你要猜测的数字');

        if (num2 > num1) {
          alert('你猜大啦');
        } else if (num2 < num1) {
          alert('你猜小啦');
        } else {
          alert('你猜对了' + num2);
          break; // 终止while循环
        }
      }
    </script>
4 学成在线页面渲染案例

利用for循环 把里面 重复的 li 标签 以及 内容打印出来,而不用自己去更换

1648987229204

<!-- 
  1 引入style.css
  2 引入 data.js
  3 根据data.js中的data数组 来遍历生成代码 
    最终让网页显示出来 data数组的数据
 -->
 <!DOCTYPE html>
 <html lang="en">
 <head>
   <meta charset="UTF-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>Document</title>
   <link rel="stylesheet" href="./style.css">
 </head>
 <body>
  <!-- <div class="box w">
    <div class="box-hd">
      <h3>精品推荐</h3>
      <a href="#">查看全部</a>
    </div>
    <div class="box-bd">
      <ul class="clearfix">
        <li>
          <img src="images/course01.png" alt="" />
          <h4>
            Think PHP 5.0 博客系统实战项目演练
          </h4>
          <div class="info">
            <span>高级</span> • <span>1125</span>人在学习
          </div>
        </li>
      </ul>
    </div>
  </div> -->


   <script src="./data/data.js"></script>
   <script>
    //  声明一个变量,等于这个标签样式与结构
    // 开头
     let html=`
     <div class="box w">
    <div class="box-hd">
      <h3>精品推荐</h3>
      <a href="#">查看全部</a>
    </div>
    <div class="box-bd">
      <ul class="clearfix">
     `
    // 中间遍历重复内容
        for (let index = 0; index < data.length; index++) {
          html+=`
         <li>
          <img src="${data[index].src}" alt="" />
          <h4>
            ${data[index].title}
          </h4>
          <div class="info">
            <span>高级</span><span>${data[index].num}</span>人在学习
          </div>
        </li>
           `
          
        }

    //  结尾
    html+=`
     </ul>
    </div>
  </div> `
  // 打印在网页中
  document.write(html)
   </script>
 </body>
 </html>