JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的高级编程语言。虽然它是作为开发Web页面的脚本语言而出名的,但是它也被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式(如函数式编程)风格。
概述:JavaScript是只花了十天的就开发出来的编程语言,在这里博主手动劝退没有学过任何严谨编程语言如(C,JAVA)的闸总们,先不要学这个,先去学到面向对象编程,不要盲目碰这个随便的语言!
<script type="text/javascript">
script>
test.html
<script src="javaScript.js">script>
在浏览器打开控制台,点开sources刷新网页点断点进行调试
数值,文本,图像,音频,视频…
number
123 //整数
123.1 //浮点数
1.123e3 //科学计数法
-99 //复数
NaN //not a number
Infinity //表示无穷大
字符串
‘gg’ “gg”
布尔值
true false
逻辑运算符
&& //两个都为真,结果为真
|| //一个为真,结果为真
! //真即假,假即真
比较运算符
= //赋值运算符
== //等于运算符(类型不一样,值一样也会判断为true)
=== //绝对等于运算符(类型一样,值一样,才会判断为true)
假设:
var a=1;
var b="1";
if(a==b){}
它返回的也是未true,因为不严谨,所以它只是比值,不会比类型,这是Javascript一个缺陷,坚持不要使用==比较
须知:
浮点数问题:
console.log((1/3)===(1-2/3))
尽量避免使用浮点数进行运算,存在精度问题!
Math.abs(1/3-(1-2/3))<0.00000001
null和undefined
数组
java的数组必须是相同类型的对象~,js不需要这样
var num=[1,2,3,4,5,null,true];
new Array(1,2,3,4,5,null,true);
取数值下标:如果越界了,不会显示出数组越界,只会显示undefined
对象
对象是用大括号,数组是用中括号~~每个属性使用逗号隔开
var person = {
name:"这",
age: 3,
tags: ['js','json','jqury']
}
取对象的值
person.name;
person.age;
use strict
/*
前提:IDEA需要提前设置支持ES6语法
'use strict';严格检查模式,预防JavaScript的随意性导致产生的一些问题
必须写在JavaScript的第一行
局部变量建议都使用let去定义
*/
<script type="text/javascript">
'use strict';
let i = 1;
</script>
正常字符串我们使用‘’单引号,或者双引号包裹
注意转义支付
\'
\n
\t
\u4e2d \u#### unicode字符
\x41 Asc11字符
多行字符串编写
var one=`hello
wrold
你好世界
杂种`
模板字符串
let name="liaojianli";
let age=3;
let msg=`你好呀,${name}`;
字符串长度
let msg="gg";
console.log(msg.length);
//返回2
字符串大小写
document.write(stu.toUpperCase());//大写
document.write(stu.toLowerCase());//小写
字符串处理
//indexOf()查找字符
stu.indexOf("a");
//substring()截取字符串
[)//半闭合
stu.substring(1);//从第一个字符串截取到最后一个
stu.substring(0,3);//从第零个字符串截取到第三个
Array可以包含任何数据类型
var arr=[1,2,3,4,5,null,'get']
长度
arr.length
注意:加入给arr.length赋值,数组大小就会发生变化~,如果赋值过小,元素就会丢失
indexOf,通过元素获得下标索引
arr.indexOf(2)
slice 截取Array的一部分,和String中的substring一样
arr.slice(1)
push(),pop()—尾部
arr.push('a','b');//压缩到数组的尾部 添加
arr.pop();//弹出尾部的一个元素 删除
unshift(),shift()—同步
arr.unshift('a','b');//压缩到数组的头部 添加
arr.shift();//弹出头部的一个元素 删除
sort()排序
arr1.sort()
(4) ["A", "B", "C", "D"]
reverse()元素反转
arr1.reverse()
(4) ["D", "C", "B", "A"]
concat()
arr1.concat(arr);
(11) ["D", "C", "B", "A", 1, 2, 3, 4, 5, 6, 67]
arr1
(4) ["D", "C", "B", "A"]
注意:concat()并没有修改数组,只是会返回一个新数组
join()
打印连接拼接数组,使用特定 的字符串连接
(4) ["D", "C", "B", "A"]
arr1.join('-');
"D-C-B-A"
若干个键值对
var 对象名={
属性名:属性值,
属性名:属性值,
属性名:属性值
}
//这里定义了一个person对象
var person={
name:'廖',
age:13,
email:'[email protected]'
}
Javascript中的对象,var 对象名={}表示一个对象,键值对描述属性xxxx:xxxx,多个属性之间使用逗号隔开,最后一个属性不加逗号
给对象赋值
person.age=14
14
person.age
14
使用一个不存在的属性,不会报错!会报undefined
person.gg
undefined
动态的删除属性,通过delete删除对象属性
delete person.age
true
person.age
undefined
动态的添加,直接给新的属性添加值即可
person.age=13;
13
person
{name: "廖", email: "[email protected]", age: 13}
判断属性值是否在这个对象中!‘属性名’ in 对象名
'name' in person
true
hasOwnProperty()判断一个对象里是否拥有这个属性
person.hasOwnProperty('age')
true
person.hasOwnProperty('toString')
false
if{}else
let age=3;
if(age>3){
alert("扣你鸡哇");
}else{
alert("书你妈伞");
}
while循环
let age=3;
while(age<100){
age=age+1;
console.log(age);
}
do{}while()循环
let age=3
do{
age=age+1;
console.log(age);
}while(age<100)
for循环
for(var i=0;i<arr.length;i++){
}
let get=[1,2,3,4,5,6,null,'get']
get.forEach(function (value) {
console.log(value)
})
es6新特性~
Map
let map=new Map([[1,'tom'],[2,'get'],[3,'nil']]);
map
Map(3) {1 => "tom", 2 => "get", 3 => "nil"}
map.set(3,"park")
Map(3) {1 => "tom", 2 => "get", 3 => "park"}
map.delete(3)
true
map
Map(2) {1 => "tom", 2 => "get"}
Set
var set=new Set([1,3,4,215,543]);
set.add(43);
console.log(set.has(43));
set.delete(43);
注意:Set集合有查重的效果
es6新特性
遍历数组
//for of是元素值,for in是元素下标
let arr=[1,2,3,4,5,6,6];
for(let a of arr){
console.log(a);
}
遍历Map
let arr=new Map([[1,'gg'],[2,'ss']]);
for(let a of arr){
console.log(a);
}
遍历Set
let arr=new Set([1,2,3,4]);
for(let a of arr){
console.log(a);
}
定义方式一
function 函数名(){
函数执行体;
}
function abs(x){
if(x>=0){
return x;
}else{
return -x;
}
}
abs();
一旦执行到return代表函数结束,返回结果!
如果没有执行return,函数执行完也会返回结果,结果就是undefined
定义方式二
var abs=function () {
console.log('get')
}
abs();
function(){…}这是一个匿名函数。但是把结果赋值给var,通过var就可以调用函数!定义一和定义二等价!
调用函数
参数问题:javascript可以传任意一个参数,也可以不传递参数~
参数进来是否存在这个问题?假设不存在参数呢,如何规避?
if(typeof x !== 'number'){
throw 'Not a Number';
}
//注意:这是判断参数的类型,可以进行一系列修改,建议放在函数首行
arguments
arguments可以用数组下标的方式"[]"引用arguments的元素。arguments.length为函数实参个数,arguments.callee引用函数自身
function a(x) {
console.log("x>"+x);
for (let i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
}
}
问题:arguments包含所有参数,我们有时候想使用多余的参数进行附加操作。需要排除已有参数…
rest 相当于可变参数
es6之前:
if(arguments.length>2){
for (let i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
}
}
es6引入新特性:
function a(x,b,...rest) {
console.log(x);
console.log(b);
console.log(rest);
}
a(1,23,4,532,213)
1
23
(3) [4, 532, 213]
0: 4
1: 532
2: 213
length: 3
注意:rest函数只能写在最后面,必须用…标识
在js当中,var定义的变量是有作用域的。
假设在函数体内声明的变量,那在函数体外无法使用~
function f() {
var x=1;
x=x+1;
}
x=x+2;//Uncaught ReferenceError: x is not defined
问题:假设在函数体内声明的变量,我想在体内声明的那该如何操作?
使用"闭包"实现
如果两个函数使用了相同的变量命名,只要在函数内部声明的变量就互不相干
function f() {
var x=1;
x=x+1;
}
function f1() {
var x="A";
x=x+1;
}
假设函数里嵌套函数
function f() {
//内部函数可以调用外部函数的变量,反之外部调用不了内部的,继承逻辑
var x=1;
function f1() {
var a=2;
a=x+1;
}
var z=a+1;//Uncaught ReferenceError: a is not defined
}
提升变量的作用域
function qj(){
var x='x'+y;
console.log(x);
var y='jj';
//输出为xundefined
}
注意:这里可以提升y的作用域,但是不能提升y的赋值
这个是js建立之初就存在的特性,养成规范:所有变量定义都放在函数头部,不要乱放,便于代码维护
var x=1,
y=x+1,
z,i;///undefined
规范
由于我们所有全局变量会绑定在windows上。如果不同的js文件,使用了相同的全局,冲突~>如果能减少冲突?
var liao={};
liao.name='nice';
console.log(liao.name);
//在这里博主想自己写个jquery,所有命名!!!
把自己的代码全部放jia入自己定义的唯一空间变量中,降低了全局命名冲突的问题~jquery
局部作用域 let
function f(){
for (var i = 0; i < 100; i++) {
console.log(i);
}
console.log(i+1);//问题:i出来这个作用域还能使用
}
ES6–let关键字,解决局部作用域的冲突问题!
function f(){
for (let i = 0; i < 100; i++) {
console.log(i);
}
console.log(i+1);//Uncaught ReferenceError: i is not defined
}
建议大家都使用‘let’去定义局部变量作用域的变量
const 常量
在ES6之前,常量是这样定义的:只用全部大写字母命名的变量就是常量;极度不推荐这种无脑写法!(掩耳盗铃法)
var PAI=3.141926;
在ES6引用进常量关键字:const
const pai=3.1415826;
方法
方法就是把函数放在对象里,对象只有两个对象:属性,对象
var liao={
name:'廖健力',
birth:2003,
age:function () {
var now=new Date().getFullYear();
return now-this.birth;
}
}
拆分这个对象
function getAge() {
var now=new Date().getFullYear();
return now-this.birth;
}
var liao={
name:'廖健力',
birth:2003,
age:getAge
}
//liao.age() 17
//getAge() NaN 因为this.birth指向的是window对象,然而windows对象并没有这个birth值
this是无法指向的,是默认调用它的那个对象;但是可以使用apply来进行调用
apply
在js中可以控制this指向
function getAge() {
var now=new Date().getFullYear();
return now-this.birth;
}
var liao={
name:'廖健力',
birth:2003,
age:getAge
}
getAge().apply(liao,[]);//17 指向liao对象,空值
普通对象
typeof 123//数字
"number"
typeof 'f'//字符串
"string"
typeof []//数组是对象
"object"
typeof {}//对象
"object"
typeof true//布尔值
"boolean"
typeof NaN//NaN是数值
"number"
typeof Math.random//函数式
"function"
typeof undefined//未定义
"undefined"
基本使用
方法 | 描述 |
---|---|
getFullYear() | 获得四位的年(yyyy) |
getMonth() | 获得月(0-11) |
getDate() | 获得以数值计(1-31)的日 |
getDay() | 或者以数值计(0-6)的周 |
getHours() | 获得时(0-23) |
getMinutes() | 获得分钟(0-59) |
getSeconds() | 获得秒(0-59) |
getMilliseconds() | 获得毫秒(0-999) |
getTime() | 获得时间(1970 年 1 月 1 日以来的毫秒) |
转换
x.toLocaleString();//获取本地时间---北京时间
x.toGMTString();//格林威治时间
在javascript一切皆为对象,如何js支持的类型都可以用json来表示;
格式:
JSON字符串和js对象的转化
var liao={
name:"liao",
age:14,
sex:"nan"
}
//对象转化为字符串 {"name":"liao","age":14,"sex":"nan"}
var jsonliao=JSON.stringify(liao);
/*字符串转换为对象
{name: "liao", age: 14, sex: "nan"}
age: 14
name: "liao"
sex: "nan*/
var obj=JSON.parse('{"name":"liao","age":14,"sex":"nan"}');
原型对象
我们先来看一下类与对象的区别和关系
类:相当于一个模板,假如定义给人,人有名字,性别,年龄,外貌
对象:假设我就是从人类中出来的,我是个好人,我叫小明,我今年20 ,我长的像彭于晏
简单的来说:类是对象的抽象,对象是类的实例
原型(_ _ proto _ _)—可理解为继承
var peoson={
name:"niao",
sex:function () {
console.log("我的年龄"+this.name)
}
}
var liao={
name:"廖",
}
liao.__proto__=peoson;//liao的原型指向的peoson
console.log(liao.sex());
class 继承–真正的继承,java永远滴神!
class people{
constructor(name) {
this.name=name;
}
hello(){
alert("hello");
}
}
class liao extends people{
constructor(name) {
console.log(super(name));
}
mygays(){
alert("xd")
}
}
var char=new people("char");
var gays=new liao("hhh");
注意:javascript可以实现继承,但是千万注意,他不管继承什么原型都会指向object(套娃,object又指向他本身)
BOM(Browser Object Mode):浏览器对象模型
浏览器介绍
Javascript和浏览器的关系?
为了人javascript可以在浏览器里运行
IE 6~11 微软
Chrome 谷歌
Safari 苹果
Firefox 火狐
Opera 欧鹏
window对象 浏览器窗口
window.alert(true);
undefined
window.innerHeight;//浏览器内部高度
370
window.innerWidth;//浏览器内部宽度
1920
window.outerHeight//浏览器外部高度
834
window.outerWidth//浏览器外部高度
1536
//大家可以试试有很多好玩的
Navigator 导航器
它封装了浏览器的信息
window.Navigator
ƒ Navigator() { [native code] }
navigator.appName
"Netscape"
navigator.appVersion//浏览器版本信息
"5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"
navigator.userAgent//获取用户系统,配置
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"
navigator.platform//系统版本
"Win32"
大多数我们不会使用navigator,因为这些信息都会被人为修改
screen
代表屏幕尺寸
screen.height
864
screen.width
1536
location (重要)
location代表当前页面的URL信息
host: "www.baidu.com'
href: "https://www.baidu.com/“
location.reload()//刷新页面
location.assgin(”地址“);//去到某个页面
location.replace() //用新的文档替换当前文档
document
document代表页面信息,HTML
document.title
"百度一下,你就知道"
document.title="到此一游"
"到此一游"
获取节点
<label id="get">
label>
<script>
var liao=document.getElementById("get");
script>
获取cookie
document.cookie
"BIDUPSID=882202B07A1DCCCECBD9653ABF75298B; PSTM=1592389793; BAIDUID=882202B07A1DCCCE757E0D79BA93DF78:FG=1; BD_UPN=12314753; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BD_HOME=1; delPer=0; BD_CK_SAM=1; PSINO=7; H_PS_PSSID=1444_31671_32139_31660_32045_32231_31709_32257_26350; COOKIE_SESSION=5743_0_6_4_12_7_1_0_4_5_2_0_5738_0_2_0_1594619343_0_1594619341%7C9%2319_29_1594440569%7C7; __yjsv5_shitong=1.0_7_49feffe033c0189d6cc3d870102c1d60344c_300_1594620862356_106.17.204.235_9266039c"
cookie能干什么呢?
cookie是一个可以计入你的账号和密码等等个人信息,由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
截取cookie原理
<script src="filecookie">script>
服务器端可以设置:cookie:httponly;来防止进入
history
history代表浏览器的历史纪录
history.back();//退回
history.forward();//前进
DOM:文档操作对象
核心
浏览器网页就是一个Dom树形结构!
要操作一个Dom节点,就必须要先获得这个节点
属性 | 描述 | DOM |
---|---|---|
document.anchors | 返回拥有 name 属性的所有 元素。 | 1 |
document.applets | 返回所有 元素(HTML5 不建议使用) | 1 |
document.baseURI | 返回文档的绝对基准 URI | 3 |
document.body | 返回 元素 | 1 |
document.cookie | 返回文档的 cookie | 1 |
document.doctype | 返回文档的 doctype | 3 |
document.documentElement | 返回 元素 | 3 |
document.documentMode | 返回浏览器使用的模式 | 3 |
document.documentURI | 返回文档的 URI | 3 |
document.domain | 返回文档服务器的域名 | 1 |
document.domConfig | 废弃。返回 DOM 配置 | 3 |
document.embeds | 返回所有 元素 | 3 |
document.forms | 返回所有 元素 | 1 |
document.head | 返回 元素 | 3 |
document.images | 返回所有 元素 | 1 |
document.implementation | 返回 DOM 实现 | 3 |
document.inputEncoding | 返回文档的编码(字符集) | 3 |
document.lastModified | 返回文档更新的日期和时间 | 3 |
document.links | 返回拥有 href 属性的所有 和 元素 | 1 |
document.readyState | 返回文档的(加载)状态 | 3 |
document.referrer | 返回引用的 URI(链接文档) | 1 |
document.scripts | 返回所有 |
获得dom节点
document.getElementsByTagName()//通过标签选择器获得节点
document.getElementById()//通过id选择器获得节点
document.getElementsByName()//通过name属性获得节点
document.getElementsByClassName()//通过class选择器获得节点
parentNode//获取所选节点的父节点,最顶层的节点为#document
childNodes //获取所选节点的子节点们
firstChild //获取所选节点的第一个子节点
lastChild //获取所选节点的最后一个子节点
nextSibling //获取所选节点的后一个兄弟节点 列表中最后一个节点的nextSibling属性值为null
previousSibling //获取所选节点的前一兄弟节点 列表中第一个节点的previousSibling属性值为null
获取上一个节点: previousElementSibling
获取下一个节点: nextElementSibling
获取父节点: parentElement
获取子节点: children
更新节点
操作文本
i.innerText("gg");//修改文本的值
i.innerHTML('123');//添加超文本标签
操作样式
i.style.color='red';
i.style.fontSize='300px';
删除节点
删除的步骤:先获取父节点,在通过父节点删除自己
注意:删除多个节点的时候,children是在时刻变化的,删除节点时一定要注意。
插入节点
我们获得了某个dom节点,假设这个dom是空的,我们通过innerHTML就可以增加一个元素了,但是这个dom节点已经是存在元素了,我们就不能这样干!会覆盖
追加
第一种方式添加存在的标签
<html lang="en">
<head>
<meta charset="UTF-8">
<title>插入节点title>
head>
<body>
<p id="pfa">javascriptp>
<div id="list">
<p id="p1">javasep>
<p id="p2">javaeep>
<p id="p3">javamep>
div>
<script type="text/javascript">
var pfa=document.getElementById('pfa'),
list=document.getElementById('list');
list.appendChild(pfa);
script>
body>
html>
创建一个新的标签,实现插入
第二种创建一个新的标签,实现插入
setAttribute():添加属性,(添加的属性,添加属性值)
<p id="pfa">javascriptp>
<div id="list">
<p id="p1">javasep>
<p id="p2">javaeep>
<p id="p3">javamep>
div>
<script type="text/javascript">
var pfa=document.getElementById('pfa'),
list=document.getElementById('list');
let newp=document.createElement('p');//创建一个p标签
newp.innerText='LIAO';
newp.id='newp';
list.append(newp);
script>
var Mystyle=document.createElement('style');
Mystyle.setAttribute('type','text/css');
Mystyle.innerHTML=' body{background-color: #2f54eb;}';
var a=document.getElementsByTagName('head')[0];
**注意:**这里取head的值时,后面要加个[0],因为他是唯一的,不可多定义。唯一的标签,建议使用getElementsTagName(‘body’)[0]
insertBefore–插入到节点的前面
<body>
<p id="pfa">javascriptp>
<div id="list">
<p id="p1">javasep>
<p id="p2">javaeep>
<p id="p3">javamep>
div>
<script type="text/javascript">
var list=document.getElementById('list');
var pfa=document.getElementById('pfa');
var p2=document.getElementById('p2');
list.insertBefore(pfa,p2);
script>
replaceChild()—替换当前节点
<body>
<p id="pfa">javascriptp>
<div id="list">
<p id="p1">javasep>
<p id="p2">javaeep>
<p id="p3">javamep>
div>
<script type="text/javascript">
var list=document.getElementById('list');
var pfa=document.getElementById('pfa');
var p2=document.getElementById('p2');
list.replaceChild(pfa,p2);
script>
注意:insertBefore()和replaceChild()取值是(新节点,旧节点)
先去jquery官网下载下来https://jquery.com/download/
这里有两种,一个是压缩好的,一个未压缩的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wcHgSNaO-1595224700471)(C:\Users\Nil\AppData\Roaming\Typora\typora-user-images\image-20200714120445392.png)]
该如何理解呢?
压缩好的主要是ui使用和上线会使用,未压缩的可看源码更加适用于开发
第二种方式使用CDN加速,这种相对来说速度更快
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js">script>
<script src="js/jquery-3.5.1.js" type="text/javascript">script>
两种方式没什么区别,都可使用
jquery公式(使用jquery开发,我们只要记住一个公式就好)
jquery写法与原生写法对比
<body>
<a href="" id="test-jquery">爸爸打我a>
<script type="text/javascript">
//原生写法
var a=document.getElementById('test-jquery');
//jquery写法
/*选择器就是html的选择器*/
$('#test-jquery').click(function () {
alert("heleo,jquery");
})
script>
5. **jquery选择器**
$('#p').click()//id选择器
$('.class1').click()//类选择器
$('p').click//标签选择器
等很多使用,可以访问https://jquery.cuishifeng.cn/index.html
先去jquery官网下载下来https://jquery.com/download/
这里有两种,一个是压缩好的,一个未压缩的
[外链图片转存中…(img-wcHgSNaO-1595224700471)]
该如何理解呢?
压缩好的主要是ui使用和上线会使用,未压缩的可看源码更加适用于开发
第二种方式使用CDN加速,这种相对来说速度更快
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js">script>
<script src="js/jquery-3.5.1.js" type="text/javascript">script>
两种方式没什么区别,都可使用
jquery公式(使用jquery开发,我们只要记住一个公式就好)
jquery写法与原生写法对比
<body>
<a href="" id="test-jquery">爸爸打我a>
<script type="text/javascript">
//原生写法
var a=document.getElementById('test-jquery');
//jquery写法
/*选择器就是html的选择器*/
$('#test-jquery').click(function () {
alert("heleo,jquery");
})
script>
5. **jquery选择器**
$('#p').click()//id选择器
$('.class1').click()//类选择器
$('p').click//标签选择器
等很多使用,可以访问https://jquery.cuishifeng.cn/index.html