第二章 前端开发学习——JavaScript
一、初识JavaScript
二、JavaScript基础
三、JavaScript数据类型
四、JavaScript运算符
五、JavaScript流程控制
六、JavaScript函数与对象
七、JavaScript实用技巧
八、JavaScript事件Event
九、JavaScript内置对象
一、初识JavaScript
什么是JavaScript(what):
JavaScript,通常会简称为'JS', 是一种浏览器脚本语言。
JavaScript特点:
-
JavaScript是一种脚本编程语言
-
JavaScript是一种解释型语言
-
Javas的语法结构与C++、java十分类似
-
JavaScript是弱类型语言
- ***********************注释***************************
- 静态类型: 需要为变量提前指定 数据类型
- 强类型: 数据类型不能自动转换
- 弱类型: 数据库可以自动转换
-
JavaScript: 弱类型 动态类型
- Python: 强类型 动态类型
- ********************************************************
-
JavaScript是事件驱动的语言
-
JavaScript是一种基于对象的语言
-
JavaScript具有跨平台性
-
JavaScript具有安全性与简单性
JavaScript版本:
-
-
ECMAScript5.0
-
ECMAScript6.0 (ECMA2015、ECMAScript2016、ECMAScript2017)
JavaScript应用领域:
-
-
后端 (node.js)
-
混合APP(IOS 安卓)
-
游戏
二、JavaScript基础
1.如何在Html中使用JS
①引入外部脚本文件
②在标签内写代码
③通过事件属性定义在元素内部
2.JavaScript注释
单行注释
多行注释
3.语句结束符(为了方便记忆末尾都加上分号,实际也可以不使用分号)
4.JavaScript中的输出
①输出到控制台
②输出到屏幕
③弹窗
5.JavaScript变量定义
变量名规范:
标识符必须 由 "数字","字母", "_" 或者 "$" 组成,并且不能以数字 开头
标识符不能与保留字(关键字)冲突
区分大小写(user_name/userName(推荐)/UserName/UserNameAge)
6.JavaScript弹框
①警告框alert(没有返回值)
②确认框confirm(返回布尔值True/False)
③输入框prompt(返回用户输入的内容,点击取消视为null)
7.获取html中的DOM属性
document.getElementById()
eleObj.innerHTML 获取/设置
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>简易计算器title>
<style>
input {
width: 300px;
font-size: 16px;
line-height: 18px;
padding:10px;
border: 1px solid #ccc;
}
button {
padding: 10px 20px;
border: 1px solid #ccc;
background: #f5f5f5;
}
.res {
width: 300px;
height: 100px;
padding: 10px;
border: 1px solid #ccc;
}
style>
head>
<body>
<h1>计算器h1>
<hr>
<table>
<tr>
<td>加数1:td>
<td>
<input type="text" id="num1">
td>
tr>
<tr>
<td>加数2:td>
<td>
<input type="number" id="num2">
td>
tr>
<tr>
<td>td>
<td>
<button onclick="add()">+button>
td>
tr>
<tr>
<td>td>
<td>
<div class="res" id="box">div>
td>
tr>
table>
<script>
//定义函数
function add() {
// 获取 用户在 input 中输入的内容
// 获取元素对象 返回对象 对象描述 id是num1的元素
var inputEle1 = document.getElementById('num1');
var inputEle2 = document.getElementById('num2');
//获取用户在input中输入的值
var v1 = inputEle1.value;
var v2 = inputEle2.value;
//判断用户输入是否是纯数字
if (isNaN(v1)) {
alert('加数1必须是纯数字');
return;
}
if (isNaN(v2)) {
alert('加数2必须是纯数字');
return;
}
//把字符串转换为数字
v1 = Number(v1);
v2 = Number(v2);
//两个数相加
var sum = v1 + v2;
//获取放结果的div元素 innerHTML 获取或者设置 双标签内的内容
var boxEle = document.getElementById('box');
boxEle.innerHTML = sum;
}
script>
body>
html>
三、JavaScript数据类型
1.数据类型分类
-
-
对象类型 Object、Array、Date、Math、Error Set(ES6).....
- 函数检测:typeof
2.Number数字类型
Tips:JavaScript不区分整型和浮点型
定义方式:
//十进制
var num = 100
//十六进制
var num = 0x10f
//科学计数法
var num = 123e100
浮点精度:
console.log(.1 + .2)
数值范围:
可表示的数字范围: -5e324 ~ 1.7976931348623157e+308
超过范围,会显示为 Infinity(正无穷) 或 -Infinity(负无穷)
isFinite() //函数判断是否在范围内
特殊值NaN:
表示Not A Number,类型是Number 但又不是常规的数字
和任何值都不相等
与任何值运算,结果还是NaN
isNaN() //函数 判读是否是 NaN
3.String字符串类型
声明方式:
①单引号:
②双引号
③反引号
Tips:${}方式 嵌入变量
转义字符:
\b 退格
\f 走纸换页
\n 换行
\r 回车
\t 水平制表符
\' 单引号
\" 双引号
\\ 反斜杠
\xXX 十六进制XX指定的Latin-1 字符
\xXXXX 十六进制XXXX指定的Unicode 字符
4.Boolean布尔值类型
let a = true
let b = false
while (true) {
}
5.null和undefined
null
:函数的默认返回值,表示未定义的对象(被动产生)undefined
:没有赋值的变量会默认为undefined,表示"缺少值"(被动产生)
6.数据类型转换
①自动类型转换
②强制类型转换
四、JavaScript运算符
1.算数运算符
表达式 表达式通常由运算符和操作数组成。 简单表达式也有复杂表达式
表达式的特点 表达式有计算结果
有些表达式 还会产生额外的作用(对操作产生影响)
2.关系运算符
- 相等运算符
==
- 全等运算符
===(推荐)
- 不等运算符
!=
- 不全等运算符
!==
- 小于运算符
<
- 大于运算符
>
- 小于或等于运算符
<=
- 大于或等于运算符
>=
in
运算符 判断一个值是否属于某个数组或者一个属性是否属于一个对象instanceof
判断一个对象的实例是否属于某个对象
3.逻辑运算符
- 逻辑与
&&
- 逻辑或
||
- 逻辑非
!
4.位运算符
- 按位与
&
- 按位或
|
- 按位异或
^
- 按位非
~
- 左移
<<
- 右移
>>
5.赋值运算符
-
=
-
+=
-
-=
-
/=
-
*=
-
%=
6.其他运算符
五、JavaScript流程控制
1.条件语句(分支结构)
①单向分支if
if (表达式) {
code...
}
注意:
if (条件)
代码
②双向分支if...else...
if (表达式) {
code...
} else {
code...
}
③多向分支if...else if...
if (表达式) {
code...
} else if (表达式) {
code...
} else if (表达式) {
code...
} else {
code...
}
④多向分支switch...case..
switch (表达式) {
case 表达式可能的值: code....; break;
case 表达式可能的值: code....; break;
case 表达式可能的值: code....; break;
case 表达式可能的值: code....; break;
default: code....;
}
DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>多向分支——switchtitle>
head>
<body>
<h2>多向分支——switchh2>
<hr>
<h3>请输入生日h3>
<input type="date" id="dt">
<button onclick="check_result()">查询button>
<script type="text/javascript">
function check_result() {
var date = document.getElementById('dt').value;
var year = Number(date.split('-')[0]);
var animal = '';
switch(year % 12) {
case 0: animal = '猴'; break;
case 1: animal = '鸡'; break;
case 2: animal = '狗'; break;
case 3: animal = '猪'; break;
case 4: animal = '鼠'; break;
case 5: animal = '牛'; break;
case 6: animal = '虎'; break;
case 7: animal = '兔'; break;
case 8: animal = '龙'; break;
case 9: animal = '蛇'; break;
case 10: animal = '马'; break;
case 11: animal = '羊'; break;
default: animal = '驴'; //前面的条件都不满足
}
alert(animal);
}
script>
body>
html>
⑤分支结构嵌套
if (表达式) {
if (表达式) {
code....
}
code ...
} else {
code...
}
2.循环语句
①while循环
while (循环条件) {
//循环体
}
②do...while循环
do {
code...
} while (循环条件)
③for循环
for (循环变量; 循环条件; 循环变量变化) {
code ...
}
3.其他语句
①跳转语句
continue; 跳出当前循环 继续下一次
break; 结束循环
return; 结束函数
②异常捕捉
try {
tryCode - 尝试执行代码块
}
catch(err) {
catchCode - 捕获错误的代码块
}
finally {
finallyCode - 无论 try / catch 结果如何都会执行的代码块
}
Tips:
严格模式
//写在所有代码的最前面
//开启严格模式
‘use strict’
-
-
eval()
在严格模式不能用
六、JavaScript函数与对象
(一)函数
1.JavaScript定义函数
方式一:关键字方式(存在函数提升情况,即可以先调用后定义)
方式二:表达式方式(不存在变量提升情况)
2.JavaScript函数特点
-
-
函数调用 必须加
()
-
关键字方式定义的函数, 会存在函数提升 (在函数定义的前面 调用函数)
3.JavaScript函数参数
-
-
实参数量<形参梳理 多出的形参,默认值
undefined
-
//ES6 新增的语法
function demo(a, b=默认值) {
}
//有默认值的参数 一定在后面 -
arguments对象 可以获取所有的实参
只能在函数中使用
arguments是类数组对象,用法同数组,可以使用for循环遍历
4.回调函数
一个函数就可以接收另一个函数作为参数,这种函数就称之为回调函数(高阶函数)
//有名函数 从小到大
function mySort(v1,v2) {
/*if (v1 > v2) {
return 5 //换过来 只要是正数 就会交换
} else {
return -7 //不变 只要是负数 就不换
}*/
return v1 - v2;
}
//有些方法的参数 要求就是函数
var list = [10,23,1,456,8,3,5]; //数组 Array
console.log(list);
//排序 字符串排序
//list.sort();
//按照自然排序
//list.sort(mySort)
list.sort(function(v1, v2){
return v1 - v2;
})
console.log(list);
5.自调函数
函数生声明完 直接调用
Tips:要是写JS文件的话,最好每个JS文件都声明一个自调函数,这样每个JS文件都有各自的作用域。
6.JavaScript作用域
①全局作用域
在函数外面,定义的变量是全局变量。哪都可以用
全局变量
②局部作用域
函数中使用定义的变量就是局部变量,只能在本函数中使用
Tips:
1.局部作用域中的变量加上var不会改变全局作用域的变量值
输出结果为小梅梅
2.局部作用域中的变量不加var会改变全局作用域的变量值
输出结果为小丽丽
总结:
④作用域链
⑤块状作用域
使用let
关键字声明的变量会具有块状作用域。
局部作用域调内使用let,调用时报错
所有的 结构语句 for while do while if switch 都有块状作用域
7.闭包函数
当一个函数返回了一个函数后,其内部的局部变量还被新函数引用,形成闭包
(二)对象
1.构造函数和对象
JavaScript中没有类的概念,JS中叫构造函数
构造函数就是类
function User([参数]) {
this.属性 = 值;
this.属性 = 值;
this.方法 = function(){
}
}
#实例一个对象
new 构造函数();
如果构造函数没有参数 可以 不加()
①定义构造函数(当做Python中的类使用)
注意:
A)函数名采用首字母大写或者驼峰体命名法
B)声明对象属性用this(等同于python中的self)
- this表示方法 所属的对象
- 全局函数中的this 指向 window
②实例化对象
如果构造函数没有参数 可以 不加()。
③使用对象的属性
④调用对象方法
⑤所有的对象都有与之对应的构造函数,并且都有一个属性【.constructor】用来查看其对应的构造函数
⑥对象属性的增删改查:
A)修改
console.log(obj.name)
obj.name = 'lili'
console.log(obj['name'])
obj['name'] = 'honghong'
B)删除
delete obj['name']
delete obj.name
C)监测属性是否存在
'name' in obj
2.原型和原型链
①原型
②原型链
-
-
原型的原型的原型 就构成了 原型链
-
使用对象中某个属性的时候,先从对象中找,如果没有,从原型上找,原型如果也没有,继续向上找,知道顶层 (顶层的原型对象是一个 类型(类)(构造函数)是Object 的对象)
3.JavaScript对象属性的调用
①点.
②方括号[]
任意的对象 都可以在对象实例化完成后, 添加属性和方法
4.使用Object构造函数
js内建的构造方法 叫 Object
var obj = new Object()
josn方式定义对象
var obj = {属性:值, 属性:值} // new Object的简写
obj的构造含 是 Object
七、JavaScript实用技巧
1.从页面中获取元素
document.getElementById() 根据ID的值
document.getElementsByTagName() 根据标签名
document.getElmenntsByClassName() 根据class的值
document.getElementsByName() 根据name属性的值
document.querySelector(css选择器) 返回满足条件的第一个 元素对象(常用)
document.querySelectorAll(css选择器) 返回所有满足条件元素组成的 类数组对象(常用)
2.修改元素的CSS样式
①ele.style.css属性名
②ele.style.background
③ele.style.border
④ele.style.backgroundColor
⑤ele.style['background-color']
3.改变元素内class的值
①ele.className 可以赋值,也可以获取
②ele.classList.add(‘值’) 添加一个class值
③ele.classList.remove(‘值’) 删除一个class值
④ele.classList.toggle(‘值’) 自动切换一个class值(有就删除,没有就添加)
4.JavaScript定时器
单词定时
setTimeout(fn, delay)
clearTimeout() 清除定时
多次定时
setInterval(fn, dealy)
clearInterval() 清除定时
范例
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>定时案例title>
<style>
h1 {
margin-top:100px;
text-align: center;
font-size: 300px;
}
style>
head>
<body>
<h1>10h1>
<script>
var h1 = document.querySelector('h1');
var m = 10;
var time = setInterval(function(){
h1.innerHTML = --m;
//当m <= 0的时候
if (m <= 0) {
clearInterval(time); //清除定时
h1.innerHTML = '你死定了'
}
}, 1000)
script>
body>
html>
八、JavaScript事件Event
1.什么是事件(what):
JavaScript 使我们有能力创建动态页面。事件是可以被 JavaScript 侦测到的行为。
网页中的每个元素都可以产生某些可以触发 JavaScript 函数的事件。比方说,我们可以在用户点击某按钮时产生一个 onClick 事件来触发某个函数。事件在 HTML 页面中定义。
2.如何将事件绑定给元素(how):
方式一:(更常用)
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>给元素绑定事件title>
<style>
.list {
list-style: none;
padding: 0;
margin: 0;
width: 600px;
}
.list li {
padding:10px;
margin:5px 0px;
border: 1px solid #ccc;
}
.list li.active {
border-color: red;
background: #ccc;
}
style>
head>
<body>
<h1 >同志交友h1>
<hr>
<ul class="list">
<li>Lorem ipsum dolor sit amet.li>
<li class="item">Lorem ipsum dolor sit amet.li>
<li >Lorem ipsum dolor sit amet.li>
<li class="item">Lorem ipsum dolor sit amet.li>
<li>Lorem ipsum dolor sit amet.li>
<li class="item">Lorem ipsum dolor sit amet.li>
<li>Lorem ipsum dolor sit amet.li>
<li class="item">Lorem ipsum dolor sit amet.li>
ul>
<script>
//获取所有li的集合
var lis = document.querySelectorAll('.list li');
//遍历 给每个li 绑定单击事件
for (var i = 0; i < lis.length; i ++) {
lis[i].onclick = function(){
//把所有的li都去掉class active
for (var j = 0; j < lis.length; j ++) {
lis[j].classList.remove('active');
}
//把当前的添加上
this.classList.add('active')
}
}
script>
body>
html>
①先获取元素
②ele.onclick = function(){
..................
}
③获取元素的类数组对象, 遍历,挨个给每个元素绑定事件
方式二:
方式三:(标准方式)
addEventListener(Event, fn) (非IE IE9+)
attachEvent(Event, fn) (IE8-)
3.事件的捕获与冒泡
捕获阶段: 从祖先元素 到 子元素
冒泡阶段: 从子元素 到 祖先元素
事件默认在冒泡阶段触发
事件的捕获和冒泡 同志交友
4.事件列表
①鼠标事件
onclick 单击
ondblclick 双击
oncontextmenu 右击
onmouseover/onmouseenter 鼠标悬浮到元素上
onmouseout/onmouseleave 鼠标离开元素
onmousemove 鼠标在上面移动
onmousedown 鼠标的按键按下
onmouseup 鼠标的按键抬起
②键盘事件
keydown 键盘按键 按下
keyup 键盘按键 抬起
keypress 键盘按键 按下 (只有字符按键) (控制按键不可以 Ctrl shift 上下左右都不行)
键盘事件
③表单事件
submit 表单提交的时候, 绑定给form元素
reset 表单重置, 绑定给form元素
blur 失去焦点
focus 获得焦点
change 表单控制的内容改变 通常绑定给 radio checkbox select 如果绑定给输入的input, 必须满足 内容改变和失去焦点才能触发
select input 或 textarea 内容被选中的时候触发
地址联动 选择地址
④文档事件
⑤图片事件
abort 图片加载中断
load 图片加载完成
error 图片加载错误
图片事件 图片事件
⑥其他事件
5.Event对象
A)属性
-
clientX 鼠标的x坐标
-
clientY 鼠标的Y坐标
-
button 鼠标按键的标示
-
keyCode 键盘按键的值
-
cancelBubble 阻止事件冒泡 设置为true
-
target 返回触发此事件的元素
-
tyep 返回事件类型
-
timeStamp 返回触发事件的那一刻的时间戳(从页面打开的那一刻开始
-
altKey 返回当事件被触发时,"ALT" 是否被按下。
-
ctrlKey 返回当事件被触发时,"CTRL" 键是否被按下。
-
shiftKey 返回当事件被触发时,"SHIFT" 键是否被按下。
B)方法
九、JavaScript内置对象
1.Number
A)属性
- MAX_VALUE JS可以表示的最大的数字
- MIN_VALUE JS可以表示的最小的数字
B)方法
- toFixed(length) 指定保留长度的小数
- toExponential() 用科学计数法表示
- toPrecision(length) 要求数字按照指定长度显示 整数+小数
- toString(number) 把数字转换为字符串 可以按照指定的 进制 返回
2.String
A)属性
- length 字符串长度
B)方法
- charAt(index) 返回指定位置的字符
- concat(string) 连接字符串
- indexOf(str) 返回小字符串在字符串对象中第一次出现位置 -1表示不存在
- lastIndexOf() 返回小字符在字符串中最一次出现的位置
- substr(start, length) 截取字符串 省略长度截取到结束
- substring(start, end) 截取字符串, 省略结束位置 一直到最后
- slice(start, end) 与substring 一模一样
- split(char) 把字符串分割为数组
- toUpperCase() 把字符串转为大写
- toLowerCase() 把字符串转为小写
- match() 匹配字符串 可用正则
- search() 查找字符串 可用正则
- replace() 替换字符串可用正则
- charCodeAt() 返回在指定的位置的字符的 Unicode 编码。
- String.formCharCode() 从字符编码创建一个字符串。
- trim() 去掉两边空格
3.Array
A)创建数组
方式一:
var list = [item1, item2, item3 ...]
方式二:
var list = new Array()
B)数组的添加、删除、修改
添加:
删除:
修改:
- list[index] = value
- list.splice(位置,删除个数,值1,值2...)
C)属性
- length 数组长度 元素个数
D)方法
- reverse() 翻转数组
- sort() 数组排序
- toString() 和 toLocalString() 把数组转换为字符串
- join() 把数组的元素拼接成字符串
- slice() 截取数组中的一部分,返回新的数组 slice(start, end)
- concat() 合并多个数组
- indexOf() 搜索数组中的元素,并返回它所在的位置。
- lastIndexOf() 返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索。
- map() 通过指定函数处理数组的每个元素,并返回处理后的数组。
E)数组的遍历(迭代)
4.类数组对象
-
-
具有length属性
-
常见类数组对象: arguments, 元素的列表(NodeList)
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>类数组对象title>
head>
<body>
<div class="item">1div>
<div class="item">2div>
<div class="item">3div>
<div class="item">4div>
<div class="item">5div>
<script>
//for ... of
var list = [1,2,3,4,5]; //纯的
var itemList = document.querySelectorAll('.item');
console.log(list);
console.log(itemList);
console.log(list.constructor);
console.log(itemList.constructor);
function demo(){
console.log(arguments.constructor)
}
demo();
console.log(itemList[0])
console.log(itemList.length);
for (var i = 0; i < itemList.length; i ++) {
console.log(itemList[i])
}
console.log('');
for (var i in itemList) {
console.log(i, itemList[i])
}
itemList.forEach(function(value, index) {
console.log(value)
})
script>
body>
html>
5.Function
A)属性
-
prototype 原型
-
length 形参的数量
B)方法
- apply() 将函数作为一个对象的方法调用
- call() 将函数作为对象的方法调用
-
function fn() { //遍历所有的实参 [].forEach.call(arguments, function(val, index){ console.log(val) }) }
- bind() 返回一个作为方法调用的函数
6.Math
A)属性
- PI 返回圆周率(约等于3.14159)
B)方法
- abs(x) 返回数的绝对值。
- sqrt(x) 返回数的平方根。
- pow(x,y) 返回 x 的 y 次幂。
- ceil(x) 对数进行上舍入。
- floor(x) 对数进行下舍入。
- round(x) 把数四舍五入为最接近的整数。
- max(x,y) 返回 x 和 y 中的最高值。
- min(x,y) 返回 x 和 y 中的最低值。
- random() 返回 0 ~ 1 之间的随机数。
-
//取 0到10之间的随机数 console.log( Math.floor(Math.random() * 11)); //0到11 console.log( Math.round(Math.random() * 11)); //0到28 console.log(Math.floor(Math.random() * 29)); //7-17随机数 //取0~10 + 7 console.log(Math.floor(Math.random() * 11) + 7);
7.Date
属性:
- getYear() 请使用 getFullYear() 方法代替。
- getFullYear() 从 Date 对象以四位数字返回年份。
- getMonth() 从 Date 对象返回月份 (0 ~ 11)。
- getDate() 从 Date 对象返回一个月中的某一天 (1 ~ 31)。
- getDay() 从 Date 对象返回一周中的某一天 (0 ~ 6)。
- getHours() 返回 Date 对象的小时 (0 ~ 23)。
- getMinutes() 返回 Date 对象的分钟 (0 ~ 59)。
- getSeconds() 返回 Date 对象的秒数 (0 ~ 59)。
- getMilliseconds() 返回 Date 对象的毫秒(0 ~ 999)。
- getTime() 返回 1970 年 1 月 1 日至今的毫秒数。
- getTimezoneOffset() 返回本地时间与格林威治标准时间 (GMT) 的分钟差。
- getUTC.... 标准时区
- set...
- setUTC...
- toTimeString() 把 Date 对象的时间部分转换为字符串。
- toDateString() 把 Date 对象的日期部分转换为字符串。
- toUTCString() 根据世界时,把 Date 对象转换为字符串。
- toLocaleString() 根据本地时间格式,把 Date 对象转换为字符串。
- toLocaleTimeString() 根据本地时间格式,把 Date 对象的时间部分转换为字符串。
- toLocaleDateString() 根据本地时间格式,把 Date 对象的日期部分转换为字符串。
8.RegExp
A)创建正则
B)属性
- global RegExp 对象是否具有标志 g。
- ignoreCase RegExp 对象是否具有标志 i。
- lastIndex 一个整数,标示开始下一次匹配的字符位置。
- multiline RegExp 对象是否具有标志 m。
- source 正则表达式的源文本。
C)方法