JavaScript基础

目录

JavaScript基础day1

JavaScript简介和体验

JavaScript的组成(有什么?)

ECMAScript:

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

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

Web APIs :

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

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

在这里插入图片描述

JavaScript书写位置

1. 内部 JavaScript

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

规范:script标签写在</body>上面

拓展: alert(‘你好,js’) 页面弹出警告对话框

<body>
  <script>
    alert('你好,js')
  </script>
</body>

2. 外部 JavaScript

代码写在以.js结尾的文件里

**语法:**通过script标签,引入到html页面中。

<script src="my.js"></script>

⭕️script标签中间无需写代码,否则会被忽略!

⭕️外部JavaScript会使代码更加有序,更易于复用,且没有了脚本的混合,HTML 也会更加易读,因此这是个好的习惯。

3. 内联 JavaScript

代码写在标签内部

语法:

<body>
  <button onclick="alert('逗你玩~')"></button>
</body>

注意: 此处作为了解即可,但是后面vue框架会用这种模式

JavaScript注释和结束符

JavaScript注释

  • 单行注释

    符号://

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

    **快捷键:**ctrl + /

  • 块注释

    符号:**/* */

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

    **快捷键:**shift + alt + A

JavaScript结束符

作用: 使用英文的 ; 代表语句结束

实际情况: 实际开发中,可写可不写, 浏览器(JavaScript 引擎) 可以自动推断语句的结束位置

现状: 在实际开发中,越来越多的人主张,书写 JavaScript 代码时省略结束符

约定: 为了风格统一,结束符要么每句都写,要么每句都不写(按照团队要求.)

JavaScript输入和输出语句和字面量

1、输出语法:

语法1:

document.write('我是div标签')
document.write('<h1>我是标题</h1>')

在这里插入图片描述

作用: 向body内输出内容

注意: 如果输出的内容写的是标签,也会被解析成网页元素

语法2:

alert('你好,js~')

在这里插入图片描述

作用: 页面弹出警告对话框

语法3:

 console.log('看看对不对')

在这里插入图片描述

作用: 控制台输出语法,程序员调试使用

2、输入语法

语法:

prompt('请输入你的年龄:')

在这里插入图片描述

作用: 显示一个对话框,对话框中包含一条文字信息,用来提示用户输入文字

字面量

在计算机科学中,字面量(literal)是在计算机中描述 事/物

比如:

我们工资是:1000, 此时 1000 就是数字字面量

‘黑马程序员’ :字符串字面量

[] 数组字面量, {} 对象字面量 ,等等

变量

变量的基本使用

1. 声明变量:

要想使用变量,首先需要创建变量(也称为声明变量或者定义变量)

语法:

let 变量名;
  • 声明变量有两部分构成:声明关键字、变量名(标识)
  • let 即关键字 (let: 允许、许可、让、要),所谓关键字是系统提供的专门用来声明(定义)变量的词语

举例:

let age;

我们声明了一个age变量

age 即变量的名称,也叫标识符

2. 变量赋值:

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

// 1.声明一个变量
let age;
// 2.age变量赋值为18
age = 18;
// 3.输出age变量
alert(age)

// 声明的同时直接赋值,变量的初始化
    let age = 18

⭕️是通过变量名来获得变量里面的数据

3. 更新变量:

变量赋值后,还可以通过简单地给它一个不同的值来更新它。

let age = 18
age = 19
console.log(age)

⭕️ let 不允许多次声明一个变量。

在这里插入图片描述

4. 声明多个变量:

变量赋值后,还可以通过简单地给它一个不同的值来更新它。

语法: 多个变量中间用逗号隔开。

let age = 18,name = 'pink'

说明:看上去代码长度更短,但并不推荐这样。为了更好的可读性,请一行只声明一个变量。

let age = 18
let name = 'pink'

交换两个变量案例

    let num1 = 10
    let nun2 = 20
    let temp
    temp = num1
    num1 = num2
    num2 = temp
    console.log(num1, num2)

变量的本质和命名规则

变量的本质

变量命名规则与规范

规则: 必须遵守,不遵守报错 (法律层面)

规范: 建议,不遵守不会报错,但不符合业内通识 (道德层面)

1. 规则:

  • 不能用关键字

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

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

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

2. 规范:

  • 起名要有意义

  • 遵守小驼峰命名法

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

变量拓展-var和let的区别

let 和 var 区别:

在较旧的JavaScript,使用关键字 var 来声明变量 ,而不是 let。

var 现在开发中一般不再使用它,只是我们可能再老版程序中看到它。

let 为了解决 var 的一些问题。

var 声明:

  • 可以先使用在声明 (不合理)
  • var 声明过的变量可以重复声明(不合理)
  • 比如变量提升、全局变量、没有块级作用域等等

变量拓展-数组的基本使用

1. 声明语法

let arr = [数据1,数据2,...,数据n]

🌰

let arr = ['小明','小红','小刚','小丽']
  • 数组是按顺序保存,所以每个数据都有自己的编号
  • 计算机中的编号从0开始,所以小明的编号为0,小刚编号为1,以此类推
  • 在数组中,数据的编号也叫索引或下标
  • 数组可以存储任意类型的数据

2. 取值语法

数组名[下标]

🌰

let names = ['小明','小刚','小红','小丽','小米']
names[0] // 小明 
names[1] // 小刚
  • 通过下标取数据
  • 取出来是什么类型的,就根据这种类型特点来访问

3. 一些术语:

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

下标: 数组中数据的编号

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

let names = ['小明','小刚','小红','小丽','小米']
console.log(names.length) // 5

