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 运算符可以返回被检测的数据类型。它支持两种语法形式:
- 作为运算符: typeof x (常用的写法)
- 函数形式: 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打开开发者工具,或者右键>检查)
- 点到sources一栏
- 选择代码文件
- 打断点
- 刷新一下
- 调试下一步
- 断点:在某句代码上加的标记就叫断点,当程序执行到这句有标记的代码时会暂停下来
点击watch,点击+
,检测变量
while循环
**循环:**重复执行一些操作, while : 在…. 期间, 所以 while循环 就是在满足条件期间,重复执行某些代码。
1.while 循环基本语法
while(循环条件){
要重复执行的代码(循环体)
}
2.while 循环三要素
循环的本质就是以某个变量为起始值,然后不断产生变化量,慢慢靠近终止条件的过程。
所以,while循环需要具备三要素:
- 变量起始值
- 终止条件(没有终止条件,循环会一直执行,造成死循环)
- 变量变化量(用自增或者自减)
循环退出
循环结束:
- 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}秒`
}
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”
- 减法 - (像大多数数学运算一样)只能用于数字,它会使空字符串 “” 转换为 0
- null 经过数字转换之后会变为 0
- 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~~')
}
}
🐱
-
方法是由方法名和函数两部分构成,它们之间使用
:
分隔 -
多个属性之间使用英文
,
分隔 -
方法是依附在对象中的函数
-
方法名可以使用
""
或''
,一般情况下省略,除非名称遇到特殊符号如空格、中横线等
方法调用:
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