JavaScript 入门
JavaScript
JavaScript 是脚本语言
ECMAScript它可以理解为是JavaScript的一个标准
最新版本已经到 es6 版本~
但是大部分浏览器还只停留在支持 es5 代码上!
开发环境---线上环境,版本不一致
快速入门
引入JavaScript
1.内部标签
<script type="text/javascript"></script>
2.外部标签
<!--外部引入-->
<!--注意:script,必须成对出现-->
<script src="js/first.js"></script>
基本语法
<script>
//JavaScript严格区分大小写
//1.定义变量
let score = 71;
// let zz = 2;
// alert(num)
//2.条件控制
if (score>60 && score<70){
alert("60~70")
}else if (score>70 && score<80){
alert("70~80")
}else {
alert("other")
}
// console.log(score)在浏览器控制台打印变量
/**
*/
</script>
数据类型
数值,文本,图形,音频,视频。。。
js不区分小数和整数
变量
不能用数字开头
number
//整数 123
//浮点数 123.1
//科学计数法 1.123e3
//负数 -99
//NaN not a number
//表示无限大 infinity
字符串
// 'abc' "abc"
布尔值
//true false
逻辑运算
//&& 两个都为真,结果为真 || 一个为真,结果为真 ! 真即假,假即真
比较运算符
//= 赋值
// == 等于(类型不一样,值一样,也会判断为true)
//=== 绝对等于(类型一样,值一样,结果为true)
- 须知:
浮点数问题//NaN===NaN,这个与所有的数值都不相等,包括自己 //只能通过isNaN(NaN)来判断这个数是否是NaN
尽量避免使用浮点数进行运算,存在精度问题!console.log((1/3) === (1-2/3)) //结果为false
Math.abs(1/3-(1-2/3))<0.0000001 //一般这样成立就认为相等
null 和 nudefined
null 空
undefined 未定义
数组
java的数组是一系列相同类型的对象,JavaScript不需要
//保证代码的可读性尽量使用[]
let arr = [1,2,true,3,4,5,'hello',null]
new Array(1,2,true,3,4,5,'hello',null)
取数组下标:如果越界了就会
undefined
对象
对象是大括号,数组是中括号
每个属性之间使用逗号隔开,最后一个不需要添加
let person = {
name:"hudu",
age:3,
tags:['java','js','web','...']
}
取对象的值
person.name
> hudu
person.age
> 30
严格检查格式
<!--
'use strict'
前提:IDEA需要支持ES6语法
局部变量建议都使用let去定义~
-->
<script>
//严格检查模式,严格检查模式,预防JavaScript的随意性导致产生的一些问题
//必须写在JavaScript的第一行
'use strict'
//全局变量
let i = 1;
//ES6 let
</script>
数据类型
字符串
1、正常字符串我们使用单引号,或者双引号包裹
2、注意转义字符
\'
\n
\t
\u4e2d \u#### Unicode字符
\x41 Ascll字符
3、多行字符串
let msg = `hello
world
你好
hi~`;
4、模版字符串
let name = 'hudu';
let age = 3;
let msg2 = `你好呀,${name}`;
5、字符串长度
let student = 'student';
console.log(student.length)
6、字符串可变性:不可变
7、大写转换
//注意这里是方法,不是属性
student.toUpperCase()
student.toLowerCase()
student.indexOf('t')//获取指定的字符位置
student.substring(2)//从二个到最后,两个参数表示第几到第几个,左闭右开
数组
slice() 截取 Array 的一部分,返回一个新数组
push() pop() 尾部
unshitf() 压入头部 shitf() 弹出头部
sort()
reverse()
arr.concat([1,2,3]) 返回新的数组
join('-') 打印拼接数组,使用特定的字符串连接
多维数组
arr[[1,2],[3,4]]
对象
若干个键值对
JavaScript 中的所有键都是字符串,值任意
1、对象赋值
2、使用不存在的属性不会报错,undefined
3、动态删减属性 delete person.name
4、动态添加属性 person.email = 'sfasf@gmail.com',直接给属性添加值即可
5、判断属性是否在这个对象中 'age' in person
6、判断属性是否是这个对象自身拥有hasOwnProperty
流程控制
if(){}else if(){}else{}
while()
do{}while()
for()
for(var num in age){} num为索引
for(var num of age){} num为具体的值
forEach(function(value){})
Map 和 Set
<script>
'use strict'
let map = new Map([['tom',99],['jack',80],['alex',90]]);
let msg = map.get('alex');
console.log(msg);
map.set('admin',123);
</script>
Set:无序不重复的集合
<script>
'use strict'
let set = new Set([3,1,1,1,1,1]);
set.add(2);
set.delete(1);
console.log(set.has(3));
console.log(Array.from(set));
</script>
iterator
for(let i of map)
函数
定义
function abs(x){
if(x>=0){
return x;
}else{
return -x;
}
}
一旦执行到return代表函数结束,返回结果!
如果没有执行 return,函数执行完也会返回结果,结果就是 undefined
arguments 是一个 JS 免费赠送的关键字;
代表,传递进来的所有的参数,是一个数组!
//rest 只能写在最后面
//获取除了已经定义的参数外的所有参数
function aaa(a,b,...rest){
console.log("a>"+a);
console.log(rest);
}
变量作用域
function qj() {
var x="x"+y
console.1og(x);
var y='y';
}
结果 : xundefined
说明:js 执行引擎,自动提升 y 的声明,但是不会提升变量 y 的赋值;
function qj2(){
var y;
var x = "x"+y;
console.log(x);
y = 'y';
}
这个是在JavaScript建立之初就存在的特性。养成规范:所有的变量定义都放在函数的头部,不要乱放,便于代码维护;
全局函数
全局对象 window
var x='xxx';
alert(x);
alert(window.x); //默认所有的对象都绑定在window对象上
alter()这个函数本身就是window的变量
var x='xхх';
window.alert(x);
var old_alert = window.alert;
//o1d_alert(x);
window.alert = function (){
};
//发现alert() 失效了
window.alert(123);
//恢复
window.alert =old_alert;
window.alert(456) ;
Javascript 实际上只有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到,会报错ReferenceError
规范
由于所有的全局变量都会绑定到window上,如果不同的js文件,使用相同的全局变量,冲突—>如何减少冲突
//唯一全局变量
let huduapp = {};
//定义全局唯一变量
huduapp.name = "hudu";
huduapp.add = function (a,b) {
return a+b;
}
把自己的代码全部放在自定义的唯一空间名字中,降低全局命名冲突问题
局部作用域 let
function aaa() {
for (var i = 0;i<100;i++){
// for (let i = 0;i<100;i++){
console.log(i)
}
console.log(i+1);//使用var i出了这个作用域还可以使用
}
常量 const
只读变量
var PI = '3.14';
console.log(PI);
PI='123';//可以改变这个值
console.log(PI);
ES6中引入这个常量const
const PI='3.14';//只读常量
console.log(PI);
PI='123';
方法
定义方法
方法就是把函数放在对象的里面,对象只有两个东西:属性和方法
<script>
let hudu = {
name:'hudu',
birth:1990,
age:function () {
let now = new Date().getFullYear();
return now - this.birth;
}
}
</script>
this 代表什么
function getAge(){
let now = new Date().getFullYear();
return now - this.birth;
}
let hudu = {
name:'hudu',
birth:1990,
age: getAge
}
this 是无法指向的,是默认指向调用它的那个对象;
apply
在js中可以控制this的指向
getAge.apply(hudu,[])//this指向了hudu对象,参数为空参
内部对象
标准对象
typeof 123
"number"
typeof '123'
"string"
typeof true
"boolean"
typeof NaN
"number"
typeof []
"object"
typeof {}
"object"
typeof Math.abs
"function"
typeof undefined
"undefined"
Date
基本使用
let date = new Date();//Sun Jul 05 2020 12:49:42 GMT+0800 (China Standard Time)
date.getFullYear();//年份
date.getMonth();//月份 0~11
date.getDate();//天
date.getDay();//星期几
date.getHours();//小时
date.getMinutes();
date.getSeconds();
date.getTime();//时间戳
console.log(new Date(1593924582331))//时间戳转为时间
date.toLocaleString();//本地时间
JSON
格式
对象都用{}
数组都用[]
所有的键值对都是用key:value
'use strict' let user = { name:'hudu', age:30, sex:'man' } //对象转化为JSON字符串,{"name":"hudu","age":30,"sex":"man"} let json_user = JSON.stringify(user) //json字符串转化为对象,参数为json字符串 let obj = JSON.parse('{"name":"hudu","age":30,"sex":"man"}');
json字符串和json对象区别
var obj = {a:'helloa',b:'hellob'} let json = '{"a":"hello","b":"hellob"}';
Ajax
- 原生的js写法 xhr异步请求
- jQuery封装好的方法${“#name”}.ajax(“”)
- axios请求
面向对象编程
什么是对象
Java中
类:模板
对象:具体的实例
在JavaScript中
类:原型对象
对象:具体的实例
let student = {
name:'hudu',
age:20,
run:function () {
console.log(this.name+"run...")
}
}
let xiaoming = {
name:'xiaoming'
}
//小明的原型是student
//原型对象
xiaoming.__proto__ = student;
class继承
class
关键字是ES6引入的。
定义一个类,属性,方法
<script>
function Student(name) {
this.name = name;
}
//给student新增一个方法
Student.prototype.hello = function () {
alert('Hello')
}
//ES6之后
//定义一个学生的类
class student{
constructor(name) {
this.name = name;
}
hello(){
alert('hello')
}
}
let xiaoming = new Student('xiaoming');
</script>
继承
class xiaoxue extends Student{
constructor(name,grade) {
super(name);
this.grade = grade;
}
myGrade(){
alert('我是'+this.grade+'班小学生');
}
}
let xiaohong = new xiaoxue('xiaohong',1)
本质:查看对象原型
xiaohong
xiaoxue {name: "xiaohong", grade: 1}
grade: 1
name: "xiaohong"
__proto__: Student
原型链
操作 BOM 对象(重点)
BOM:浏览器对象模型
window
window 代表浏览器窗口
window.alert(1);
undefined
window.innerHeight
150
window.innerWidth
944
window.outerHeight
624
window.outerWidth
944
Navigator(不建议使用)
Navigator 封装了浏览器信息
window.navigator.appCodeName
"Mozilla"
window.navigator.appName
"Netscape"
window.navigator.appVersion
"5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
navigator.platform
"MacIntel"
大多数时候,不会使用navigarot
,会被人为修改
不建议使用这些属性来判断和编写代码
screen
screen.width
1440
screen.height
810
location
location 代表当前页面URL信息
hash: ""
host: "www.baidu.com"
hostname: "www.baidu.com"
href: "https://www.baidu.com/"
origin: "https://www.baidu.com"
pathname: "/"
port: ""
protocol: "https:"
reload: ƒ reload()//刷新网页
//设置新的地址
location.assign('https://www.bilibili.com/')
document
document代表当前页面,HTML DOM文档树
document.title
"哔哩哔哩 (゜-゜)つロ 干杯~-bilibili"
document.title = 'hudu'
获取具体的文档树节点
<dl id="app">
<dt>Java</dt>
<dd>JavaSE</dd>
<dd>JavaEE</dd>
</dl>
<script>
let dl = document.getElementById('app')
</script>
获取 cookie
document.cookie
""
劫持 cookie 原理
www.taobao.com
<script src="aaa.js">
</sript>
<!--恶意人员;获取你的cookie上传到他的服务器~-->
服务器端可以设置cookie:httpOnly
history
代表浏览器的历史记录(不建议使用)
history.forward()
history.back()
操作DOM对象
DOM 文档对象模型
核心
浏览器网页就是一个Dom树形结构!
- 更新:更新Dom节点
- 遍历Dom节点:得到dom节点
- 删除:删除dom节点
- 添加:添加一个新的dom节点
要操作一个Dom节点,就不需要获得这个Dom节点
获得dom节点
//标签
let h1 = document.getElementsByTagName('h1');
let p1 = document.getElementById('p1');
let p2 = document.getElementsByClassName('p2');
let father = document.getElementById('father');
let children = father.children//获取父节点下的所有子节点
father.lastChild;
father.firstChild;
p1.nextElementSibling;
这是原生代码,之后我们尽量使用jQuery();
更新节点
<body>
<div id="id1">
</div>
<script>
let id1 = document.getElementById('id1')
id1.innerText = 123;
</script>
</body>
操作文本
id1.innerText = 123;
修改文本值id1.innerHTML = '<strong>12345</strong>'
可以极细HTML文本标签
是覆盖操作
操作js
id1.style.color = 'red'//属性使用字符串
id1.style.fontSize = '20px'//下划线驼峰命名
删除节点
删除节点步骤,先获取父节点,再删除节点
<div id="father">
<h1>标题一</h1>
<p id="p1">p1</p>
<p class="p2">p2</p>
</div>
<script>
let father = document.getElementById('father');
let self = document.getElementById(p1);
let father1 = self.parentElement;
father1.removeChild(self);
// father.removeChild(p1);
</script>
father.children
HTMLCollection(3) [h1, p#p1, p.p2, p1: p#p1]
father.children[0]
<h1>标题一</h1>
注意:删除多个节点的时候,children是在时刻变化的,删除节点的时候一定要注意
插入节点
我们获得了某个dom节点,假设dom节点是空的,我们可以通过innerText或者innerHTML就可以增加一个元素了。
但是这个dom节点如果已经存在元素了,我们就不能这么干,会产生覆盖
追加操作
<p id="js">Java</p>
<div id="list">
<p id="se">JavaSE</p>
<p id="ee">JavaEE</p>
<p id="me">JavaME</p>
</div>
<script>
let js = document.getElementById('js');
let list = document.getElementById('list');
</script>
list.appendChild(js)
<p id="js">Java</p>
创建一个新的标签
let js = document.getElementById('js');
let list = document.getElementById('list');
list.appendChild(js);//追加到后面
//通过JS创建一个新的节点
let newP = document.createElement('p');
// newP.setAttribute('id','newP');
newP.id = 'newP';
// newP.innerHTML = ''
newP.innerText = 'hello';
list.appendChild(newP);
//创建一个标签节点(通过这个属性可以设置任意的值)
let myScript = document.createElement('script');
myScript.setAttribute('type','text/javascript')
//给body设置背景颜色,通过style方式
let body = document.getElementsByTagName('body');
// body[0].style.background = '#66ccff';
//通过添加css实现
let myStyle = document.createElement('style');
myStyle.innerHTML = 'body{background-color:#66ccff;}';
let head = document.getElementsByTagName('head')[0];
head.appendChild(myStyle);
insertBefore
let ee = document.getElementById('ee');
let js = document.getElementById('js');
let list = document.getElementById('list');
//包含他们的节点,insertBefore(newNode,targetNode);
list.insertBefore(js,ee);
操作表单
<form action="">
<p>
<span>用户名:</span><input type="text" id="username">
</p>
<p>
<span>性别</span>
<input type="radio" name="sex" value="man">男<!--checked="true"-->
<input type="radio" name="sex" value="woman">女
</p>
</form>
<script>
let input_text = document.getElementById('username');
// input_text.value='1231231';
let man = document.getElementsByTagName('input')[1];
let woman = document.getElementsByTagName('input')[2];
//对于单选,多选框等,value只能获得值
man.checked;//查看返回结果,是否为true,true为选中
// man.checked = true;//赋值
</script>
提交表单
MD5 加密密码
<!--
表单绑定提交事件
onsubmit 绑定一个提交检测的函数 true false
将这个结果返回给表单使用onsubmit 接收
-->
<form action="#" method="post" onsubmit="return check()">
<p>
<span>用户名:</span><input type="text" required placeholder="请输入用户名" id="username" name="username">
</p>
<p>
<!-- <span>密 码:</span><input type="password" id="password" name="password">-->
<span>密 码:</span><input type="password" id="input-password">
</p>
<input type="hidden" id="md5-password" name="md5-password">
<!-- <input type="submit" value="注册">-->
<!-- 绑定事件 onclick 被点击-->
<!-- <button type="submit" onclick="check()">提交</button>-->
<button type="submit">提交</button>
</form>
<script>
function check() {
let username = document.getElementById('username');
let password = document.getElementById('input-password');
let md5pwd = document.getElementById('md5-password');
md5pwd.value = md5(password.value);
//可以校验判断表单内容。true就是通过提交,false就是不通过
return true;
// console.log(username.value);
// console.log(password.value);
// //MD5算法
// // password.value = '********'
// password.value = md5(password.value)
// console.log(password.value);
}
</script>
jQuery
<!--
公式:$(selector).action()
-->
<a href="#" id="test-jquery">点我</a>
<script>
// let id = document.getElementById('test-jquery');
// id.click();
//选择器就是css的选择器
$('#test-jquery').click(function () {
alert('hello,jquery')
})
</script>
选择器
<script>
document.getElementsByTagName();
document.getElementById();
document.getElementsByClassName();
// jQuery
$('p').click();
$('#id1').click();
$('.class1').click();
</script>
文档工具站:jquery.cuishifeng.cn/
事件
鼠标事件,键盘事件,其他事件
<!--获取鼠标当前坐标-->
mouse:<span id="mouseMove"></span>
<div id="divMove">
在这里移动鼠标试试
</div>
<script>
//当网页元素加载完毕之后,响应事件
// $(document).ready(function () {
//
// })
$(function () {
$('#divMove').mousemove(function (e) {
let x = e.pageX;
let y = e.pageY;
$('#mouseMove').text('x:'+x+'y:'+y);
// console.log(e.pageX)
})
});
</script>
操作 dom
// document.getElementsByClassName('js')
$('#test-ul li[class=python]').text();//获得值
$('#test-ul li[class=python]').text('hello');//设置值
$('#test-ul').html();
css 操作
$('#test-ul li[class=python]').css("color","red");
元素的隐藏和消失
//相当于display:none
$('#test-ul li[class=python]').show();
$('#test-ul li[class=python]').hide();
本作品采用《CC 协议》,转载必须注明作者和本文链接
言简意合,总结到位!