JavaScript基础语法
[TOC]
导读
课后需要强化练习:
客观题扫码即可
JavaScript简介和体验
JavaScrpit是什么?
-
JavaScript是什么?
是一种运行在客户端(浏览器)的编程语言,实现人机交互效果。
(不像Java一样,运行需要配置各种环境。JS只需要浏览器)
-
作用
-
网页特效
监听用户的一些行为让网页作出对应的反馈
-
表单验证
针对表单数据的合法性进行判断
-
数据交互
获取后台数据,渲染到前端
-
服务端编程(node.js)
-
-
JavaScript的组成?
-
ECMAScrpit
规定了JS基础语法核心知识。
比如:变量、分支语句、循环语句、对象等等
-
Web APIs
DOM:操作文档,比如对页面元素进行移动、大小、添加删除等操作
BOM:操作浏览器,比如页面弹窗,检测窗口宽度、存储数据到浏览器等等
-
权威网站:MDN,直接百度MDN进去网页即可。
总结
-
JS是一种运行在客户端的编程语言
-
JS由ECMAScript、Web APIs(DOM BOM)组成
JavaScript书写位置
- CSS位置:
- 行内样式表
- 内部样式表 style
- 外部样式表 link
-
JS位置:
-
行内JS
- 内部JS
- 外部JS
-
1.内部JavaScript
直接写在html文件里,用script标签包住
规范:script标签写在</body>标签上面
注意事项:
将<script>放在HTML文件的底部附件的原因是:浏览器会按照代码在文件中的顺序加载HTML。如果先加载JS期望修改其下方的HTML,那么它可能由于HTML尚未加载而失效。因此,将JavaScript代码放在HTML页面的底部附近通常是最好的策略。
2.外部JavaScript
代码写在以.js结尾的文件里
语法:通过script标签,引入到html页面中
注意事项
- 引入了外部JS文件后,script标签不要再写代码,否则会被忽略。
- 外部JavaScript会使代码更加有序,更易于复用,且没有了脚本的混合,HTML也会更加易读,因此这是个好习惯。
3.内联JavaScript
代码写在标签内部
语法:
注意:此处作为了解即可,但是后面vue框架会用这种模式
总结
-
JavaScript的三种书写位置?
内部、外部、行内
-
注意事项
- 书写的位置尽量写到文档末尾</body>标签
- 外部js标签中间不要写代码,会被忽略
JavaScript怎么写
注释
-
单行注释
-
符号://
-
快捷键:Ctrl + /
-
-
多行注释
-
符号:/* */
-
快捷键:Shift+Alt+A
-
结束符
符号:使用英文的分号(;),代表语句结束
实际情况:实际开发中,可写可不写,浏览器引擎会自动推断JS结束的位置
现状:实际开发中,越来越多人主张,省略结束符
**约定:为了风格统一,要么全加,要么全都不加**总结
1.注释的两种方式
单行注释
多行注释
2.javas结束符注意点
-
结束符是分号
-
结束符可以省略吗?
可以省略。但是为了风格统一,要么每句都写,要么每句都不写。
输入和输出语法
目标:能写出常见JavaScript输入输出语法
什么是语法:
- 任何计算机打交道的规则约定
- 程序员要按这个规则去写
- 程序员操作计算机,需要让计算机能看懂
输出语法
输出:浏览器显示出来给用户
语法1:
document.write('要输出的内容')
作用:向body内输出内容,写入HTML文档
注意:如果输出的内容写得是标签,也会被解析为网页元素,而不是纯文字
语法2:
document.getElementByID("id名").innerHTML = "要修改的内容"
作用:内容写入到HTML元素
语法3:
alert('要输出的内容')
作用:页面弹出警告对话框
语法4:
console.log('控制台打印')
小技巧:直接在vscode中写log,然后选择第二个
作用:控制台输出语法,程序员调试使用
输入语法
输入:用户写入给浏览器,使用变量拿到
语法:
prompt('请输入您的姓名:')
作用:显示一个对话框包含文字信息+输入框;文字信息提示用户输入,输入框输入内容。
展示:
JavaScript代码执行顺序
-
按HTML文档流顺序执行JavaScript代码
-
alert()和prompt()它们会跳过页面渲染先被执行(目前了解,后面详细讲解)
字面量
在计算机科学中,字面量(literal)是在计算机中描述 事/物。一般称为固定值为字面量。
比如:
-
我们的工资是:1000。1000时数字字面量
-
“黑马程序员” 字符串字面量
-
还有接下来的
[]数组字面量
{}对象字面量 等等
总结
1.JavaScript是一门编程语言,可以实现网页交互效果。
2.JavaScript的书写位置?
内部、外部、行内
3.JavaScript的注释
单行注释、多行注释
4.JavaScript的结束符
分号,可加可不加按照团队约定
5.JavaScript输入输出语句
输入:prompt
输出:alert() ,document.write() , console.log()
变量
变量是什么?
通俗:变量是计算机用来存储数据的容器,它可以让计算机变得有记忆。
白话:变量就是一个装东西的盒子
注意:变量本身不是数据,它们仅仅是一个个用于存储数据的容器。可以理解为是一个个用来装东西的盒子。
变量基本使用
变量声明
要想使用变量,首先需要创建变量(也称为声明变量、定义变量)
语法
let 变量名
-
声明变量有两部分:声明关键字、变量名
-
let即关键字,所谓关键字是系统提供的专门用来声明(定义)变量的词语
举例
<script>
// 1.声明一个变量
let age
// 2.等号 赋值
age = 18
</script>
变量赋值
定义了一个变量后,就能够初始化它(赋值)。在变量名之后跟上一个“=”,然后是数值。
变量名 = 变量值 //等号左右有空格
注意:等号的两侧要有空格
变量初始化
简单点,也可以声明变量同时同时直接赋值。这种操作成为变量初始化
let 变量名 = 值
更新变量
变量赋值后,还可以给它换值。
语法:
变量名 = 新值
// 错误方法
let 变量名 = 新值 // 每个变量只能声明一次,let不允许多次声明一个变量
声明多个变量
想在一个let语句中声明多个变量
let 变量名1 = 值1, 变量名2 = 值2
初始化不建议这么写,提倡每个变量都分开写,一行只有一个变量,语义更好一些。
但是在输出的时候,可以合起来写。
变量的本质
内存:计算机中存储数据的地方,相当于一个空间
变量本质:是程序在内存中申请一块用来存放数据的小空间。通过变量名找到这个空间,变量值存储在这个空间里面。
变量命名规则与规范
规则:必须遵守,不遵守会报错 (法律层面是否合法)
规范:建议,不遵守不会报错,但不符合业内通识 (道德层面)
规则
-
变量名不能使用关键字
关键字:有特殊含义的字符,如let、if
- 只能用下划线_、字母、数字、$符组成,且不能数字开头。不能使用CSS中的-符号
- 字母严格区分大小写
规范
-
起名要有意义
不要出现a1,a2,…等
-
遵守小驼峰命名法
第一个单词首字母小写,后面每个单词首字母大写,如userName
变量拓展var和let
var现在开发中一般不再使用它,可能会在老版本中看到它
let为了解决var的一些问题
var声明:
- 可以先使用在声明(不合理)
- var声明过的变量可以重复声明(不合理)
- 比如变量提升、全局变量、没有块级作用域等
思考
1.变量一次能存几个值?
如果想一次存多个值就用数组。
2.如果我想保存一个班里5个人的姓名怎么办?
变量拓展-数组
声明
数组(Array)——一种将一组数据存储在单个变量名下的优雅方式
//专业: 逗号后面添加空格
let 数组名 = [数据1, 数据2, ..., 数据n]
// 示例
let names = ['小红', '小张', '小丽', '小米']
-
数组按顺序保存,每个数据都有自己的编号,编号从0开始到n-1
-
在数组中,数据的编号也叫索引或下标
-
数组中可以存储任意类型的数据,数组里面各个数据的类型可以不同
取值方法
取值方法:数组名[索引号]
一些术语
元素:数组中保存的每个数据都叫数组元素
下标:数组中数据的编号
长度:数组中数据的个数,通过数组的length属性获得
总结
1.数组好处?
数组可以保存多个数据
2.数组字面量用什么表示?
中括号[]
常量
概念:使用const声明的变量称为‘常量’
使用场景:当某个变量永远不会改变时,可以使用const来声明,而不是let
命名规范:和变量一致
常量使用:
// 声明一个常量
const G = 9.8
// 输出这个常量
console.log(G)
注意:常量不允许重新赋值,声明的时候必须赋值(初始化)
小技巧:不需要**重新赋值**的数据使用const
数据类型
数据类型分类
计算机世界中的万事万物都是数据。
计算机可以处理大量的数据,为什么要给数据分类?
-
充分、高效利用内存
简单数据类型放在内存中的一个地方、复杂的放在一种地方
-
方便程序员使用数据
JS数据类型整体分为两大类
-
基本数据类型
-
数字类型Number
整数、小数、正数、负数,只要是数字统称为数字类型,不区分整数和小数等。
注意事项
JS是弱数据类型的语言,只有赋了值才知道是什么类型。
Java是强类型的数据语言,如int num,不赋值也知道是什么类型。
数字类型的目的就是为了运算,所以数字类型经常和算术运算符一起使用。
- + 求和
- - 求差
- * 乘
- / 除
- % 取余 eg: 3 % 5 = 3 ; 5 % 3 = 2
运算顺序:先乘除%后加减,有括号先算括号里的
NaN:代表一个计算错误,它是一个不正确的或者未定义的数学操作所得到的结果
# 结果为NaN console.log('老师' -2 ) // NaN
NaN是粘性的,任何对NaN的操作都会返回NaN
NaN + 2 NaN / 2 NaN * 2 NaN == NaN // 任何出现NaN结果都是NaN,而不是返回True
-
字符串类型
通过单引号、双引号、或反引号包括的数据都叫字符串,单引号和双引号没有本质上的区别,推荐使用单引号。
let s = 'pink' let s = '123456' //字符串类型,而不是数字类型 let s = '' // 这种叫做空字符串
注意事项
-
无论单引号还是双引号,必须成对使用
-
单引号/双引号可以互相嵌套,但是不可以自己嵌套自己,被嵌套的会被打印出为字符
-
必须时可以使用转义符 \,输出单引号或双引号
字符串拼接
-
+ 号实现字符串的拼接
doucumet.write('我是' + 'PP') // 两个字符串变量的拼接输出 let uname = '刘德华' let song = '忘情水' doucument.write(unmae + song ) // 字符串和数字的拼接 documnet.wirte('我今年' + 19) // +号可以字符串和数字可以参加拼接运算 // 一部分变量一部分字符串,这样可以自动改变值 let age = 18 documnet.wirte('我今年' + age)
只要有字符串的+号,就全部是拼接运算
-
模板字符串
使用场景:拼接字符串和变量。在没有它之前,要拼接变量比较麻烦,需要+号很多操作
语法:字符串外层反引号,内容拼接变量时,用${}包住变量。
示例:
let age = 18 // 模板字符串 // 外面用反引号``,里面是${变量名} document.write(`我今年${age}岁了`) // 输出的是变量的变量值
-
布尔类型boolean
表示肯定或否定时在计算机中对应的是布尔类型数据
它有两个固定的值true和false,一个表示肯定一个表示否定
// 布尔型声明,不用添加引号 let isCool = true let isSun = false console.log( 3 > 4 ) // 返回false值
-
未定义类型undefined
未定义是比较特殊的类型,只有一个值undefined
申请情况出现未定义类型?
只声明/创建/定义变量,不赋值,变量的默认值制为undefined。一般很少直接为某个变量赋值为undefined。
工作中使用的场景:
开发中经常声明一个变量,等待传送过来的数据。
如果不知道这个数据是否传过来,此时可以通过检测这个变量是不是undefined,判断用户是否有数据传递过来
-
空类型null
null仅仅是一个代表”无“、”空“、或”值未知‘’的特殊值。
null和underfined区别
- underfind表示没有赋值
- null表示赋值了,但是内容为空
null开发中的场景 官方解释:把null作为尚未创建的对象
大白话:将来有个变量里面存放的是一个对象,但是对象还没创建好,可以先给null
// underfined和null 计算区别 console.log(undefined + 1) // 会发生错误,undefined还不知道是什么东西 console.log(null + 1 ) // = 1,不发生错误
-
-
引用数据类型
不介绍
检测数据类型
有时候用户传过来的数据,也不知道是什么类型,所以需要检测。
-
控制台看输出的颜色
蓝色:数字和布尔
黑色:字符串和未定义
-
通过typeof
关键字检测数据类型
语法:支持两种语法形式
// 1.作为运算符 typeof 变量名 // 常用写法 // 2.作为函数 typeof(便命令)
类型转换
为什么要类型转换
prompt获得的值的类型是全是字符串类型,哪怕用户输入的是数字,也是字符串。此时需要转换变量的数字类型。
通俗来说,就是把一种数据类型的变量转换成我们需要的数据类型。
隐式转换
某些运算符被执行时,系统内部自动将数据类型进行转换,这种转换成为隐式转换。
规则:
-
+号两边只要有一个是字符串,都会把另外一个转换为字符串
console.log(2 + 2) // 4 console.log(2 + '2') // 22
-
**除了加号以外的**
运算符,比如-,*,/都会把数据转换为数字类型
console.log(2 - 2) // 0 console.log(2 - '2') // 0 -号自动发生了转换
缺点:
转换类型不明确,靠经验才能总结
小技巧:
-
加号作为正号解析可以转换成数字型
(+号单用)
console.log('123') //字符型 console.log(+'123') //数字型,+号在最前面,单用
- 任何数据和字符串相加结果都是字符串
显式转换
编写程序时,隐式转换是不严谨的。为了避免隐式转换带来的问题,通常根据逻辑显示转换数据类型。
-
字符型转换为数字类型
-
Number(变量名/数据)
// 字符型转换为数字类型 salary = prompt('请输入年薪:') console.log(Number(salary)) sa = Number(prompt('年薪:'))
-
字符串前面添加加号(隐式转换)
let num = +prompt('请输入年薪:')
-
parseInt
//只保留整数数字,忽略字符和小数 console.log(parseInt('12.34px')) // 数字类型12 console.log(parseInt('12px')) // 数字类型12
-
parseFloat
//保留整数和小数,忽略字符 console.log(parseFloat('12.34px')) // 数字类型12.34
-
实战案例
需求:
输入后效果:
代码
<!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>
h2 {
text-align: center;
}
table {
/* 居中对齐 */
margin: 0 auto;
/* 文字居中对齐 */
text-align: center;
}
table,
th,
td {
border: 1px solid #000;
/* 合并相邻边框 */
border-collapse: collapse ;
}
th {
/* 不设置具体宽度,防止放不下内容,只设置padding */
padding: 5px 20px;
}
</style>
</head>
<body>
<h2>订单确认</h2>
<table>
<tr>
<th>商品名称</th>
<th>商品价格</th>
<th>商品数量</th>
<th>总价</th>
<th>收货地址</th>
</tr>
<tr>
<td>小米手机</td>
<td id="price">100</td>
<td id="num">10</td>
<td id="total">1000</td>
<td id="address">广州</td>
</tr>
</table>
<script>
// 1.用户输入
let price = +prompt('请输入价格:')
let num = +prompt('请输入数量:')
let address = prompt('请输入地址:')
// 2.计算总额
// 虽然乘号会自动转换字符串为数字类型,但是为了程序健壮性,还是要设置转换
let total = price * num
// 3.打印内容到元素中
document.getElementById('price').innerHTML = price
document.getElementById('num').innerHTML = num
document.getElementById('total').innerHTML = total
document.getElementById('address').innerHTML = address
// 也可以使用documnet.write()打印页面
// 具体流程:
// 1.剪切body内全部html标签
// 2.使用字符串模板,将对应位置的内容改成${}形式即可
</script>
</body>
</html>
效果预览
常见错误
1.
2.
3.
4.
5.