常量

概念: 使用 const 声明的变量称为“常量”。

使用场景: 当某个变量永远不会改变的时候,就可以使用 const 来声明,而不是let。

命名规范: 和变量一致

常量使用:

    const G = 9.8
    console.log(G)

⭕️常量不允许重新赋值,声明的时候必须赋值(初始化)

数据类型

数据类型

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

基本数据类型:

  • number 数字型
  • string 字符串型
  • boolean 布尔型
  • undefined 未定义型
  • null 空类型

引用数据类型:

  • object 对象
数据类型 – 数字类型(Number)

JavaScript 中的正数、负数、小数等 统一称为 数字类型。

    let age = 18 // 整数
    let price = 88.99 //小数

⭕️JS 是弱数据类型,变量到底属于哪种类型,只有赋值之后,我们才能确认。Java是强数据类型 例如 int a = 3 必须是整数

算术运算符:

  • +:求和
  • -:求差
  • *:求积
  • /:求商
  • %:取模(取余数)(开发中经常作为某个数字是否被整除)

算术运算符执行的优先级顺序:

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

  • 乘、除、取余优先级相同

  • 加、减优先级相同

  • 乘、除、取余优先级大于加、减

  • 使用 () 可以提升优先级

    总结: 先乘除后加减,有括号先算括号里面的。

🐱
NaN (No a Number)代表一个计算错误。它是一个不正确的或者一个未定义的数学操作所得到的结果

console.log('老师' - 2)

在这里插入图片描述

NaN 是粘性的。任何对 NaN 的操作都会返回 NaN

    console.log(NaN - 2) // NaN
数据类型 – 字符串类型(string)

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

  let str = 'pink'
  let str1 = "pink"
  let str2 = `中文`
  let str3 = '' // 这种情况叫空字符串

⭕️无论单引号或是双引号必须成对使用

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

    let str = 'pink老师讲课'很好'' // 错误
    let str = 'pink老师讲课"很好"' // 正确

⭕️必要时可以使用转义符 \,输出单引号或双引号

    let str = 'pink老师讲课\'很好\''

字符串拼接:

场景: + 运算符 可以实现字符串的拼接。

口诀:数字相加,字符相连

    document.write('我叫' + '刘德华') // 我叫刘德华

模版字符串

**使用场景:**拼接字符串和变量

在没有它之前,要拼接变量比较麻烦:

document.write('大家好,我叫'+ name + ',今年' + age + '岁')

语法

  • `` (反引号)

    🐱在英文输入模式下按键盘的tab键上方那个键(1左边那个键)

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

document.write(`大家好,我叫${name},今年${age}岁了`)
数据类型 – 布尔类型(boolean)

表示肯定或否定时在计算机中对应的是布尔类型数据。

它有两个固定的值 true 和 false,表示肯定的数据用 true(真),表示否定的数据用 false(假)。

    let isColl = true
    console.log(isColl) // true
数据类型 – 未定义类型(undefined)

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

什么情况出现未定义类型?

只声明变量,不赋值的情况下,变量的默认值为 undefined,一般很少【直接】为某个变量赋值为 undefined。

    let age
    document.write(age) // underfined

工作中的使用场景:

我们开发中经常声明一个变量,等待传送过来的数据。

如果我们不知道这个数据是否传递过来,此时我们可以通过检测这个变量是不是undefined,就判断用户是否有数据传递过来。

数据类型 – null(空类型)

JavaScript 中的 null 仅仅是一个代表“无”、“空”或“值未知”的特殊值

    let obj = null
    console.log(obj) // null

null 和 undefined 区别:

undefined 表示没有赋值

null 表示赋值了,但是内容为空

    console.log(undefined + 1)
    console.log(null + 1)

null 开发中的使用场景:

官方解释:把 null 作为尚未创建的对象

大白话: 将来有个变量里面存放的是一个对象,但是对象还没创建好,可以先给个null

控制台输出语句和检测数据类型

1.控制台输出语句:

控制台语句经常用于测试结果来使用。

可以看出数字型和布尔型颜色为蓝色,字符串和undefined颜色为灰色

在这里插入图片描述

2. 通过 typeof 关键字检测数据类型

typeof 运算符可以返回被检测的数据类型。它支持两种语法形式:

  1. 作为运算符: typeof x (常用的写法)
  2. 函数形式: typeof(x)

换言之,有括号和没有括号,得到的结果是一样的,所以我们直接使用运算符的写法。

    let age = 18
    let name = '刘德华'
    let flag = false
    let buy
    console.log(typeof age) // number
    console.log(typeof name) // string
    console.log(typeof flag) // boolean
    console.log(typeof buy) // undefined

类型转换

JavaScript是弱数据类型: JavaScript也不知道变量到底属于那种数据类型,用表单、prompt 获取过来的数据默认是字符串类型的,此时就不能直接简单的进行加法运算。

此时需要转换变量的数据类型。通俗来说,就是把一种数据类型的变量转换成我们需要的数据类型。

隐式转换

某些运算符被执行时,系统内部自动将数据类型进行转换,这种转换称为隐式转换。

规则:

  • 号两边只要有一个是字符串,都会把另外一个转成字符串
  • 除了+以外的算术运算符 比如 - * / 等都会把数据转成数字类型
    console.log(11 + 11) // 22
    console.log(11 + '11') // 1111
    console.log('11' - 11) // 0
    console.log('11' * 11) // 121
    console.log('11' / 11) // 1

缺点:

转换类型不明确,靠经验才能总结

