javaScript(js)
1、概述
javaScript是一门世界上流行的脚本语言!
java、javaScript
一个合格的后端人员,必须精通javaScript
ECMAScript它可以理解为是javaScript的一个标准
开发环境–线上环境,版本不一致!
2、快速入门
2、1 引入javaScript
1、内部标签
2、外部标签引入
<!--script标签内,写javaScript代码-->
<!--<script>
alert('hello,world');
</script>-->
<!--外部引入-->
<!--注意:标签必须成对出现-->
<script src="js/qj.js"></script>
alert('hello,world');
2、2 基本语法入门
<!--javaScript严格区分大小写-->
<script>
// 定义变量
var score = 65;
// alert(score);
// 条件控制
if(score>60 ){
alert('成绩合格');
}else{
alert('成绩不合格');
}
</script>
2、3 数据类型
数值、文本、图形、音频、视频
number
js不区分小数和正数,number
123 //整数123
123.1 //浮点数123.1
1.123e3 //科学计数法
-99 //负数
NaN // not a number
Infinity //表示无限大
字符串
’abc’ “abc”
布尔值
true,false
逻辑运算
比较运算符
=
== 等于(类型不一样,值一样,也会判断为true)
=== 绝对等于(类型一样,值一样,结构true)
浮点数:
console.log((1/3)===(1-2/3))
j尽量避免使用浮点数进行运算,存在精度问题!
null和undefined
- null:空
- undefined:未定义
数组
//保证代码的可读性
var arr = [1,2,3,4,5,6,'hello',null,true];
取数组下标:如果越界了,就会:undefined
对象
对象是大括号,数组是中括号
var person = {
name:"zhangsan",
age:3,
tags:['js','java']
}
取对象的值
person.name
person.age
2、4 严格检查模式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
'use strict';
//严格检查模式,预防javaScript的随意性导致产生一些问题,use strict 必须写在第一行
/*局部变量建议使用let定义*/
let i = 1;
</script>
</head>
<body>
</body>
</html>
3、数据类型
3、1 字符串
1、正常字符串我们使用 单引号或者双引号包裹
2、注意转义字符 \
\'
\n
\t
\u4e2d \u#### Unicode字符
\x41 Ascll字符
<script>
'use strict'
var a= 'abc\'';
alert(a)
</script>
3、多行字符串编写
var msg =
`hello
world
你好`;
alert(msg);
4、模版字符串
let name ="zhangsan";
msg =`ni hao ya,${name}`;
alert(msg)
5、字符串长度
str.length
6、字符串的可变性,不可变
7、大小写转换
//注意,这里是方法,不是属性
student.toUpperCase()
student.toLowerCase()
3、2 数组
Array可以包含任意的数据类型
var arr=[1,2,3,4,5,6] //通过下表进去取值和赋值
1、length 长度
arr.length
6
注意:假如给arr.length赋值,数组大小就会发生变化~,如果赋值过小,元素就会丢失
2、indexOf, 通过元素获得下标索引
arr.indexOf(2)
1
字符串的"1"和数字 1 是不同的
3、slice() 截取Array的一部分,返回一个新数组,类似于String中的subString
4、push,pop
push: 压入到尾部
pop:弹出尾部的一个元素
**5、unshift(),shift()**头部
unshift: 压入到头部
shift: 弹出头部的一个元素
6、排序sort()
arr.sort()
7、元素反转 reverse()
8、concat()
arr.concat([1,2,3])
(6) ["A", "B", "C", 1, 2, 3]
注意:concat()并没有修改数组,只是会返回一个新的数组
9、连接符join
arr.join('-')
"A-B-C"
打印拼接数组,使用特定的字符串连接
数组:存储数据(如何存,如何取,方法都可以自己实现!)
3、3 对象
若干个键值对
var 对象名 = {
属性名:属性值,
属性名:属性值,
属性名:数值型
}
var person ={
name:"zhangsan",
age:3,
email:"123@com",
score:0
}
JS中的对象,{…}表示一个对象,键值对描述属性xxx:xxxx,,对各属性之间使用逗号隔开,最后一个属性不加逗号!
1、对象赋值
person.name
"zhangsan"
2、使用一个不存在的对象属性,不会报错!undefined
person.aaa
undefined
3、动态的删减属性
delete score
true
4、动态的添加
person.haha="haha"
"haha"
5、判断属性值是否在这个对象中!
'age' in person
true
6、判断一个属性是否是这个对象自身拥有的 hasOwnProperty()
3、4 流程控制
if 判断
var age = 3;
if(age>3){
alert('haha')
}else{
alert('kuwa~')
}
while循环,避免程序死循环
while (age<10){
age=age+1;
console.log(age)
}
for循环
for (let i = 0; i < 100; i++) {
console.log(i)
}
3、5 Map和Set
ES6的新特性~~
Map:
var map = new Map([['tom',100],['jack',90],['hha',99]]);
var score = map.get('tom');
map.set('admin',123456)
alert(score);
alert(map.get('admin'))
Set:无序不重复的集合
var set = new Set([3,1,1,,1,1,]);
set.add(2);
set.delete(1);
3、6 iterator
遍历数组
//通过for of / for in 下标
var arr = [3,4,5];
for (var x of arr){
console.log(x)
}
遍历map
var map=new Map([['tom',100],['Mary',90],['haha',99]]);
for (let x of map){
console.log(x)
}
遍历Set
var set = new Set([5,6,7])
for (let x of set){
console.log(x)
}
4、函数及面向对象
4、1 函数定义及变量作用域
定义方式一
java:
public 返回值类型 方法名(){
return 返回值;
}
绝对值函数
function abs(x){
if(x>0){
return x;
}else{
return -x;
}
}
abs(10)
10
abs(-10)
10
一旦执行到return代表函数结束,返回结果!
如果没有执行return,函数执行完也会返回结果,结果就是undefined
定义方式二
var abs = function(x){
if(x>0){
return x;
}else{
return -x;
}
}
function(x){…}这是一个匿名函数,但是可以把结果赋值给abs,通过abs就可以调用函数
方式一与方式二等价
调用函数
abs(10)
abs(-10)
参数问题:javascript 可以传任意个参数,也可以不传递参数
参数进来是否存在的问题?假设不存在参数,如何规避?
function abs(x){
//手动抛出异常
if (typeof x!=='number'){
throw 'Not a Number';
}
if(x>=0){
return x;
}else{
return -x;
}
}
arguments
arguments
是一个js免费赠送的关键字
代表,传递进来的所有的参数,是一个数组!
function abs(x,a){
console.log("x=>"+x);
for (var i=0;i<arguments.length;i++){
console.log(arguments[i]);
}
if (arguments.length>1){
arguments[1];
}
if(x>=0){
return x;
}else{
return -x;
}
}
问题:arguments包含所有的参数, 有时候想使用多余的参数来进行附加操作,需要排除已有参数~
rest
ES6引入的新特性,获取除了已经定义的参数之外的所有参数 ~ …
function aaa(a,b,...rest){
console.log("a=>"+a);
console.log("a=>"+b);
console.log(rest);
}
rest参数只能写在最后,必须用…标识
4、2 变量的作用域
在js中,var定义变量实际上是有作用域的。
假设在函数体中声明,则在函数体外不可以使用~(闭包)
function qj(){
var x =1;
x =x +1;
}
x= x+1;//Uncaught ReferenceError: x is not defined
如果两个独立函数使用了相同的变量名,只要在函数内部定义,就不会冲突!
内部函数可以访问外部函数的成员,反之不行!
假设内部函数变量和外部函数的变量,重名!
function qj(){
var x =1;
function qj2(){
var x = 'A';
}
}
qj()
假设在js中,函数查找变量从自身函数开始~,由"内"向"外"查找,假设外部存在这个同名 的函数变量,则内部函数会屏蔽外部函数的变量。
提升变量的作用域
function qj(){
var x = "x"+y;
var y = 'y';
}
结果:xundefined
说明:js执行引擎,自动提升了y的声明,但是不会提升变量y的赋值;
function qj2(){
var y;
var x = "x"+ y;
y = 'y';
}
这个是在js建立之初就存在的特性,养成规范:所有的变量定义都放在函数的头部,不要乱发,便于代码维护;
全局函数
var x = 1;
function f1(){
x=x+1;
}
function f2(){
x=x+1;
}
全局对象 window
var y = 'xxx';
alert(y);
alert(window.y);//默认所有的全局变量,都会自动绑定在window对象下
alert()这个函数本身也是一个window
对象;
js实际上只有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到,报错RefrenceErroe
;
规范
由于所有的全局变量都会绑定到我们的window上,如果不同的js文件,使用了相同的全局变量,产生冲突~
如何能够减少冲突?
//唯一全局变量
var KuangApp ={};
//定义全局变量
KuangApp.name = 'kuangshen';
KuangApp.add = function (a,b){
return a+b;
}
把自己的代码全部放入自己定义的唯一空间名字中,境地全局命名冲突的问题~
jQuery
局部作用域 let
function aaa(){
for (var i = 0; i < 10; i++) {
console.log(i);
}
console.log(i+1); // i出了这个作用域还可以使用
}
ES6 let关键字,解决局部作用域冲突问题!
function aaa(){
for (let i = 0; i < 10; i++) {
console.log(i);
}
console.log(i+1);
}
建议使用let去定义局部作用域的变量;
常量 const
在ES6之前,怎么定义常量:只有全部大写字母命名的变量就是常量;建议不要修改这样的值
var PI ='3.14';
PI ='3.213';
在ES6引入了关键字:const
const PI ='3.14';
4、3 方法
定义方法
var zhangsan = {
name:"zhangsan",
birth:2000,
//方法
age:function (){
var now =new Date().getFullYear();
return now - this.birth;
}
}
//属性
zhangsan.anme
//方法,一定要带()
zhangsan.age()
this.代表什么?拆开上面的代码~~
function getAge(){
var now =new Date().getFullYear();
return now - this.birth;
}
var zhangsan = {
name:"zhangsan",
birth:2000,
//方法
age:getAge
}
//zhangsan.age() ok
this是无法指向的,是默认指向调用它的那个对象;
apple
在js中可以控制this指向
function getAge(){
var now =new Date().getFullYear();
return now - this.birth;
}
var zhangsan = {
name:"zhangsan",
birth:2000,
//方法
age:getAge
}
//zhangsan.age() ok
getAge.apply(zhangsan,[]);
5、内部对象
标准对象
typeof 123
"number"
typeof '123'
"string"
typeof true
"boolean"
typeof []
"object"
typeof {}
"object"
typeof Math.abs
"function"
5、1 Date
基本使用
var time = new Date(); //Tue Jan 12 2021 16:07:55 GMT+0800 (中国标准时间)
time.getFullYear(); //年份
time.getMonth(); //月
time.getDate(); //日
time.getHours(); //小时
time.getMinutes(); //分
time.getSeconds(); //秒
time.getTime();
new Date(1610439004634);
转换
time.toLocaleString()
"2021/1/12 下午4:10:04"
5、2 JSON
json是什么?
早期,所有数据传输习惯使用xml文件!
- json是一种轻量级的数据交换格式。
- 简洁和清晰的层次结构使得JSON成为理想的数据交换语言。
- 易于人阅读和编写,同时也易于机器解析和生成,并有效提高网络的传输效率。
在js中一切皆为对象、任何js支持的类型都可以用JSON来表示:number,string…
格式:
- 对象都用{}
- 数组都用[]
- 所有的键值对都用key:value
JSON字符串和JS对象的转换
var user ={
name:"zhangsan",
age:3,
sex:'男'
}
//对象转换为json字符串
var jsonuser = JSON.stringify(user);
//json字符串转化为对象,参数为json字符串
var obj = JSON.parse('{"name":"zhangsan","age":3,"sex":"男"}');
/*
{name: "zhangsan", age: 3, sex: "男"}
age: 3
name: "zhangsan"
sex: "男"
*/
JSON和JS对象的区别
var obj = {a:'hello',b:'world'};
var json = '{"a":"hello","b":"world"}'
6、面向对象编程
6、1 什么是面向对象?
类:模版 原型对象
对象:具体的实例
原型:
var student={
name:"zhangsan",
age:18,
run:function (){
console.log(this.name+"run.......");
}
};
var xiaoming = {
name: "xiaoming"
};
//xiaoming的原型是student
xiaoming._protp_=user;// _protp_ 原型
function student(name){
this.name=name;
};
//给student新增一个方法
student.prototype.hello = function (){
alert("Hello");
};
class 继承
class
关键字,是在ES6引入的
1、定义一个类、属性、方法
//定义一个学生的类
class Student{
constructor(name) {
this.name = name;
}
hello(){
alert("hello")
}
}
var xiaoming = new Student("xiaoming");
var xiaohong = new Student("xiaohong");
xiaoming.hello()
2、继承
class Student{
constructor(name) {
this.name = name;
}
hello(){
alert("hello")
}
}
class xiaostudent extends Student{
constructor(name,grade) {
super(name);
this.grade = grade;
}
mygrade(){
alert("我是一名小学生");
}
}
var xiaoming = new Student("xiaoming");
var xiaohong = new xiaostudent("xiaohong");
本质:产看对象的本质
console.log(xiaohong)
xiaostudent {name: "xiaohong", grade: undefined}
grade: undefined
name: "xiaohong"__proto__: Student
constructor: class xiaostudent
mygrade: ƒ mygrade()
__proto__: Object
undefined
原型链
__ proto __
7、 操作Bom对象(重点)
浏览器
JS 和 浏览器的关系?
js的诞生就是为了能够让它在浏览器中运行 !
BOM:浏览器对象模型
- IE 6~11
- Chrome
- Safari
- FireFox Linux默认浏览器
三方:
- QQ浏览器
- 360浏览器
window
window 代表 浏览器窗口
window.alert(1)
window.innerHeight
...
Navigator
Navigator,封装了浏览器的信息
navigator.appName
...
大多数时候,我们不会使用Navigator
对象,因为会被人为的修改!
不建议使用这些属性来判断和编写代码
screen
代码屏幕尺寸
screen.width
...
location(重要)
location代表当前页面的URL信息
host: "www.baidu.com"
hostname: "www.baidu.com"
href: "https://www.baidu.com/"
origin: "https://www.baidu.com"
pathname: "/"
port: ""
protocol: "https:"
reload: ƒ reload() //刷新网页
//设置新的地址
document
document代表当前页面,HTML DOM文档数
document.title
"百度一下,你就知道"
document.title='张三'
'张三'
获取具体的文档数节点
<dl id="">
<dt>Java</dt>
<dt>JavaSe</dt>
<dt>JavaEE</dt>
</dl>
<script>
var dl = document.getElementById('app');
</script>
获取cookie
document.cookie
劫持cookie原理
www.taobao.com
<script src="aa.js"></script>
<!--恶意人员:获取cookie上传到他的服务器-->
服务器端可以设置:cookie:httpOnly
history
代表浏览器的历史记录
history.back() //后退
history.forward() //前进
8、 操作Dom对象(重点)
DOM:文档对象模型
核心
浏览器网页就是一个DOM树形结构!
- 更新:更新Dom节点
- 遍历dom节点:得到dom节点
- 删除:删除一个dom节点
- 添加:添加一个新的节点
要操作一个dom节点,就必须要先获得这个Dom节点 ~
获得dom节点
<div id="father">
<h1>标题一</h1>
<pi id="p1">p1</pi>
<p class="p2">p2</p>
</div>
<script>
//对应css选择器
var h1 = document.getElementsByTagName('h1')
var p1 = document.getElementById('p1')
var p2 = document.getElementsByClassName('p2')
var father = document.getElementById('father')
var childrens = father.children;
// father.firstChild;
// father.lastChild;
</script>
这是原生代码,之后我们尽量使用jQuery()!
更新节点
<div id="id1">
</div>
<script>
var id1 = document.getElementById('id1');
//修改文本的值
id1.innerText='456'
//可以解析HTML文本标签
id1.innerHTML='<strong>123</strong>'
</script>
操作js
id1.style.color='red'
"red"
id1.style.fontSize='100px'
"100px"
id1.style.padding='2em'
"2em"
删除节点
删除节点的步骤:先找到父节点,再删除节点
<div id="father">
<h1>标题一</h1>
<pi id="p1">p1</pi>
<p class="p2">p2</p>
</div>
<script>
var p1 = document.getElementById('p1')
var father = p1.parentElement;
father.removeChild(p1)
</script>
注意:删除多个节点的时候,注意节点是时刻变化的,删除节点的时候一定要注意;
插入节点
我们获得了某个dom节点,假设这个dom节点是空的,我们通过innerHTML就可以增加一个元素了,但是这个DOM节点已经存在元素了,我们就不能这么干了!会产生覆盖
追加
<p id="js">JavaScript</p>
<div id="list">
<p id="se">JavaSE</p>
<p id="ee">JavaEE</p>
<p id="me">JavaME</p>
</div>
<script>
var js = document.getElementById('js');
var list = document.getElementById('list');
list.append(js); //追加
</script>
创建一个新的标签,实现插入
<p id="js">JavaScript</p>
<div id="list">
<p id="se">JavaSE</p>
<p id="ee">JavaEE</p>
<p id="me">JavaME</p>
</div>
<script>
var js = document.getElementById('js'); //已存在的节点
var list = document.getElementById('list');
//list.append(js);
//通过js,创建一个新的节点
var newp = document.createElement('p');
newp.id='newp';
newp.innerText='hello,world';
list.appendChild(newp);
</script>
<p id="js">JavaScript</p>
<div id="list">
<p id="se">JavaSE</p>
<p id="ee">JavaEE</p>
<p id="me">JavaME</p>
</div>
<script>
var js = document.getElementById('js'); //已存在的节点
var list = document.getElementById('list');
//list.append(js);
//通过js,创建一个新的节点
var newp = document.createElement('p');
newp.id='newp';
newp.innerText='hello,world';
//创建一个标签节点(通过这个属性,可以设置任意的值)
var myscript = document.createElement('script');
myscript.setAttribute('type','text/javascript');
var mystyle = document.createElement('style');
mystyle.setAttribute('type','text/css');
mystyle.innerHTML='body{background-color:chartreuse;}';
document.getElementsByTagName('head')[0].appendChild(mystyle);
</script>
insert
var ee = document.getElementById('ee');
var js = document.getElementById('js');
var list = document.getElementById('list');
//要包含的节点.insertBefore(newNode,targetNode)
list.insertBefore(js,ee);
9、操作表单(验证)
表单是什么? form DOM树
- 文本框:text
- 下拉框:select
- 单选框:radio
- 复选框:
- 隐藏框:
- 密码框:
- …
获得提交的信息
<form action="post">
<p>
<span>用户名:</span> <input type="text" id="user-name-label">
</p>
<!--多选框的值,就是定好的value-->
<p>
<span>性别:</span>
<input type="radio" name="sex" value="boy" id="b">男
<input type="radio" name="sex" value="girl" id="g">女
</p>
</form>
<script>
var input_text = document.getElementById('user-name-label')
var boy_radio = document.getElementById('b')
var girl_radio = document.getElementById('g')
//得到输入框的值
input_text.value
//修改输入框的值
input_text.value='123'
//对于单选框,多选框等待固定的值,boy_radio.value只能取到当前的值
boy_radio.checked; //查看返回的结果,是否为true,如果为true,则被选中
girl_radio.checked=true; //赋值
</script>
提交表单
<form action="#" method="post">
<p>
<span>用户名:</span> <input type="text" id="username" name="username">
</p>
<p>
<span>密码:</span> <input type="password" id="password" name="password">
</p>
<!--绑定事件onclick被点击-->
<button type="submit" onclick="aaa()">提交</button>
</form>
<script>
function aaa(){
// alert(1)
var uname= document.getElementById('username')
var upwd = document.getElementById('password')
console.log(uname.value)
console.log(upwd.value)
}
</script>
10、jQuery
JS
jQuery库,里面存在大量的JS函数库!
获取jQuery
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>-->
<script src="lib/jquery-3.4.1.js"></script>
</head>
<body>
<!--
公式:$(selector).action()
-->
<a href="" id="test-jquery">点我</a>
<script>
//选择器就是css的选择器
$('#test-jquery').click(function (){
alert('hello-jquery');
})
</script>
</body>
</html>
选择器
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="lib/jquery-3.4.1.js"></script>
</head>
<body>
<script>
//原生js,选择器少,麻烦不好记
//标签
document.getElementsByTagName()
//id
document.getElementById()
//类
document.getElementsByClassName()
//jQuery css 中的选择器都能用
$('p').click();//标签选择器
$('#id1').click();//id// 选择器
$('.class1').click();//类选择器
</script>
</body>
</html>
文档工具站:http://jquery.cuishifeng.cn/
事件
- 鼠标事件
- 键盘事件
- 其他事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="lib/jquery-3.4.1.js"></script>
<style>
#divMove{
width: 500px;
height: 500px;
border: 1px solid red;
}
</style>
</head>
<body>
<!--要求:获取鼠标当前的一个坐标-->
mouse: <span id="mouseMove"></span>
<div id="divMove">
在这里移动鼠标试试
</div>
<script>
//当网页元素加载完毕之后,响应事件
$(function (){
$('#divMove').mousemove(function (e){
$('#mouseMove').text(' x:'+e.pageX+' y:'+e.pageY)
})
})
</script>
</body>
</html>
操作dom
节点文本操作
$('#test-ul li[name=python]').text(); //获得值
$('#test-ul li[name=python]').text('设置值');//设置值
$('#test-ul').html(); //获得值
$('#test-ul').html('设置值'); //设置值
css操作
$('#test-ul li[name=python]').css('color','red');
元素的显示和隐藏
本质display:none
$('#test-ul li[name=python]').show(); //显示
$('#test-ul li[name=python]').hide(); //隐藏