布鲁斯前端学习笔记
文章目录
笔记
这里是主要的笔记内容
环境安装+基本变数
-
VScode 安装Live server
-
新建一个x.js、x.html文档
-
在html文档里引入js文档(输入!自动生成)
-
在中
-
ctrl+shift+p
-
点击右下角 Go Live——即时更新在档案上的程序语言
- 比如:在body下输入一个p标签:
hello 赫林丁
- 对该网页右键检查
-
进入js文档
输入 console.log(100)
会显示一条讯息
基本变数
let ——宣告一个容器 (也就是赋值)
容器的名字——驼峰式命名:myName
-
五个基本变数
-
字串连接&数字加减乘除
let myName = '赫林丁' //string 字串 //备注功能
let age2 = '我的年龄:20岁'
let word = myName + age2 //+连接字符串
console.log(myName)
console.log(word)
let age = 20 //整数、小数都是数字
console.log(age)
// + - * / %(取余数)
console.log(age + 1)
let isFake = false //布林值 true or false
console.log(isFake)
let bag = undefined //空值
console.log(bag)
let bag2 = null //null 跟 undefined 都表示空值但不相同 ,挑一个用就行,以后再了解原理
console.log(bag2)
//以上是五个基本变数
// 除了 let 还可以用 var const宣告变数
// let几乎可以取代var 一般不用var
let a1 = 'aaa'
console.log(a1)
//修改a1的内容
a1 = 'bbb'
console.log(a1)
//由上到下执行,两个a1不一样,无法改变
//const最主要的用途,不能改变变数的值
// const a1 = 'aaa'
// console.log(a1)
// //修改a1的内容
// a1 = 'bbb'
// console.log(a1) //会报错
陈列与物件
记得在html文件里换成想要引入的js文件
点击on live后在网页里点击html文件才能生成一个Document
let classA = ['A','B','C'] //生成阵列
console.log('转学前:',classA)
classA.push('D') //新增一个人
console.log('转学后:',classA)
//取得阵列的长度
console.log(classA.length)
//用于回圈计数器
let igPhotos = [
'http://xx.img.com/a1.png',
'http://xx.img.com/a2.png',
'http://xx.img.com/a3.png'
]
//索引
console.log('第一张',igPhotos[0])
console.log('第二张',igPhotos[1])
console.log('第三张',igPhotos[2])
//物件 Object
const card = {
name:'a',
address:'b',
age = 999
}
console.log('名字',card.name) //物件的索引 '.'表示“的”
const post = {
image:'https://xx.img.com/a1.png',
desc:'这是一张图片',
date:'2021/10/05',
Comment: ['a','b']
}
const wall = [
post,
post2
]
console.log('wall',wall)//用阵列+物件组合排列出你想展示的内容
流程控制 if else \ switch case
//流程扩展 if else,switch case
// if (/* 条件 */) {
// //当条件成立要做的事情
// } else {
// // 当条件没有成立要做的事情
// }
if (100>50) {
console.log('确实大于50')
} else {
console.log('错误')
}
//(/* 条件 */) 帮我们转化成一个布林值
let condition = 100<50 // 100<50 && 100==50 、 100<50 || 100 == 50 、!100<50
console.log('condition',condition)
if (condition) {
console.log('条件成立')
} else {
console.log('条件不成立')
}
// + - * / 算数运算子
// && || ! 逻辑运算子 and or 反
//用()改变运算顺序
let score = 60
//连接if else
if (score >= 90) {
console.log('优秀')//第一个条件成立做这里的事情
} else if (score >= 80) {
console.log('良好')//第二个条件成立做这里的事情
} else if (score >= 60) {
console.log('及格')//第三个条件成立做这里的事情
} else {
console.log('不及格')
}
let key = 300
switch (key) {
case 100:
console.log('考了100分')
break;
case 200:
console.log('考了200分')
break;
case 300:
console.log('考了300分')
break;
default:
console.log('没去考试')
break;
}
回圈控制 for \ while
for 回圈
// i++ => i=i+1
for(let i = 0; i<10; i=i+1){ //用;隔开
console.log('i:',i)
}
let classA = [100,70,59]
console.log(classA[0])
console.log(classA[1])
console.log(classA[2])
//等价于(自动化)
for (let i = 0; i < 3; i++) { //当push一个新值时,把3改成classA.lenth,就不会有限制
console.log('i:',classA[i])
}
//用for 修改陈列里的值
for (let i = 0; i < classA.length; i++) {
if (i==2) {
classA[i] = 999
}
}
console.log('classA',classA)
// [物件1,物件2,······]
const posts = [
{
name:'赫林丁1',
desc:'贴文1'
},
{
name:'赫林丁2',
desc:'贴文2'
}
]
//用for可以index到物件的某一个位置把贴文抓出来
for (let i = 0; i < posts.length; i++) {
if (i==1) {
let post = posts[i]
console.log(post)
}
}
while 回圈
//当condition为true时永远会执行
condition = true
let target = 10
let i = 0
while (condition) {
if (i == target) {
condition = false
}
console.log(i)
i++
}
//单纯计数用for回圈就行了
函数Function是什么
//宣告
function hello() {
console.log('你好')
}
//执行
hello()
//有参数、有回传值(return)的function
function addMoney(price1,price2,discount) {
let result = price1 +price2 -discount
let message = '普通会员'
if (result>20000) {
message = '白金会员' //这里的message跟外面不会有冲突
}
if (result>50000) {
message = '尊荣会员'
}
return message
}
let total = addMoney(50000,50000,1000)
console.log('total',total)
//注意!!
function addMoney2(price1,price2,discount) {
let result = price1 +price2 -discount
let message = '普通会员'
if (result>20000) {
message = '白金会员' //这里的message跟外面不会有冲突
return message
}
if (result>50000) {
message = '尊荣会员'
return message
}
return message
}
let total2 = addMoney2(50000,50000,1000)
console.log('total2',total2)
//如果白金会员在尊荣会员的下面,最后还会被改到白金会员,所以判断完就执行return
function addMoney4(price1,price2,discount) {
let result = price1 +price2 -discount
let message = '普通会员'
if (result>50000) {
message = '尊荣会员'
return message
}
if (result>20000) {
message = '白金会员' //这里的message跟外面不会有冲突
return message
}
return message
}
let total4 = addMoney4(50000,50000,1000)
console.log('total4',total4)
//用if else连接也可以解决这个问题
function addMoney3(price1,price2,discount) {
let result = price1 +price2 -discount
let message = '普通会员'
if (result>50000) {
message = '尊荣会员'
} else if (result>20000) {
message = '白金会员' //这里的message跟外面不会有冲突
}
return message
}
let total3 = addMoney3(50000,50000,1000)
console.log('total3',total3)
//构造函数 function
//this表示:当下谁执行这个函数它就是谁
function createCard(initName) {
this.cardName = initName
}
//new 建立or构造 构造一个新物件(进阶内容)······
const a1 = new createCard('小明')
console.log(a1)
//等价写法
function f() {}
//用宣告变数的方式宣告一个函数,功能基本一样但底层原理不一样,下面这种会报错(进阶内容,跟this有关)······
let f = function () {}
//简写方式
let f = () => {}
类别Class是什么
this:当下执行函数的人是谁,这个人就是这个函数的this
//class 的基本操作
// class Card {
// constructor(initName) {
// this.name = initName
// }
// }
// const c1 = new Card("赫林丁")
// console.log('c1:',c1)
// console.log(c1.name)
//this
class Card {
constructor(initName) {
this.name = initName
//把this绑定在Card上面
this.helloooo = this.hello.bind(this)
}
hello () {
console.log('hello',this.name)
}
}
const c1 = new Card("赫林丁")
console.log('c1:',c1)
console.log(c1.name)
c1.hello()
const a = {name:'AA'}
a.helloooo = c1.hello
console.log(a.helloooo())
const b = {name:'BB'}
b.helloooo = c1.helloooo
b.helloooo()
// function Card(params) {
// }
// Card.prototype.hello = function (params) {
// }
//第二种绑定this的方法,hello用箭头函数
class Card2 {
constructor(initName) {
this.name = initName
}
hello = () => {
console.log("hello",this.name)
}
}
const c2 = new Card2('赫林丁')
console.log('c2',c2)
c2.hello
const a2 = {name:'AA'} //虽然name是AA 但还是被绑定在c2的name上
a2.helloooo = c2.hello
a2.helloooo()
//继承 extends
class Car {
constructor(initName) {
this.name = initName
}
start() {
console.log('车子启动')
}
}
class Porshe extends Car {
constructor(namePoshe) {
super(namePoshe)
}
start2() {
super.start()
console.log('车子排气')
}
// start覆盖 (子层可以盖过父层)
start() {
console.log('Porshe车子启动')
super.start() //拉取父层的start
}
}
const p1 = new Porshe('赫林丁的特斯拉')
p1.start2()
p1.start()
console.log('name',p1.name)
HTML DOM操作
程序由上往下执行,script要写在p标签后面(写在最下面),否则直接抓是抓不到的(p标签还没有被渲染出来文档就加载完了)
推荐学习网站:w3school.com
如:直接搜索 click w3 ——get写click事件有什么样的方法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<p id='title'>赫林丁前端学习之旅</p>
<button id='btn'>按我</button>
<div id='box'>box</div>
<script src="./learn7.js"></script>
</body>
</html>
//设置一个监听器
//回呼 callback ——网页执行入口 load完后执行function
window.addEventListener('load',function () { //load 监听加载完成这一事件
const p1 = document.getElementById('title')
console.log(p1)
p1.innerText = '订阅' //抓到p标签后可以做很多事情
//在html新增一个button,想要给点反应该怎么办
//先抓下来
const b1 = document.getElementById('btn')
b1.addEventListener('click',function () { //click监听按下去这一事件
console.log('点下去') //当我点下去后这个function就被执行了
})
const box1 = document.getElementById('box')
//改变box里html的结构
box1.innerHTML = '<p>Test</p>'
})
改变了box内部的结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6u0Tob0q-1633426403634)(https://secure.wostatic.cn/static/wHNqMcV7mpiasFNbYAPj6P/image.png)]
监听使用者的输入
<input id='input1' type="text">
const in1 = document.getElementById('input1')
in1.addEventListener('keyup',function (e) { //keyup表示键盘按下去弹起来
console.log('e.target.value',e.target.value) //.target.value可以取得物件里面的内容(监听使用者输入的文字)
})
备忘录小APP
const content = document.getElementById('content')
const date = document.getElementById('date')
const time = document.getElementById('time')
const addedBtn = document.getElementById('addedBtn')
const deletedBtn = document.getElementById('deletedBtn')
const list = document.getElementById('list')
//add
//用一个物件把所有content括起来
const listContent = []
//unshift&shift比push&pop更合理
addedBtn.addEventListener('click',function () {
console.log(content.value)
console.log(date.value)
console.log(time.value)
listContent.unshift({ //unshift从前面推东西进去,push从后面推
content:content.value,
date:date.value,
time:time.value
})
//渲染页面的list
let htmlStr = ''
//forEach:Performs the specified action for each element in an array.
listContent.forEach(function (item) {
// console.log('item',item)
//单引号没办法换行,用模板语法`` 来写字串 还可以直接把变数插入字串
htmlStr = htmlStr + `
<div class="item">
<div>
<p>内容:${item.content}</p>
<p>时间:${item.date} ${item.time}</p>
</div>
</div>
`
})
// console.log(htmlStr)
list.innerHTML = htmlStr
})
//delete
deletedBtn.addEventListener('click',function () {
listContent.shift() //shift与unshift相反 删除第一个,pop与push相反 删除最后一个
//渲染页面的list
let htmlStr = ''
//forEach:Performs the specified action for each element in an array.
listContent.forEach(function (item) {
// console.log('item',item)
//单引号没办法换行,用模板语法`` 来写字串 还可以直接把变数插入字串
htmlStr = htmlStr + `
<div class="item">
<div>
<p>内容:${item.content}</p>
<p>时间:${item.date} ${item.time}</p>
</div>
</div>
`
})
// console.log(htmlStr)
list.innerHTML = htmlStr
})
用function后
const content = document.getElementById('content')
const date = document.getElementById('date')
const time = document.getElementById('time')
const addedBtn = document.getElementById('addedBtn')
const deletedBtn = document.getElementById('deletedBtn')
const list = document.getElementById('list')
//add
//用一个物件把所有content括起来
const listContent = []
//add\delete 复制一次物件增添删减的功能有点笨
//可以用function 定义渲染的逻辑 使得代码更简洁
function render() {
//渲染页面的list
let htmlStr = ''
//forEach:Performs the specified action for each element in an array.
listContent.forEach(function (item) {
// console.log('item',item)
//单引号没办法换行,用模板语法`` 来写字串 还可以直接把变数插入字串
htmlStr = htmlStr + `
<div class="item">
<div>
<p>内容:${item.content}</p>
<p>时间:${item.date} ${item.time}</p>
</div>
</div>
`
})
// console.log(htmlStr)
list.innerHTML = htmlStr
}
//unshift&shift比push&pop更合理
addedBtn.addEventListener('click',function () {
console.log(content.value)
console.log(date.value)
console.log(time.value)
listContent.unshift({ //unshift从前面推东西进去,push从后面推
content:content.value,
date:date.value,
time:time.value
})
render()
})
//delete
deletedBtn.addEventListener('click',function () {
listContent.shift() //shift与unshift相反 删除第一个,pop与push相反 删除最后一个
render()
})
用class对函数进行包装
//还可以用class
class RenderFeature{
append() {
}
render() {
//渲染页面的list
let htmlStr = ''
//forEach:Performs the specified action for each element in an array.
listContent.forEach(function (item) {
// console.log('item',item)
//单引号没办法换行,用模板语法`` 来写字串 还可以直接把变数插入字串
htmlStr = htmlStr + `
<div class="item">
<div>
<p>内容:${item.content}</p>
<p>时间:${item.date} ${item.time}</p>
</div>
</div>
`
})
// console.log(htmlStr)
list.innerHTML = htmlStr
}
}
r1 = new RenderFeature()
//unshift&shift比push&pop更合理
addedBtn.addEventListener('click',function () {
console.log(content.value)
console.log(date.value)
console.log(time.value)
listContent.unshift({ //unshift从前面推东西进去,push从后面推
content:content.value,
date:date.value,
time:time.value
})
r1.render()
})
//delete
deletedBtn.addEventListener('click',function () {
listContent.shift() //shift与unshift相反 删除第一个,pop与push相反 删除最后一个
r1.render()
})
进阶学习
-
Fetch API——怎样跟后端沟通
-
Promise、Async、Await、JS的非同步
-
JS的this
-
原型链
-
ES6阵列操作
-
import export JS的模组化概念
-
等等