🐱小技巧:

  • +号作为正号解析可以转换成数字型
    console.log(typeof +'123') // number
  • 任何数据和字符串相加结果都是字符串

显式转换

编写程序时过度依靠系统内部的隐式转换是不严谨的,因为隐式转换规律并不清晰,大多是靠经验总结的规律。

为了避免因隐式转换带来的问题,通常根据逻辑需要对数据进行显示转换。

概念:

自己写代码告诉系统该转成什么类型

⭐️转换为数字型:

Number(数据)

  • 转成数字类型
  • 如果字符串内容里有非数字,转换失败时结果为 NaN(Not a Number)即不是一个数字
  • NaN也是number类型的数据,代表非数字
    let num = prompt('输入年薪')
    console.log(Number(num))

parseInt(数据)

  • 只保留整数

parseFloat(数据)

  • 可以保留小数
    console.log(parseInt('12px')) // 12
    console.log(parseInt('12.34px')) // 12

    console.log(parseFloat('12px')) // 12
    console.log(parseFloat('12.34px')) // 12.34

⭐️转换为字符型:

String(数据)

变量.toString(进制)

综合案例-渲染表格案例

<!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>
    h2 {
      text-align: center;
    }

    table {
      /* 合并相邻边框 */
      border-collapse: collapse;
      height: 80px;
      margin: 0 auto;
      text-align: center;
    }

    th,
    td {
      padding: 5px 30px;
    }

    table,
    th,
    td {
      border: 1px solid #000;
    }
  </style>
</head>

<body>
  <h2>订单确认</h2>

  <script>
    // 1.用户输入
    let price = +prompt('请输入商品价格')
    let num = +prompt('请输入商品数量')
    let address = prompt('请输入收货地址')
    // 2.计算总额
    let total = num * price
    // 3. 页面打印渲染
    document.write(`
      <table>
    <tr>
      <th>商品名称</th>
      <th>商品价格</th>
      <th>商品数量</th>
      <th>总价</th>
      <th>收货地址</th>
    </tr>
    <tr>
      <td>小米手机青春PLUS</td>
      <td>${price}元</td>
      <td>${num}</td>
      <td>${total}元</td>
      <td>${address}</td>
    </tr>
      `)
  </script>
  </table>
</body>

</html>

在这里插入图片描述

常见错误

❌Missing initializer in const declaration.

const声明中缺少初始化式

    const age
    console.log(age) // 错误。const必须有赋值操作
  • const 声明的时候必须要赋值,进行初始化

❌Uncaught ReferenceError:age is not defined.

	console.log(age) // 没有age变量
  • 提示 age变量没有定义过
  • 很可能 age 变量没有声明和赋值
  • 或者我们输出变量名和声明的变量不一致引起的(简单说写错变量名了)

❌Identifier ‘age’ already been declared.

标识符’年龄’已经声明

   let age = 18
   let age = 21
   console.log(age) // 错误,let不允许重复声明
  • 提示 “age”已经声明
  • 很大概率是因为重复声明了一个变量。
  • 注意let 或者const 不允许多次声明同一个变量

❌Assignment to constant variable.

常变量赋值

const age = 18
age = 19
console.log(age) // 错误,常量不能被重新赋值
  • 常量被重新赋值了
  • 常量不能被重新赋值

JavaScrip基础day2

运算符

赋值运算符

赋值运算符:对变量进行赋值的运算符

  • = (将等号右边的值赋予给左边, 要求左边必须是一个容器)

其他赋值运算符:

  • +=
  • -=
  • *=
  • /=
  • %=

一元运算符

自增:

符号:++

作用:让变量的值 +1

自减:

符号:–

作用:让变量的值 -1

🐱自增运算符的用法:

后置自增:

前置自增:先自加再使用(记忆口诀:++在前 先加)

let i = 1
let sum = ++i + 2 // i=2,sum=4

前置自增:

后置自增:先使用再自加(记忆口诀:++在后 后加)

let i = 1
let sum = i++ + 2 // i=2,sum=3

🐱面试题

let i = 1
console.log(i++ + ++i + i) // 1 + 3 + 3 = 7

比较运算符

⭐️比较运算符:

  • >: 左边是否大于右边
  • <: 左边是否小于右边
  • >=: 左边是否大于或等于右边
  • <=: 左边是否小于或等于右边
  • ==: 左右两边值是否相等
  • ===: 左右两边是否类型和值都相等
  • !=:左右两边值是否不相等
  • !==: 左右两边是否不全等

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

    console.log(2 == 2) // true
    console.log(2 == '2') // true
    console.log(2 === '2') // false
    console.log('2' === '2') // true

对比:

= 单等是赋值

== 是判断

=== 是全等

开发中判断是否相等,强烈推荐使用 ===

⭐️字符串比较

:是比较的字符对应的ASCII码

  • 从左往右依次比较
  • 如果第一位一样再比较第二位,以此类推
  • 比较的少,了解即可
    console.log('a' < 'b') // true
    console.log('aa' < 'ab') // true
    console.log('aa' < 'aab') // true

⭐️NaN不等于任何值,包括它本身

涉及到"NaN“ 都是false

console.log(NaN === NaN) // false

⭐️尽量不要比较小数,因为小数有精度问题

⭐️不同类型之间比较会发生隐式转换

    console.log(2 == '2') // true
  • 最终把数据隐式转换转成number类型再比较
  • 所以开发中,如果进行准确的比较我们更喜欢 === 或者 !==

逻辑运算符

逻辑运算符:

符号名称日常读法特点口诀
&&逻辑与并且符号两边都为true结果才为true一假则假
||逻辑或或者符号两边有一个true就为true一真则真
!逻辑非取反true变false,false变true真变假,假变真

