JavaScript基础 第一天
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>