JS是什么?
运行在客户端(浏览器)的编程语言,实现人机交互.
JS书写位置的三种方法
注意事项:JS文件引入和内嵌要写在HTML文档下面才能操作HTML文档,内嵌式JS里需要使用单引号
<!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>JS书写位置的三种方法</title>
</head>
<body>
<!-- 行内式的JS 直接写到元素的内部 -->
<input type="button" value="唐伯虎" onclick="alert('秋香姐')">
<!-- 外部引入的JS中间不要写代码 -->
<script src="wb.js"></script>
<!-- 内嵌式的JS -->
<script>
alert('沙漠骆驼');
// js尽量用单引号
</script>
</body>
</html>
JS输出输入语法
<!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>JS输出输入语法</title>
</head>
<body>
<script>
//像body内输入内容
document.write('<h1>标题元素</h1>');//如果输出内容写的是标签,也会被解析成网页元素
// 效果是弹出一个对话框让用户输入文本
prompt('请输入年龄');//返回的数据就是用户输入的数据
// 弹出一个警示框给用户看
alert('弹出警示框');
// 输出到控制台,按F12找到控制台可以看
console.log('我是程序员能看到的');
</script>
</body>
</html>
JS变量
变量的本质,变量名为空间的名字,数据是空间里的数据,指针是空间的位置
let
命名规则:
不能关键字:有特殊含义的字符,JavaScript内置的一些英语词汇。例如:let、var、if、for等
只能用下划线、字母、数字、$组成,且数字不能开头
字母严格区分大小写,如Age和age是不同的变量遵守小驼峰命名规范
JS常量
const
常量用const来声明,声明常量的时候必须赋值
声明的常量只能被赋值一次
数据类型
基本数据类型:number数字型,string字符串型,boolean布尔型,undefined未定义型,null空类型
引用数据类型:object对象
数字数据类型:JS不区分小数和整数和正负数,都可以用let来声明变量赋值. %求余运算符经常用来看数据能不能被整除
字符串类型:用单引号或者反引号括起来,反引号里可以存在变量书写方式 ${变量} ,单引号里还需要引号就用双引号括起来.
字符串拼接的方法,用+号运算符,比如: '一段字符串'+变量 或者'一段字符串'+'另一段字符串' .
重点:表单元素和pronpt()函数获取过来用户输入的数据都是字符串类型
字符串长度 字符串.length 得到的是字符串的长度数据
布尔值: true(真) false(假) 比如: console.log(3>4),返回的值为false
布尔值转换Boolean(数据)
记忆:"、0、undefined、null、false、NaN转换为布尔值后都是false,其余则为true
undefined:只声明一个变量没有赋值就是undefined,用来判断有没有数据传递过来.
null:表示赋值了,但是内容为空
数据类型转换
console.log(typeof 变量或数据);//判断数据类型
隐式转换: +号两边只要有一个字符串,都会把另外一个转换成字符串,除了+号以为的运算符都会把数据转成数字类型,如果加号用作正号使用可以把字符串转换成数字型比如: +'123456' 会变成数字类型
显示转换: Number(字符串) 把字符串转换成数字类型,
parselnt(数据),只保留整数,parseFloat(数据)可以保留小数点(数据里有除了数字的字符串就忽略)
综合案例-收集用户输入信息并渲染到网页
<!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>
<h2>订单确定</h2>
<script>
//1.用户输入
let price = +prompt('请输入商品价格:')
let num = +prompt('请输入商品数量:')
let address = prompt('请输入收获地址:')
//2,计算总额
let total = price * num
//3.数据渲染到网页
document.write(`
<table>
<tr>
<th>商品名称</th>
<th>商品价格</th>
<th>商品数量</th>
<th>总价</th>
<th>收货地址</th>
</tr>
<tr>
<td>小米</td>
<td>${price}元</td>
<td>${num}</td>
<td>${total}元</td>
<td>${address}</td>
</tr>
</table>
`)
</script>
</body>
</html>
运算符
赋值运算符 变量+=10 意思是 变量=变量+10;
一元运算符 ++变量 或者 变量++ ,软件开发中常用的是 变量++
分为前置自增和后置自增,区别在前置自增在当前函数运算完,后置自增在用变量运算完后跳出函数后再自增
比较运算符
> 左边是否大于右边
< 左边是否小于右边
>= 左边是否大于或等于右边
<= 左边是否小于或等于右边
== 左右两边值是否相等
=== 左右两边是否类型和值都相等(开发中建议使用)
!== 左右两边是否不全等
比较结果为布尔类型,只会得到true或false
逻辑运算符
逻辑与 && 两边只要有一边是假的那返回结果就是假的(false)
意思是看看两边有没有假的
逻辑或 || 两边只要有一边是真的那返回结果就是真的(true)
意思是看看两边有没有真的
逻辑非 ! 取反,真的变成假的,假的变成真的
逻辑中断运用
<!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>
</head>
<body>
<!-- 1.用布尔值参与的逻辑运算 true&&false false
2.123&&456
逻辑与短路运算 如果表达式1结果为真则返回表达式2,如果表达式1为假那么返回表达式1
逻辑或短路运算 如果表达式1结果为真则返回表达式1,如果表达式1为假那么返回表达式2 -->
<!-- 逻辑与中断运算 -->
<script>
console.log(123 && 456);//456
console.log(0 && 456);//0
console.log(0 && 456 + 5 && 5 * 5);//0
console.log(1 && 2 * 5 && 5 - 3 && 0 && 5);//0
console.log(1 && 2 * 5 && 5 - 3 && 1 && 5);//5
</script>
<!-- 逻辑或中断运算 -->
<script>
console.log(123 || 456);//123
console.log(0 || 456);//456
console.log(0 || 456 + 5 || 5 * 5);//461
console.log(1 || 2 * 5 || 5 - 3 || 0 || 5);//1
console.log(1 || 2 * 5 || 5 - 3 || 1 || 5);//1
let num = 0;
console.log(123 || ++num);
console.log(num);//结果为0,因为已经逻辑中断了,后面不做计算
</script>
</body>
</html>
运算符的优先级,小括号>一元运算符>算数运算符>关系运算符>相等运算符>逻辑运算符>赋值运算符>逗号运算符
JS语句
表达式和语句的区别:表达式是可以被求职的代码,语句是一段可以执行的代码
表达式:因为表达式可被求值,所以它可以写在赋值语句的右侧。
表达式 num =3+4 表达式最终都会有一个结果返回给我们,我们称为返回值。
语句:而语句不一定有值,所以比 如alert() for和break等 语句就不能被用于赋值。
语句 alert()弹出对话框 console.log()控制台打印输出
if分支语句
<!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>
//条件语句
if (条件) {
//条件为真(满足条件)执行这里
} else {
//不满足条件执行这里
}
//多个条件语句
if (条件1) {
//满足条件1执行这里
} else if(条件2){
//满足条件2执行这里
}else if(条件3){
//满足条件3执行这里
}
else {
//都不满足条件执行这里
}
</script>
</body>
</html>
三元运算符(一般用来取值)
<!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>
</head>
<body>
<script>
// 语法结构
// 条件表达式 ? 表达式1 : 表达式2
// 如果表达式结果为
// 真 则返回表达式1的值
// 假 则返回表达式2的值
var num = 10;
var a;
//先比较num>5,结果为真执行表达式1返回字符串'是',并赋值给a;
//先比较num>5,结果为假执行表达式2返回字符串'不是',并赋值给a;
a = num > 5 ? '是' : '不是';
alert(a);
</script>
<!-- 数字补0案例 -->
<script>
/* 用户输入数字,如果数字小于10.则在前面补零
如果数字大于10则不需要 */
var b = prompt('请输入一个数字');
var c;
c = b < 10 ? ('0' + b) : b;
alert(c);
</script>
<!-- 返回用户输入最大值案例 -->
<script>
//1.用户输入
let num1 = +prompt('请您输入第一个数:')
let num2 = +prompt('请您输入第二个数:')
//2.运算比较
num1 > num2 ? alert(`最大值是:${num1}`) : alert(`最大值是:${num2}`)
</script>
</body>
</html>
switch语句(选择语句)
<!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>
</head>
<body>
<!-- switch 语句也可以实现多选1
switch(表达式){
case 值1:执行语句1;break;
case 值2:执行语句2;break;
case 值3:执行语句3;break;
default:如果都匹配不上执行这个语句;
}
表达式的值必须和case的值全等才能匹配,每个case后执行完一定要break,不然会一直执行下去 -->
<!-- 输入水果名字查询价格 -->
<script>
var a = prompt('请输入您查询的水果');
switch (a) {
case '荔枝': alert('荔枝3块钱一斤'); break;
case '西瓜': alert('荔枝2块钱一斤'); break;
case '苹果': alert('荔枝5块钱一斤'); break;
case '芒果': alert('荔枝10块钱一斤'); break;
case '龙眼': alert('荔枝4块钱一斤'); break;
case '榴莲': alert('荔枝30块钱一斤'); break;
case '香蕉': alert('荔枝1块钱一斤'); break;
default: alert('查询不到这个水果'); break;
};
</script>
</body>
</html>
while和do while
<!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>
</head>
<body>
<script>
//while
while (条件表达式) {
循环体代码
}
//do while
do {
} while (条件表达式)//先执行一次循环体,再判断
</script>
</body>
</html>
for循环
<!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>
</head>
<body>
<script>
/* 找出1-100和的平均值 */
let age;
for (let i = 1; i <= 100; i++) {
age = age + i;//num一直存在前面运算的结果再+i
}
console.log(age / 100);
/* 分别求出奇数和偶数的和 */
let even = 0, odd = 0;
for (let i = 1; i <= 100; i++) {
if (i % 2 == 0) {
even = even + i
} else {
odd = odd + i;
}
}
console.log(even, odd);
/* 求出1-100可以被3整除的数的和 */
let san = 0;
for (i = 1; i <= 100; i++) {
if (i % 3 == 0) {
san = san + i;
}
}
console.log(san);
</script>
</body>
</html>
循环退出
break:退出循环 continue:结束本次循环,继续下次循环 配合if语句来使用
数组
数组:是一种可以按顺序保存数据的数据类型
<!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>
</head>
<body>
<!-- 数组的创建方式
1.利用new创建数组
var arr = new Array();(学对象的时候用得到)
2.利用数组的字面量创建数组
var 数组名=[];创建了一个空数组
var 数组名 =['小白','小黑','大黄'];
数组里面用逗号分开,数组里可以存任意数据类型 -->
<script>
//元素:数组中保存的每个数据都叫数组元素
//下标(索引):数组中数据的编号,从0开始
//长度:数组中数据的个数,通过数组的length属性获得,比如:数组.length
let arr = ['小白', 3, true];
console.log(arr[1]);//获取访问数组元素的方法
/* 遍历数组 */
//使用for循环根据数组的长度来遍历
let brr = [2, 6, 1, 7, 4]
//1.求和的变量sum
let sum = 0 //要先赋值,因为等下参与运算
//2.遍历累加
for (let i = 0; i < brr.length; i++) {
//console.Log(arr[i])
sum = sum + brr[i]
}
//使用for(let=key in arr) {}来遍历
for (let key in arr) {
console.log(key)//注意key返回的是字符串类型的索引号 0 1 2
console.log(arr[key]);//从索引号0开始打印到数组最后
}
/* 数组新增元素的两种方式 */
//数组.push(元素1,元素2),将元素添加到数组的末尾,并返回该数组的新长度
let crr = ['1', '2']
crr.push(3)
console.log(crr, crr.push(3));
//数组.unshift(元素1,元素2),将元素添加到数组的开头,并返回该数组的新长度
/* 数组删除元素的方式 */
//数组.pop(),删除数组最后一个元素,并返回改元素的值,不用传参数
//数组.shift(),删除数组第一个元素,并返回改元素的值,不用传参数
//数组.splice(起始位置,删除第几个元素),需要传递参数
</script>
</body>
</html>
数组的拼接
<script>
let s = Array('a','p','p','l','e')
document.write(s.join(''))//输出结果:apple
</script>
<script>
let s = Array('Apple','is','on','my','table')
//将数组元素以空格分割
document.write(s.join(' '))//join(' ')
//输出结果:Apple is on my table
</script>
<script>
let s = Array(1,2,3)
console.log(s)
//join()将数组每个元素都转为字符串,用法等同于toString()
console.log(s.join())
</script>
数组遍历和映射
const numbers = [1, 2, 3, 4, 5];
const doubledNumbers = numbers.map(num => num * 2);
console.log(doubledNumbers); // [2, 4, 6, 8, 10]
格式: arr.map((item,index,arr)=>{
数组循环操作从[0]开始到最后
});
操作完赋值给一个新的 数组变量
原数组不变
item:数组元素,当前元素
index:当前元素的下标
arr:当前元素所在的数组
//1.封装获取图书列表的函数
function getBooksList() {
//获取数据
axios({
url: 'http://hmajax.itheima.net/api/books',
params: {
creator
}
}).then(result => {
//获取到数据为一个数组
const bookList = result.data.data;
console.log(bookList);
//渲染数据,把获取到的数组渲染到网站上
const htmlStr = bookList.map((item,index) => {//item为当前的数组元素,如果数组元素是对象那就是当前对象名,index为当前数组的下标比如[0],[3],bookList为原数组,htmlStr为新数组
/* 添加id方便找到当前的td */
console.log(item,index);
return `<tr>
<td>${index + 1}</td>
<td>${item.bookname}</td>
<td>${item.author}</td>
<td>${item.publisher}</td>
<td data-id=${item.id}>
<span class="del">删除</span>
<span class="edit">编辑</span>
</td>
</tr>`
}).join('');//拼接一个空字符串,让数组变成字符串
console.log(htmlStr);
document.querySelector('.list').innerHTML = htmlStr
})
}
//打开网址时执行一次获取并渲染的函数
getBooksList()
函数
<!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>
</head>
<body>
函数就是封装一段代码
调用一次就是让函数执行一遍里面的代码,没有参数也可以调用
<script>
/* 具名函数 */
/* 声明函数,声明函数不执行代码,调用的时候才执行 */
function getSum(num1, num2) {//设置两个形参
//作用域,在函数里声明的变量只能在函数体里面使用,函数走完就销毁
var sum = 0;
for (var i = num1; i <= num2; i++) {
sum += i;
}
console.log(sum);
}
getSum(1, 100);//输入实参函数的调用,num1=1;num2=100;一个赋值的过程
console.log(getSum(1, 100))//改代码执行一次函数调用,然后返回undefined,表示一个变量声明了没有赋值,就是函数没有返回值
//注意点,如果传入的是数组,形参最好写成数组格式比如:arr[]
//函数返回值
function fn() {
return 20//返回值后面的代码不再执行,如果没有return的函数返回undefined
}//相当于把返回值赋值给fn(),fn()=20
console.log(fn());//打印出来结果为20
/* 匿名函数 */
//与具名函数的区别,具名函数声明可以写在任意位置,匿名函数必须先声明函数后调用
//匿名函数常用在点击事件里
let fun = function () {
console.log('1');
}
fun()//调用函数
console.log(fun)//把整个函数一五一十打印出来
/* function这个关键字可以当作语句也可以当作表达式 */
//语句
function fn1() { };
//表达式
let fn2 = function () { };
/* 立即执行函数 */
//利用变量的作用域,可以在立即执行函数里声明变量,避免全局变量的污染
//前面用+号是因为避免让JS引擎理解为这是一个表达式
+function () {
let a = 10;
console.log(a);
}()
+ function () {
let a = 20;
console.log(a);
}()//
</script>
</body>
</html>
对象
对象(object)是什么?是JS里的一种数据类型
可以理解为是一种无序的数据集合,用来描述一个事物,比如描述一个人
对象由属性和方法组成
属性:信息或叫特征(名词),比如 手机尺寸,重量,颜色,等... 属性名:属性值
方法:功能或叫行为(动词),比如打电话,发短信,玩游戏 方法名:函数
<!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>
<script>
/* 利用对象字面量创建对象 */
let obj = {
name: '张三',
age: 18,
sex: '男',
'goods-name': '法外狂徒',
sayHi: function () {
console.log('hi~');
}//相当于把函数赋值给变量sayHi
}
//里面的属性或者方法采取键值对的形式 键:属性名,值:属性值
//属性名就是依附在对象里的变量
/* 方法一,使用对象,对象名.属性名 */
console.log(obj.name);
/* 方法二,对象名['属性名'] */
console.log(obj['goods-name']);
/* 方法三,调用对象的方法 对象名.方法名 */
obj.sayHi();
/* 对象数据的增删改查 */
//增加
obj.height = 183//用新的属性名赋值
//删除
delete obj.sex
console.log(obj);//已经把age: 18,删除
//改
obj.name = '李四'
console.log(obj);//把张三改为了李四
//查询
console.log(obj['goods-name']);
/* 遍历对象 */
for (let key in obj) {
console.log(key)//得到的是所有属性名,字符串型
//console.log(obj.key)错误写法,因为key得到的是字符串不是变量
console.log(obj[key])//需要使用这样方式来得到数据
}
</script>
</head>
<body>
</body>
</html>