运算符优先级

运算符优先级

优先级运算符顺序
1小括号()
2一元运算符++ – !
3算术运算符先 * / % 后 + -
4关系运算符> >= < <=
5相等运算符== != === !===
6逻辑运算符先 && 后 ||
7赋值运算符=
8逗号运算符,
  • 一元运算符里面的逻辑非优先级很高
  • 逻辑与比逻辑或优先级高

语句

分支语句

If分支语句
单分支
if(条件){
	满足条件要执行的代码
}
双分支
if(条件){
	满足条件要执行的代码
}else{
	满足条件要执行的代码
}
多分支
if(条件1){
	代码1
}else if(条件2){
	代码2
}else if(条件3){
	代码3
}else if(条件4){
	代码4
}else{
	代码n
}
三元运算符

使用场景: 其实是比 if 双分支 更简单的写法,可以使用 三元表达式

符号:? 与 : 配合使用

语法

条件 ? 满足条件执行的代码 : 满足条件执行的代码
switch语句

释义:

  • 找到跟小括号里数据全等的case值,并执行里面对应的代码
  • 若没有全等 === 的则执行default里的代码

例:数据若跟值2全等,则执行代码2

switch(数据){
	case 值1:
		代码1
		break
	case 值2:
		代码2
		break	
	default:
		代码n
		break
}

⭕️switch case语句一般用于等值判断,不适合于区间判断

⭕️switch case一般需要配合break关键字使用 没有break会造成case穿透

循环结构

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

  • 浏览器打开调试界面

(按F12打开开发者工具,或者右键>检查)

  1. 点到sources一栏
  2. 选择代码文件
  3. 打断点
  4. 刷新一下
  5. 调试下一步

在这里插入图片描述

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

在这里插入图片描述

点击watch,点击+,检测变量

while循环

**循环:**重复执行一些操作, while : 在…. 期间, 所以 while循环 就是在满足条件期间,重复执行某些代码。

1.while 循环基本语法

while(循环条件){
	要重复执行的代码(循环体)
}

2.while 循环三要素

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

所以,while循环需要具备三要素:

  1. 变量起始值
  2. 终止条件(没有终止条件,循环会一直执行,造成死循环)
  3. 变量变化量(用自增或者自减)

循环退出

循环结束:

  • break:退出循环
  • continue:结束本次循环,继续下次循环

区别:

  • continue 退出本次循环,一般用于排除或者跳过某一个选项的时候, 可以使用continue
  • break 退出整个循环,一般用于结果已经得到, 后续的循环不需要的时候可以使用

综合案例-ATM取款机

<body>
  <script>
        let sum = 100
        while (true) {
          let flog = +prompt('请选择你的操作:1.取款 2.存款 3.查看余额 4.退出')
          if (flog === 1) {
            let num = +prompt('请输入要取的数额')
            sum -= num
          } else if (flog === 2) {
            let num = +prompt('请输入要存的数额')
            sum += num
          } else if (flog === 3) {
            alert(`余额还剩${sum}元`)
          } else if (flog === 4) {
            break
          }
        } 
  </script>
</body>
<body>
  <script>
    let sum = 100
    let num = 0
    while (true) {
      let re = +prompt(`
      请您选择操作:
      1.取款 
      2.存款 
      3.查看余额 
      4.退出
      `)

      if (re === 4) {
        break
      }
      switch (re) {
        case 1:
          num = +prompt('请输入要取的数额')
          sum -= num
          break
        case 2:
          num = +prompt('请输入要存的数额')
          sum += num
          break
        case 3:
          alert(`余额还剩${sum}元`)
          break
      }
    }
  </script>
</body>

在这里插入图片描述

javas基础day3

循环-for

for循环基本使用

1. for循环语法
  • 作用:重复执行代码
  • 好处:把声明起始值、循环条件、变化值写到一起,让人一目了然,它是最常使用的循环形式
for(变量起始值;终止条件;变量变化量){
	// 循环体
}
2. 退出循环
  • continue 退出本次循环,一般用于排除或者跳过某一个选项的时候, 可以使用continue
    -break退出整个for循环,一般用于结果已经得到, 后续的循环不需要的时候可以使用

了解:

1.while(true)来构造“无限”循环,需要使用break退出循环。

2. for(;;)也可以来构造“无限”循环,同样需要使用break退出循环。

循环嵌套

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

for(外部声明记录循环次数的变量;循环条件;变化值){
	for(内部声明记录循环次数的变量;循环条件;变化值){
		// 循环体
	}
}

数组

数组:是一种可以按顺序保存数据的数据类型

数组的基本使用

1.声明语法
let 数组名 = [数据1,数据2,...,数据n]
let arr = new Array(数据1,数据2,...,数据n)

🌰例:

let name = ['小明','小刚','小红','小丽','小米']
2.取值语法
数组名[下标]

🌰例:

let names = ['小明','小刚','小红','小丽','小米']
names[0] // 小明
names[1] // 小刚
3.一些术语
  • 元素:数组中保存的每个数据都叫数组元素
  • 下标:数组中数据的编号
  • 长度:数组中数据的个数,通过数组的length属性获得
let names = ['小明','小刚','小红','小丽','小米']
console.log(names.length) // 5
4.遍历数组(重点)

用循环把数组中每个元素都访问到,一般会用for循环遍历

语法

for(let i = 0;i <数组名.length;i++){
	数组名[i]
}

🌰例:

let nums = [10,20,30,40,50]
for(let i = 0;i <nums.length;i++){
	document.write(num[i])
}

