##前言
前端基础的博客主要分为HTML(结构层)、CSS(表现层)和JavaScript(行为层),本类博客主要用于记录博主的学习过程和分享学习经验,由于博主学识浅薄,经验不足,难免会出现错误,欢迎大家提出问题。
注:前端基础的文章参考于b站up主遇见狂神说的前端视频,文章中的源码笔记等资源放在百度网盘了,有需要的小伙伴可以自取啊
链接:https://pan.baidu.com/s/1NWIs14JmAvD3UUqNX01CYg
提取码:13tr
祝大家都学有所成,下面我们进入正题!
##JavaScript基础学习总结
JavaScript的一些核心内容都在这张思维导图中了,接下来我们来具体的了解一下JavaScript!
-
JavaScript是一门世界上最流行的脚本语言
-
JavaScript 是属于 HTML 和 Web 的编程语言
-
ECMAScript可以理解为是JavaScript的一个标准
2.外部引入
(1)qjd.js
alert("hello,world");
(2)html
3.helloworld
Title
2.2、基本语法入门
Title
2.3、数据类型
数值,文本,图形,音频,视频
变量
var a=1; //不能以数字开头( var 5a=1;)
number
js不区分小数和整数
123 //整数 123.1 //浮点数 1.1e2 //科学技术法 -99 //负数 NaN //noy a number Infinity//表示无限大
字符串
‘abc’ “abc”
布尔值
true flase
逻辑运算
&& 两个都为真,结果为真
|| 一个为真,结果为真
! 真即假,假即真
比较运算符
= 赋值 == 等于(类型不一样,值一样,也会判断为true) === 绝对等于(类型一样,值一样,结果为true) (这里与java不一样)
注:
- NaN与所有的数值都不相等,包括自己(NaN===NaN,结果为false)
- 只能通过isNaN(NaN)来判断这个数是否是NaN
浮点数问题:
console.log( (1/3)===(1-2/3))
结果为false,我们要尽量避免用浮点数进行运算,存在精度问题
a=Math.abs(1/3-(1-2/3))<0.0000000001; console.log(a);
结果为true
null和undefined
- null是空的意思
- undefined是未定义
数组
Java数组中的数值必须是相同类型的对象,JS中不需要这样
//为了保证数组的可读性尽量使用[]的方式
var arr = [1,2,3,4,5,'hello',null,true];
new Array(1,2,3,4,5,'hello',null,true);
取数组下标如果越界就会undefined
对象
对象是大括号,数组是中括号
每个属性之间用逗号隔开,最后一个不需要添加
//Person person = new Person(1,2,3,4,5);
var person = {
name:"ikun",
age:3,
tages:['html','css','javascript']
}
在浏览器取对象的值
Title
3、数据类型
3.1、字符串
1.正常的字符串我们使用单引号,或者双引号包裹
2.注意转移字符
' n t u4e2d //u#### unicode字符 x41 //ASCLL字符
3.多行字符串编写
//esc键下边的那个键 var msg = ` hello world 你好 `
4.模板字符串
let name = "kunkun";
let age = 3;
let msg = `我是${name}`
5.字符串长度
console.log(name.length);
6.字符串的可变性
不可变
7.大小写转换
//注意,这里是方法,不是属性了
name.toUpperCase();
name.toLowerCase();
其他方法
| 方法 | 描述 |
|---|---|
| charAt() | 返回指定索引位置的字符 |
| charCodeAt() | 返回指定索引位置字符的 Unicode 值 |
| concat() | 连接两个或多个字符串,返回连接后的字符串 |
| fromCharCode() | 将 Unicode 转换为字符串 |
| indexOf() | 返回字符串中检索指定字符第一次出现的位置 |
| lastIndexOf() | 返回字符串中检索指定字符最后一次出现的位置 |
| localeCompare() | 用本地特定的顺序来比较两个字符串 |
| match() | 找到一个或多个正则表达式的匹配 |
| replace() | 替换与正则表达式匹配的子串 |
| search() | 检索与正则表达式相匹配的值 |
| slice() | 提取字符串的片断,并在新的字符串中返回被提取的部分 |
| split() | 把字符串分割为子字符串数组 |
| substr() | 从起始索引号提取字符串中指定数目的字符 |
| substring() | 提取字符串中两个指定的索引号之间的字符(包头不包尾) |
| toLocaleLowerCase() | 根据主机的语言环境把字符串转换为小写,只有几种语言(如土耳其语)具有地方特有的大小写映射 |
| toLocaleUpperCase() | 根据主机的语言环境把字符串转换为大写,只有几种语言(如土耳其语)具有地方特有的大小写映射 |
| toLowerCase() | 把字符串转换为小写 |
| toString() | 返回字符串对象值 |
| toUpperCase() | 把字符串转换为大写 |
| trim() | 移除字符串首尾空白 |
| valueOf() | 返回某个字符串对象的原始值 |
Array可以包含任意数据类型
var arr=[1,2,3,4,5]; //通过下标取值和赋值 arr[0] arr[3]=9
1.长度
arr.length;
注:加入给arr.length赋值,数组大小就会发生变化(过小元素丢失,过大加空)
2.indexOf,通过元素获得下标索引
arr.indexOf(3); 2
字符串的"1"和数字1是不同的
3.slice()
截取数组的一部分返回一个新数组
var arr=[1,2,3,4,5]; arr.slice(1,3) //类似于subString,包头不包尾 2,3
4.push pop
- push: 压入到尾部
- pop:尾部的一个元素弹出
5.unshift() shift()
- unshift(): 压入到头部
- shift(): 头部的一个元素弹出
6.排序sort()
7.元素反转reverse()
8.拼接concat()
注:contact()并没有修改数组,只是会返回一个新的数组
9.连接符 join
打印拼接数组,使用特定的字符串连接
10.多维数组
若干个键值对
//定义了一个person对象他有四个属性
var person = {
name : "qq",
age : 18,
emali : "cjsioevcmsp",
score : 60
}
js中的对象,{…}表示一个对象,键值对描述属性xxx:xxxx,多个属性之间用逗号隔开,最后一个不用逗号
js中所有的键都是字符串,值是任意对象
1.对象赋值
2.使用一个不存在的对象属性不会报错 undefined
3.动态的删减属性,通过delete删除对象的属性
4.动态的添加,直接给新的属性添加值
5.判断属性值是否在这个对象中(toString是继承的)
6.判断一个属性是否是自身所拥有的
3.4、流程控制if判断
let age = 5;
if(age>3){
alert("haha~");
}else{
alert("kuwa~")
}
循环,注意避免死循环
while
while (age<10){
age = age+1;
console.log(age);
}
for
for (let i = 0; i <10 ; i++) {
console.log(i);
}
数组遍历
var list = [1,2,43,4,,5,6,76,7];
list.forEach(function (value){
console.log(value);
})
3.5、Map和Set集合
- ES6的新特性
Map
'use strict';
//统计学生的成绩和学生的名字
// var names = ['tom','jack','rose'];
// var score = [100,99,88];
var map = new Map([['tom',100],['jack',99],['rose',88]]);
let tom = map.get('tom');//通过key获得value
map.set('rock',66);//添加新的键值对
map.delete("rock");//删除
console.log(tom)
Set:无序不重复的集合
//set 可以去重 var set = new Set([2,3,,4,45,5,6,3,2]); set.add(9); set.delete(2); console.log(set.has(3));//是否包含3.6、 iterator
使用iterator来遍历迭代我们的Map,Set
- ES6的新特性
遍历数组
'use strict';
var arr = [3,4,5];
// in 打印下标
for(var x in arr){
console.log(x);
}
// of 打印值
for(var x of arr){
console.log(x);
}
遍历map
var map = new Map([['tom',100],['jack',99],['rose',88]]);
for(let x of map){
console.log(x);
}
遍历set
var set = new Set([2,3,,4,45,5,6,3,2]);
for(let x of set){
console.log(x);
}
4、函数
方法:对象(属性,方法)
函数:
4.1、定义函数- 定义方式一
绝对值函数
function abs(x){
if(x<=0){
return -x;
}else{
return x;
}
}
一旦执行return代表函数结束,返回结果
如果没有执行return,函数执行完也会返回结果(undefined)
-
定义方式二
var abs = function (x){ if(x<=0){ return -x; }else{ return x; } }function (x){…}这是一个匿名函数,但是可以把结果赋值给abs,通过abs就可以调用函数
abs(10) //10 abs(-10) //10
js可以传递任意个参数,也可以不传递参数
假设不存在参数,如何规避?
var abs = function (x){
//手动抛出异常来判断
if(typeof x !== 'number'){
throw 'Not a Number';
}
if(x<=0){
return -x;
}else{
return x;
}
}
arguments是JS免费赠送的关键词,利用他我们可以得到所有的参数
代表所有传递进来的参数是一个数组
function abs(x){
console.log("x=>"+x);
for (let i = 0; i
console.log(arguments[i]);
}
if(x<=0){
return -x;
}else{
return x;
}
}
问题:
arguments会包含所有的参数,如何排除已有的参数?
rest
以前
function ac(a,b){
console.log("a=>"+a);
console.log("b=>"+b);
if(arguments.length>2){
for (let i = 2; i
现在
function ac(a,b,...rest){
console.log("a=>"+a);
console.log("b=>"+b);
console.log(rest);
}
rest参数只能写在最后面,必须用…标识
在js中,var定义变量实际是有作用域的
- 假设在函数体中声明,则在函数体外不能使用 (如果要想使用需要使用闭包)
function qjd(){
var x = 1;
x = x+1;
}
x = x+2;//Uncaught ReferenceError: x is not defined
- 如果两个函数使用了相同的变量名,只要造函数内部就不冲突
function qjd(){
var x = 1;
x = x+1;
}
function qjd2(){
var x = 1;
x = x+1;
}
-
函数嵌套使用的话,内部函数可以访问外部函数的成员,反之则不行
-
假设内部函数变量与外部函数变量重名
function qjd(){ var x = 1; function qjd2(){ var x = 2; console.log('inner'+x);//outer1 } console.log('outer'+x);//inner2 qjd2(); } qjd();
假设在js中函数查找变量从自身函数开始,由内向外查找,假设外部存在这个同名的函数变量,则内部函数会屏蔽外部函数的变量
-
所有的变量定义放在代码头部,便于理解与维护
-
全局函数
-
全局对象window
var x = 1; alert(x); //alert()这个函数本身也是一个window变量 alert(window.x); //默认所有的全局变量都会自动化绑定在window对象下
js实际上只有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域没有找到,就会报错
规范:降低全局命名冲突问题
//唯一全局变量
var Q = {};
//定义全局变量
Q.name = 'qjd';
Q.add = function (a,b){
return a+b;
}
- 局部作用域let(建议使用let去定义局部变量)
- 常量const
const PI = '3.14';4.4、方法
-
定义方法
方法就是把函数放在对象里面,对象里面只有两个东西:属性和方法
var qiao = { name : 'qid', birth : 2001, //方法 age:function () { let year = new Date().getFullYear(); return year - this.birth; } } //属性 qiao.name //方法,一定要带() qjd.age() -
拆开上边的代码
function getAge() { let year = new Date().getFullYear(); return year - this.birth; } var qiao = { name : 'qid', birth : 2001, age:getAge } // qiao.age() // 21 // getAge() // NaN window对象this是无法指向的,是默认指向调用他的那个函数
-
apply
在js中可以控制this指向
//this指向了qiao这个对象,参数为空 getAge().apply(qiao,[]); // getAge.apply(qiao,[]); // 21
标准对象:
typeof 123
'number'
typeof 'dgd'
'string'
typeof true
'boolean'
typeof NaN
'number'
typeof []
'object'
typeof {}
'object'
typeof Math.abs
'function'
5.1、Date
基本使用
var date = new Date();//Sat Jul 02 2022 20:34:01 GMT+0800 (GMT+08:00) date.getFullYear();//年 2022 date.getMonth();//月 注意这里0到11代表月份 date.getDate();//日 date.getDay()//星期几 date.getHours();//时 date.getMinutes();//分 date.getSeconds();//秒 //全世界统一时间从1970.1.1 0:00:00 开始算的毫秒数 date.getTime();//时间戳 1656765442368 //时间戳转为时间 console.log(new Date(1656765442368)) // VM261:1 Sat Jul 02 2022 20:37:22 GMT+0800 (GMT+08:00)
转换
date.toLocaleString() '2022/7/2 20:37:22' date.toGMTString() 'Sat, 02 Jul 2022 12:37:22 GMT' date.toDateString() 'Sat Jul 02 2022'5.2、JSON
JSON是什么?
- JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。
- 它基于 ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。
- 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
- 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
在js中一切皆为对象,任何js支持的类型都可以用JSON来表示:
- 对象都用{}
- 数组都用[]
- 所有的键值对都用key:value
JSON和JS对象的转化
例子
测试
console.log(user)
VM218:1 {name: 'qiao', age: 15, sex: '男'}age: 15name: "qiao"sex: "男"[[Prototype]]: Object
undefined
console.log(jsUser)
VM266:1 {"name":"qiao","age":15,"sex":"男"}
console.log(obj)
{name: 'qiao', age: 15, sex: '男'}
json与js对象的区别
var js = {a:'helloa', b:'hellob'}
var json = '{'a':'helloa','b':'hellob'}'
6、面向对象编程
6.1、什么是面向对象
js,java,c#…面向对象;js有一些区别
类:模板 原型对象 原型链
对象:具体的实例
JavaScript:
原型:
6.2、class继承
1.定义一个类,属性,方法
//es6之后的方法,重点记这个
//定义一个学生的类
class student{
constructor(name) {
this.name = name;
}
hello(){
alert('hello')
}
}
var xiaoming = new student("xiaoming");
var xiaoming3 = new student("xiaoming3");
xiaoming.hello()
2.继承
class student{
constructor(name) {
this.name = name;
}
hello(){
alert('hello')
}
}
class pupil extends student{
constructor(name,grade) {
super(name);
this.grade = grade;
}
myGrade(){
alert('pupil')
}
}
var xiaoming = new student("xiaoming");
var xiaoming3 = new pupil("xiaoming3",1);
本质:查看对象原型
- 原型链 :原型链:通过隐式原型把一些构造函数层层的串起来,因为所有的对象都是继承自Object。
原型链: https://www.cnblogs.com/liumcb/p/13667117.html
7.操作BOM对象(重点)浏览器介绍
JS和浏览器关系?
JS诞生就是为了让它能够在浏览器中运行
BOM:浏览器对象模型
内核:
- IE6~11
- Chrom
- Safari
- FireFox
第三方:
- QQ浏览器
- 360浏览器
- 搜狗浏览器
window
window代表浏览器窗口
window.innerHeight 722 window.innerWidth 555 window.outerHeight 824 window.outerWidth 1536 //可以调整浏览器窗口进行测试
Navigator
Navigator,封装了浏览器的信息
navigator.appName 'Netscape' navigator.appVersion '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36' navigator.userAgent 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36' navigator.platform 'Win32'
大多数时候,我们不会navigator对象,因为会被人为修改
screen
screen代表屏幕尺寸 screen.width 1536 screen.height 864
location
location代表当前页面的URL信息
doucument
doucument代表当前的页面,HTML,DOM文档树
document.title '百度一下,你就知道'
获取集体的文档树节点
- Java
- JavaSE
- JavaEE
获取cookie
document.cookie
劫持cookie原理
假设登录淘宝
服务器端可以设置cookie:httpOnly防止读取cookie信息
history
history代表浏览的历史记录
后退到上一个网页
history.back()
前进到下一个网页
history.forward()8、操作DOM对象(重点)
DOM:文档对象模型
DOM树形结构
核心
浏览器网页就是一个DOM树形结构
- 更新:更新DOM节点
- 遍历DOM节点:得到DOM节点
- 删除:删除一个DOM节点
- 添加:添加一个新的节点
要操作一个新的DOM节点,就必须要先获得这个DOM节点
获得DOM节点
Title
标题一
p1
p2
这是原生代码,之后尽量使用jQuery
更新节点
操作文本
- id1.innerText=‘123’ 修改文本的值
- id1.innerHTML=‘456’ 可以解析html标签
操作css
- id1.style.color = ‘red’ //属性用字符串包裹
- id1.style.fontSize = ‘50px’ // - 转 驼峰命名问题
- id1.style.padding = ‘2em’
删除节点
删除节点步骤:
- 先获取父节点
- 再通过父节点删除自己
Title
标题一
p1
p2
- 注意:删除多个节点的时候,children是时刻在变化的,删除的时候一定要注意
插入节点
我们获得了某个DOM节点,假设这个DOM节点是空的,我们通过innerHTML就可以增加一个元素了,但是如果这个DOM节点已经存在元素了,我们就不能这么做了,会产生覆盖
追加
JavaScript
JavaSE
JavaEE
JavaME
创建一个新的标签实现插入
//通过js创建一个新的节点 //HelloQJD
var newP = document.createElement('p');//创建一个p标签 newP.id = 'newP'; newP.innerText = 'HelloQJD'; list.appendChild(newP); //创建一个标签节点,通过这个属性可以设置任意的值 //