操作数组

操作数组-新增

⭐️数组.push() 方法将一个或多个元素添加到数组的末尾,并返回该数组的新长度 (重点)

语法

arr.push(元素1,...,元素n)

🌰例:

	let arr = ['red','green']
    arr.push('pink','hotpink')
    console.log(arr) // ['red','green','pink','hotpink']

⭐️arr.unshift(新增的内容) 方法将一个或多个元素添加到数组的开头,并返回该数组的新长度

语法

arr.unshift(元素1,...,元素n)

🌰例:

    let arr = ['red','green']
    arr.unshift('pink','hotpink')
    console.log(arr) // ['pink','hotpink','red','green']
操作数组-删除

⭐️数组. pop() 方法从数组中删除最后一个元素,并返回该元素的值

语法

arr.pop()

🌰例:

    let arr = ['red','green']
    arr.pop()
    console.log(arr) // ['red']

⭐️数组. shift() 方法从数组中删除第一个元素,并返回该元素的值

语法

arr.shift()

🌰例:

    let arr = ['red','green']
    arr.shitf()
    console.log(arr) // ['green']

⭐️数组. splice() 方法 删除指定元素

语法

arr.splice(start,deleteCount)
arr.splice(起始位置,删除几个元素)

start 起始位置:指定修改的开始位置(从0计数)

deleteCount:表示要移除的数组元素的个数。(可选的。 如果省略则默认从指定的起始位置删除到最后。)

数组排序

⭐️数组. sort() 方法可以排序

语法:

    let arr = [4,2,5,1,3]
    // 1.升序排列写法
    arr.sort(function(a,b){
      return a - b
    })
    console.log(arr) // [1,2,3,4,5]
    
    let arr = [4,2,5,1,3]
    // 1.降序排列写法
    arr.sort(function(a,b){
      return b - a
    })
    console.log(arr) // [5,4,3,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>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    .box {
      display: flex;
      /*定义为一个弹性容器*/
      width: 700px;
      /*容器宽度(700px)*/
      height: 300px;
      /*高度(300px)*/
      border-left: 1px solid pink;
      border-bottom: 1px solid pink;
      /*左边框和底边框为粉色实线*/
      margin: 50px auto;
      /* 50px:这指定了元素的上边距(margin-top)和下边距(margin-bottom)都为50像素
auto:这指定了元素的左边距(margin-left)和右边距(margin-right)为自动(auto) */
      justify-content: space-around;
      /* 每个弹性项目之间的空间相等。
每个弹性项目与容器边缘之间的空间也相等,但这个空间是项目间空间的一半 */
      align-items: flex-end;
      /* 将所有弹性项目对齐到容器的交叉轴末端 */
      text-align: center;
      /* 元素内的文本内容在水平方向上居中对齐 */
    }

    .box div {
      display: flex;
      width: 50px;
      background-color: pink;
      flex-direction: column;
      /* 性容器内弹性项目的排列方向为垂直 */
      justify-content: space-between;
      /* 控制垂直对齐? */
    }

    .box div span {
      margin-top: -20px;
    }

    .box div h4 {
      margin-bottom: -35px;
      width: 70px;
      margin-left: -10px;
    }
  </style>
</head>

<body>
  <script>
    // 1. 四次弹框效果
    let arr = []
    for (let i = 1; i <= 4; i++) {
      // let num = prompt(`请输入第${i}季度的数据:`)
      // arr.push(num)
      arr.push(prompt(`请输入第${i}季度的数据:`))
    }

    document.write(` <div class="box">`)
    for (let i = 0; i < arr.length; i++) {
      document.write(`
              <div style="height: ${arr[i]}px;">
                <span>${arr[i]}</span>
                <h4>第${i + 1}季度</h4>
              </div>          
            `)
    }
    document.write(` </div>`)

  </script>
</body>

</html>

在这里插入图片描述
在这里插入图片描述

JavaScript基础day4

函数

说明:

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

比如我们前面使用的 alert() 、 prompt() 和 console.log() 都是一些 js 函数,只不过已经封装好了,我们直接使用的。

函数使用

⭐️函数的声明语法

function 函数名(){
	函数体
}

🌰例:

function sayHi(){
	document.write('hai~~')
}

函数名命名规范

  • 和变量命名基本一致
  • 尽量小驼峰式命名法
  • 前缀应该为动词
  • 命名建议:常用动词约定
动词含义
can判断是否可执行某个动作
has判断是否含义某个值
is判断是否为某个值
get获取某个值
set设置某个值
load加载某些数据

🌰例:

function getName(){}
function addSquares(){}

⭐️函数的调用语法:

函数名()

🌰例:

sayHi()

函数传参

~

function getSum(num1,num2){ // 形参
 document.write(num1 + num2)
}
getSum(10,20) // 实参

⭕️

  • 形参:声明函数时写在函数名右边小括号里的叫形参(形式上的参数)
  • 实参:调用函数时写在函数名右边小括号里的叫实参(实际上的参数)
  • 形参可以理解为是在这个函数内声明的变量(比如 num1 = 10)实参可以理解为是给这个变量赋值
  • 开发中尽量保持形参和实参个数一致
  • 我们曾经使用过的 alert(‘打印’),parseInt(‘11’),Number(‘11’) 本质上都是函数调用的传参
函数传参-参数默认值

形参: 可以看做变量,但是如果一个变量不给值,默认是undefined

但是如果做用户不输入实参,undefined + undefined 结果是NaN

我们可以改进下,用户不输入实参,可以给 形参默认值,可以默认为 0, 这样程序更严谨,可以如下操作:

function getSum(x = 0,y = 0){
	document.write(x + y)
}
getSum() // 结果是0,而不是NaN
getSum(1,2) // 结果是3

⭕️这个默认值只会在缺少实参参数传递时 才会被执行,所以有参数会优先执行传递过来的实参, 否则默认为undefined

函数返回值

~

function getSum(x,y){
	renturn x + y
}
let num = getSum(10,20)
document.write(num) // 30

⭕️

  • 在函数体中使用 return 关键字能将内部的执行结果交给函数外部使用
  • return 后面代码不会再被执行,会立即结束当前函数,所以 return 后面的数据不要换行写
  • return函数可以没有 return,这种情况函数默认返回值为 undefined

⭕️函数细节补充

  • 两个相同的函数后面的会覆盖前面的函数
  • 在Javascript中 实参的个数和形参的个数可以不一致
  • 如果形参过多 会自动填上undefined (了解即可)
  • 如果实参过多 那么多余的实参会被忽略 (函数内部有一个arguments,里面装着所有的实参)
  • 函数一旦碰到return就不会在往下执行了 函数的结束用return

作用域

作用域分成

  • 全局作用域:函数外部或者整个script 有效
  • 局部作用域:也称为函数作用域,函数内部有效

根据作用域不同,变量分为

  • 全局变量:全局变量在任何区域都可以访问和修改
  • 局部变量:只能在当前函数内部访问和修改

⭕️

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

如果函数内部,变量没有声明,直接赋值,也当全局变量看,但是强烈不推荐

但是有一种情况,函数内部的形参可以看做是局部变量。

变量的访问原则

  • 只要是代码,就至少有一个作用域
  • 写在函数内部的局部作用域
  • 如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域
  • 🍎访问原则:在能够访问到的情况下 先局部, 局部没有在找全局

匿名函数

1.函数表达式

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

⭐️语法:

let fn = function(){
	// 函数体
}

调用

fn()
2.立即执行函数

场景介绍: 避免全局变量之间的污染

⭐️语法

// 方式1
(function(){ console.log(11)})();

// 方式2
(function(){ console.log(11)}());

// 不需要调用,立即执行

⭕️ 多个立即执行函数要用;隔开,要不然会报错

综合案例

在这里插入图片描述

<!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>
  <script>
    let second = +prompt('请输入总秒数:')
    function count(t) {
      let h = parseInt(t / 60 / 60)
      let m = parseInt(t / 60 % 60)
      let s = parseInt(t % 60)
      //数字补0
      h = h < 10 ? '0' + h : h
      m = m < 10 ? '0' + m : m
      s = s < 10 ? '0' + s : s
      return `转换完毕之后是:${h}时${m}分${s}秒`![7](D:/gif/7.gif)
    }
    let str = count(second)
    document.write(str)
  </script>
</body>

</html>

在这里插入图片描述

逻辑中断

开发中,还会见到以下的写法:

function getSum(x,y){
	x = x || 0
	y = y || 0
	console.log(x + y)
}
getSum(1,2)

其实类似参数的默认值写法

1.逻辑运算符里的短路

  • 短路:只存在于 && 和 || 中,当满足一定条件会让右边代码不执行
符号短路条件
&&左边为false就短路
||左边为true就短路
  • 原因:通过左边能得到整个式子的结果,因此没必要再判断右边
  • 运算结果:无论 && 还是 || ,运算结果都是最后被执行的表达式值,一般用在变量赋值

2.转换为Boolean型

显示转换:

记忆‘’ 、0、undefined、null、false、NaN 转换为布尔值后都是false, 其余则为 true

    console.log(false && 20)// false
    console.log(5<3 && 20)// flase
    console.log(undefined && 20)//undefined
    console.log(nu11 && 20)//null
    console.log(0 && 20)//0
    console.log(10 && 20)// 20

    console.log(false || 20)//20
    console.log(5<3 || 20)// 20
    console.log(undefined || 20)//20
    console.log(null || 20)//20
    console.log(0 || 20)//20
    console.log(10 || 20)//10

隐式转换:

  1. 有字符串的加法 “” + 1 ,结果是 “1”
  2. 减法 - (像大多数数学运算一样)只能用于数字,它会使空字符串 “” 转换为 0
  3. null 经过数字转换之后会变为 0
  4. undefined 经过数字转换之后会变为 NaN
    console.log('' + 1) // 1
    console.log('' - 1) // -1 ,''转换为0 
    console.log(null + 1) // 1 , null转换为0
    console.log(undefined + 1) // NaN
    console.log(NaN + 1) // NaN

在这里插入图片描述

JavaScript基础day5

对象

对象是什么?

  • 对象(object):JavaScript里的一种数据类型
  • 可以理解为是一种无序的数据集合, 注意数组是有序的数据集合
  • 用来描述某个事物,例如描述一个人

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

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

  • 比如描述 班主任 信息:

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

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

对象使用

1.对象声明语法
let 对象名 = {}

let 对象名 = new Object

🌰例如:

// 声明了一个person的对象
let person = {}
2.对象有属性和方法组成

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

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

let 对象名 = {
	属性名:属性值,
	方法名:函数
}
3. 属性
  • 数据描述性的信息称为属性,如人的姓名、身高、年龄、性别等,一般是名词性的。
let obj = {
	uname:'pink老师',
	age:18,
	gender:'女'
}

⭕️

  • 属性都是成 对出现的,包括属性名和值,它们之间使用英文:分隔
  • 多个属性之间使用英文,分隔
  • 属性就是依附在对象上的变量(外面是变量,对象内是属性)
  • 属性名可以使用"" '',一般情况下省略,除非名称遇到特殊符号如空格、中横线等
属性-查

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

语法对象名.属性

let person = {
	uname: 'pink老师',
	age: 18,
	gender: '女'
}
console.log(person.uname)
console.log(person.age)
console.log(person.gender)
属性-改

语法对象名.属性 = 新值

let person = {
	uname: 'pink老师',
	age: 18,
	gender: '女'
}
person.gender = '男'
console.log(person.gender)  // 男
console.log(person)
属性-增

语法对象名.新属性 = 新值

let person = {
	uname: 'pink老师',
	age: 18,
	gender: '女'
}
person.address = '武汉黑马'
console.log(person)

⭕️改和增语法一样,判断标准就是对象有没有这个属性,没有就是新增,有就是改

属性-删 (了解)

语法delete 对象名.属性

let person = {
	uname: 'pink老师',
	age: 18,
	gender: '女'
}
delete person.gender // 删除gender属性
console.log(person)
属性-查的另外一种写法
  • 对于多词属性或则 - 等属性,点操作就不能用了。
  • 我们可以采取: 对象[‘属性’] 方式, 单引号和双引号都可以
  • []语法里面的值如果不添加引号 默认会当成变量解析
let person = {
	'user-name': 'pink老师',
	age: 18,
	gende: '女'
}
console.log(person.user-name) // NaN
console.log(person['user-name']) // pink老师
console.log(peoson['age']) // 18

🐱总结:没有必要的时候直接使用点语法, 在需要解析变量的时候使用 [] 语法

对象中的方法

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

let person = {
	sayHi:function(){
		document.write('hi~~')
	}
}

🐱

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

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

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

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

方法调用

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

遍历对象

let obj = {
	uname: 'andy',
	age: 18,
	sex: '男'
}
for(let k in obj) {
	console.log(k) // 打印属性名
	console.log(obj[k]) // 打印属性值
}
  • 一般不用这种方式遍历数组、主要是用来遍历对象
  • for in语法中的 k 是一个变量, 在循环的过程中依次代表对象的属性名
  • 由于 k 是变量, 所以必须使用 [ ] 语法解析
  • 一定记住: k 是获得对象的属性名对象名[k] 是获得 属性值

案例:

在这里插入图片描述

<!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>
    table {
      width: 600px;
      text-align: center;
    }

    table,
    th,
    td {
      border: 1px solid #ccc;
      /* 1像素宽、实线样式、浅灰色 */
      border-collapse: collapse;
      /* 设置表格的边框合并为单一边框 */
    }

    caption {
      font-size: 18px;
      margin-bottom: 10px;
      font-weight: 700;
    }

    tr {
      height: 40px;
      cursor: pointer;
    }

    table tr:nth-child(1) {
      background-color: #ddd;
    }

    table tr:not(:first-child):hover {
      background-color: #eee;
    }
  </style>
</head>

<body>
  <h2>学生信息</h2>
  <p>将数据渲染到页面中...</p>
  <table>
    <caption>学生列表</caption>
    <tr>
      <th>序号</th>
      <th>姓名</th>
      <th>年龄</th>
      <th>性别</th>
      <th>家乡</th>
    </tr>
    <script>
      // 1.数据准备
      let students = [
        { name: '小明', age: 18, gender: '男', hometown: '河北省' },
        { name: '小红', age: 19, gender: '女', hometown: '河南省' },
        { name: '小刚', age: 17, gender: '男', hometown: '山西省' },
        { name: '小丽', age: 18, gender: '女', hometown: '山东省' },
        { name: '晓强', age: 16, gender: '女', hometown: '蓝翔技校' }
      ]
      // 2.渲染页面
      for (let i = 0; i < students.length; i++) {
        document.write(`
      <tr>
        <td>${i + 1}</td>
        <td>${students[i].name}</td>
        <td>${students[i].age}</td>
        <td>${students[i].gender}</td>
        <td>${students[i].hometown}</td>
      </tr>
      `)
      }
    </script>
  </table>
</body>

</html>

在这里插入图片描述

内置对象

JavaScript内部提供的对象,包含各种属性和方法给开发者调用,例如:

  • document.write()
  • console.log()
内置对象Math

**介绍:**Math对象是JavaScript提供的一个“数学”对象

**作用:**提供了一系列做数学运算的方法

⭐️Math对象包含的方法有:

  • random:生成0-1之间的随机数(包含0不包括1)
  • ceil:向上取整
  • floor:向下取整
  • max:找最大数
  • min:找最小数
  • pow:幂运算
  • abs:绝对值
生成任意范围随机数

⭐️Math.random() 随机数函数, 返回一个0 - 1之间,并且包括0不包括1的随机小数 [0, 1)

  • 如何生成0-10的随机数呢?
Math.floor(Math.random() * (10 + 1))
  • 如何生成5-10的随机数?
Math.floor(Math.random() * (5 + 1)) + 5

🐱总结:如何生成N-M之间的随机数

Math.floor(Math.random() * (M - N + 1)) + N
案例
随机点名

在这里插入图片描述

<!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>
  <script>
    let arr = ['赵云', '黄忠', '关羽', '张飞', '马超', '刘备', '曹操']

    let random = Math.floor(Math.random() * arr.length)

    document.write(arr[random])

    arr.splice(random, 1)// 3. splice(起始位置(下标), 删除几个元素)
    console.log(arr)
  </script>
</body>

</html>
猜数字游戏

在这里插入图片描述

<!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>
  <script>
    function getRandom(N, M) {
      return Math.floor(Math.random() * (10 + 1)) + 1
    }

    let random = getRandom(1, 10)
    let num = +prompt('请输入你要猜的数字:')

    while (1) {
      if (num > ans) {
        num = +prompt('数字过大,请重新输入:')
      }
      else if (num < ans) {
        num = +prompt('数字过小,请重新输入:')
      }
      else if (num === ans) {
        document.write('恭喜你,猜中了!')
        break
      }
    }

  </script>
</body>

</html>

在这里插入图片描述

生成随机颜色

💩
在这里插入图片描述

<!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>
  <script>

    // 1. 自定义一个随机颜色函数
    function getRandomColor(flag = true) {
      if (flag) {
        // 3. 如果是true 则返回 #ffffff
        let str = '#'
        let arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']
        // 利用for循环随机抽6次 累加到 str里面
        for (let i = 1; i <= 6; i++) {
          // 每次要随机从数组里面抽取一个  
          // random 是数组的索引号 是随机的
          let random = Math.floor(Math.random() * arr.length)
          // str = str + arr[random]
          str += arr[random]
        }
        return str

      } else {
        // 4. 否则是 false 则返回 rgb(255,255,255)
        let r = Math.floor(Math.random() * 256)  // 55
        let g = Math.floor(Math.random() * 256)  // 89
        let b = Math.floor(Math.random() * 256)  // 255
        return `rgb(${r},${g},${b})`
      }

    }
    // 2. 调用函数 getRandomColor(布尔值)
    console.log(getRandomColor(false))
    console.log(getRandomColor(true))
    console.log(getRandomColor())



    // let str = '#'
    // str = str + 'f'



  </script>
</body>

</html>

综合案例

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>学车在线首页</title>
    <link rel="stylesheet" href="./css/style.css">
    <style>

    </style>
</head>

<body>

    <!-- 4. box核心内容区域开始 -->
    <div class="box w">
        <div class="box-hd">
            <h3>精品推荐</h3>
            <a href="#">查看全部</a>
        </div>
        <div class="box-bd">
            <ul class="clearfix">

                <script>
                    let data = [
                        {
                            src: 'images/course01.png',
                            title: 'Think PHP 5.0 博客系统实战项目演练',
                            num: 1125
                        },
                        {
                            src: 'images/course02.png',
                            title: 'Android 网络动态图片加载实战',
                            num: 357
                        },
                        {
                            src: 'images/course03.png',
                            title: 'Angular2 大前端商城实战项目演练',
                            num: 22250
                        },
                        {
                            src: 'images/course04.png',
                            title: 'Android APP 实战项目演练',
                            num: 389
                        },
                        {
                            src: 'images/course05.png',
                            title: 'UGUI 源码深度分析案例',
                            num: 124
                        },
                        {
                            src: 'images/course06.png',
                            title: 'Kami2首页界面切换效果实战演练',
                            num: 432
                        },
                        {
                            src: 'images/course07.png',
                            title: 'UNITY 从入门到精通实战案例',
                            num: 888
                        },
                        {
                            src: 'images/course08.png',
                            title: 'Cocos 深度学习你不会错过的实战',
                            num: 590
                        },
                    ]
                    for (let i = 0; i < data.length; i++) {
                        document.write(`
                        <li>
                            <a href="#">
                                <img src=${data[i].src} title="${data[i].title}">
                                <h4>
                                    ${data[i].title}
                                </h4>
                                <div class="info">
                                    <span>高级</span> • <span>${data[i].num}</span>人在学习
                                </div>
                            </a>
                        </li>
                        `)

                    }
                </script>

            </ul>
        </div>
    </div>

</body>

</html>

在这里插入图片描述

拓展-术语解释

术语解释举例
关键字在JavaScript中有特殊意义的词汇let、var、function、if、else、switch、case、break
保留字在目前的JavaScript中没意义,但未来可能会具有特殊意义的词汇int、short、long、char
标识(标识符)变量名、函数名的另一种叫法
表达式能产生值的代码,一般配合运算符出现10 + 3、age >= 18
语句一段可执行的代码If () for()

拓展- 基本数据类型和引用数据类型

简单类型又叫做基本数据类型或者值类型,复杂类型又叫做引用类型。

  • 值类型:简单数据类型/基本数据类型,在存储时变量中存储的是值本身,因此叫做值类型

string ,number,boolean,undefined,null

  • 引用类型:复杂数据类型,在存储时变量中存储的仅仅是地址(引用),因此叫做引用数据类型

通过 new 关键字创建的对象(系统对象、自定义对象),如 Object、Array、Date等

堆栈空间分配区别:

1、栈(操作系统):由操作系统自动分配释放存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈;

简单数据类型存放到栈里面

2、堆(操作系统):存储复杂类型(对象),一般由程序员分配释放,若程序员不释放,由垃圾回收机制回收。

引用数据类型存放到堆里面

1.简单类型的内存分配
  • 值类型(简单数据类型): string ,number,boolean,undefined,null
  • 值类型变量的数据直接存放在变量(栈空间)中

在这里插入图片描述

2.复杂类型的内存分配
  • 引用类型(复杂数据类型):通过 new 关键字创建的对象(系统对象、自定义对象),如 Object、Array、Date等
  • 引用类型变量(栈空间)里存放的是地址,真正的对象实例存放在堆空间中
    在这里插入图片描述
    let num = 10
    let num2 = num
    num = 20
    console.log(num2) // 10

    let obj1 = {
      age: 18
    }
    let obj2 = obj1
    obj1.age = 20
    console.log(obj2) // 20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值