自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

wayliu的博客

一起学IT

  • 博客(49)
  • 收藏
  • 关注

原创 13 排序算法——计数排序

1.计数排序步骤2.计数排序的基本实现1.计数排序步骤找出乱序数组中最大的元素,建立一个长度为最大元素+1的新数组。统计乱序数组中每个值出现的次数,依次放入新数组中遍历新数组,依次去除新数组中的元素2.计数排序的基本实现// 乱序数组const arr = [9,9,3,3,7,7,4,8,1,8,1,7,8,4,7,2,0,4];function countingSort (arr, max) { // 创建一个新数组,用来统计数组中每个元素出现的次数 let middle

2020-10-20 10:28:03 208

原创 12 排序算法——快速排序

1.快速排序步骤2.快速排序递归实现1.快速排序步骤快速排序是对冒泡排序的一种改进。在要排序的数组中找一个基准值。把小于基准值的数据集中到数组的左边(升序排列),把大于基准值的数据集中到数组的右边。递归实现左右数组,返回连接左、基准值、右数组。2.快速排序递归实现const arr = [8,0,4,6,1,2,7,3,5,9]function quickSort (arr) { // 如果数组的长度 <= 1,则不需要排序 if (arr.length <= 1

2020-10-20 10:27:42 436 1

原创 11 排序算法——插入排序

1.插入排序步骤2.直接插入排序1.插入排序步骤获得一个待排序的值 – 目标值;从后之前遍历此元素之前的元素,如果元素大于目标值,将元素后移一个单位;元素小于或等于目标值,将目标值放在此元素之后。2.直接插入排序// 待排序数组const arr = [8,0,4,6,1,2,7,3,5,9];// 直接插入排序function insertSort(arr) { // 传入的数组长度 const len = arr.length; // 由于数组的第一个元素不需要排序

2020-10-20 10:27:27 118 1

原创 10 排序算法——选择排序

1.选择排序思路2.选择排序基本实现1.选择排序思路在乱序数组中找到最小元素(升序),存放到起始位置。重复第一步,直到数组有序。2.选择排序基本实现

2020-10-20 10:27:11 356

原创 express博客项目01

1.目录2.安装[3.express 的入口代码 ]1.目录 - express 下载、安装和使用,express 中间件机制 - 开发接口,连接数据库,实现记录,日志记录 - 分析 express 中间件原理2.安装安装(使用脚手架 express-generator)初始化代码介绍,处理路由使用中间件npm install express-generator -g安装nodemon和cross-envnpm i nodemon cross-env -Spackage.

2020-10-19 08:35:59 128

原创 05——博客项目之安全 01

1.安全1.安全sql注入:窃取数据库内容xss攻击: 窃取前端的cookie 内容密码加密: 保障用户信息安全(重要)server 端攻击方式非常多,预防手段非常多sql 注入最原始、最简单的攻击,从有了web2.0 就有了sql注入攻击攻击方式:输入了一个sql片段,最终拼接成一段攻击代码预防措施: 使用 mysql 的 escape 函数处理输入内容即可slelct username, realname from users where username='zhangsan

2020-10-18 23:14:22 57

原创 04——博客项目之日志02

1.文件目录2.封装写入日志函数3.使用1.文件目录![在这里插入图片描述](https://img-blog.csdnimg.cn/20201017231606550.png#pic_center)2.封装写入日志函数src/utils/log.js const fs = require('fs')const path = require('path')// 写日志function writeLog(writeStream, log) { writeStream.write

2020-10-17 23:23:49 53

原创 04——博客项目之日志01

1. 日志2.nodejs文件操作1.日志系统没有日志,就等于人没有眼睛。第一,访问日志 access log(server 端最重要日志)第二,自定义日志(包括自定义事件,错误记录等。)2.nodejs文件操作

2020-10-17 17:05:25 112

原创 03——博客项目之登陆05

1.和前端联调[2.演示]1.和前端联调登陆功能依赖cookie,必须用浏览器来联调cookie 跨域不共享,前端和server端必须同域需要用到 nginx 做代理,让前后端同域前端文件目录:1.开启http服务安装 http服务,开启8001端口npm install http-server -ghttp-server -p 8001由于服务器端口是800端口,而我们的端口是8001,所以会404,况且cookie跨域也不共享。解决方案是用nginx进行联调。2.使用n

2020-10-16 23:44:08 62

原创 09 排序算法——冒泡排序

1.冒泡排序基本思路2.冒泡排序的优化13.冒泡排序的优化21.冒泡排序基本思路基本思路是对相邻记录值进行比较,如果符合条件,则将两者进行交换,最终达到有序变化。const arr = [9,0,4,6,1,2,7,3,5,8]function bubbling (arr) { for (let i = 0; i < arr.length; i++) { for (let j = 0; j < arr.length-1; j++) { if (arr[j+1]

2020-10-16 18:56:23 192

原创 08 二叉树和二叉查找树

1.树的定义2.二叉树和二叉查找树3.实现二叉查找树4.遍历二叉查找树5.在二叉查找树上进行查找6.从二叉查找树上删除节点1.树的定义2.二叉树和二叉查找树二叉树每个节点的子节点不超过两个。两个子节点分别称为左节点和右节点。二叉查找树确定子节点非常重要。二叉查找树是一种 特殊的二叉树,相对较小的值保存在左节点中,较大的值保存在右节点中。这一特性使得 查找的效率很高,对于数值型和非数值型的数据,比如单词和字符串,都是如此。3.实现二叉查找树节点class Node {

2020-10-16 14:31:08 144

原创 07集合(set)

1.集合概述2.集合类的实现3.集合的更多操作1.集合概述集合的成员是无序的集合的成员是唯一的集合实现基于数组es6中已经有了set集合2.集合类的实现function Set () { this.dataStore = [] this.add = add this.remove = remove this.show = show function add (data) { if (this.dataStore.indexOf(data) < 0

2020-10-15 19:49:37 69

原创 06 字典

1.字典概述2.Dictionary 类3.Dictionary 类的辅助方法1.字典概述一种以 键-值 对存在的数据结构,JavaScript的 Object 就是以字典形式设计的。可以用数组和对象实现,可以自定义Dictionary类实现。2.Dictionary类function Dictionary () { this.datastore = new Array() this.add = add this.find = find this.remove = remo

2020-10-15 16:51:30 68

原创 JavaScript 判断数据类型的四种方式

关于JavaScript类型typeofinstanceofconstructor()toString()基本类型:String、Number、Boolean、Symbol、Undefined、Null引用类型:Object除上面6中基本类型,就是引用类型了。Object是引用类型的总称,细分还可以分为Array、Number、String、Function、Boolean等。let b = new Boolean()type of b // "object"instanceof

2020-10-15 15:06:25 97

原创 05 链表

1.数组的缺点2.定义链表3.设计一个基于对象的链表4.双向链表5.循环链表1.数组的缺点其他语言数组的缺点JavaScript数组的缺点其他语言数组的缺点数组长度固定添加和删除元素需要将数组中的其他元素向前或向后平移,以反映数组刚刚进行了添加或删除操作。JavaScript中由于有splice()函数,不存在这些问题。JavaScript数组的缺点JavaScript的主要问题是被实现成了对象,与其他语言数组相比效率很低。除了数据的随机访问,链表几乎可以用在任何可以使

2020-10-15 13:27:16 114

原创 04 队列

1.对队列的操作2.一个用数组实现的队列3.使用队列:方块舞的舞伴分配问题1.对队列的操作队列是一种列表,不同的是只能在队尾插入元素,队首删除元素。(先进先出)入队 enqueue【即数组push()】出队 dequeue【即数组shift()】读取对头元素 peek()2.一个用数组实现的队列function Queue () { this.dataStore = [] this.enqueue = enqueue this.dequeue = dequeue thi

2020-10-14 16:37:03 144

原创 03 栈

1.对栈的操作2.栈的实现3.数制间相互转换4.回文5.使用栈模拟递归过程6.练习题1.对栈的操作栈是一种后入先出的数据结构。push()入栈pop()出栈peek()返回栈顶元素clear()清除栈内所有元素length 记录栈内元素个数2.栈的实现function Stack () { this.dataStore = [] this.top = 0 this.push = push this.pop = pop this.peek = peek

2020-10-14 13:22:27 92

原创 02 列表

1.列表的抽象数据类型定义2.实现列表类1.列表的抽象数据类型定义场景列表的抽象数据类型定义1.场景当不需要在一个很 长的序列中查找元素,或者对其进行排序时,列表显得尤为有用。反之,如果数据结构非 常复杂,列表的作用就没有那么大了。(如购物清单就是一个列表)2.列表的抽象数据类型定义列表是一组有序的数据,每个列表中的数据称为元素。在JavaScript中元素可以是任意数据类型,长度没有事先限定。2.实现列表类const { clear } = require("console

2020-10-14 09:40:29 43

原创 01 数组

1. JavaScript 中对数组的定义2. JavaScript 中对数组的创建3. 由字符串生成数组(split)4. 对数组的整体性操作(深浅拷贝)5.存取数组(查找元素)(indexof()、es6的 find()、findIndex())6.存取数组(数组的字符串表示)(join()、toString())7.存取数组(由已有数组创建新数组)(concat()、splice()、es6数组扩展运算)1. JavaScript 中对数组的定义标准定义:一个存储元素的线性集合(有序

2020-10-13 14:19:22 445

原创 js 数组遍历的几种方式

js数组,表示的是有序的数据集合,是一种特殊的对象,对象是无序的数据结合。for循环for infor eachfor ofes6中数组实例的keys().values()、entries()map、everyvery等函数1.for循环2.for in3.for each4.for of5.es6中数组实例的keys().values()、entries()1.for 循环for循环访问的是数组的下标。const arr = ['a','b','c','d',124]fo

2020-10-12 16:02:59 671

原创 03——博客项目之登陆04

1.nodejs 连接 redis 的 Demo2.nodejs 连接 redis–封装成工具1.nodejs 连接 redis 的 Demo目录:node-redisway liu@DESKTOP-NG9KB5L MINGW64 /e/work-vscode/node-redis$ npm i redis --saveindex.jsconst redis = require('redis')// 创建客户端const redisClient = redis.createClien

2020-10-11 23:48:35 68

原创 03——博客项目之登陆03

1.session设置问题2.redis 安装及使用1.session设置问题我们把session存在SESSION_DATA这一变量中。目前 session 直接是 js 变量,放在nodejs 进程内存中第一,进程内存有限,访问量过大,内存暴增怎么办?第二:正式上线运行是多进程,进程之间内存无法共享解决方案 redisweb server 最常用的缓存数据库,数据存放在内存中相比于 mysql,访问速度快(内存和硬盘不是一个数量级的)但是成本更高,可存储的数据量更小(

2020-10-11 22:08:36 51

原创 03——博客项目之登陆02

1.session2.session演示1.sessioncookie的问题:暴露username,很危险,同时cookie也小(5kb)如何解决:cookie中存储userid,server端对应 username解决方案:session,即server端存储用户信息2.session演示app.jsconst handleBlogRouter = require('./src/router/blog')const handleUserRouter = require('./sr

2020-10-11 21:29:07 54

原创 03——博客项目之登陆01

1.简介2.cookie介绍3.模拟服务器端修改cookie4.cookie做限制1.简介核心:登陆校验 & 登陆信息存储注册跟新建博客一样,而且现在一般都是手机验证码什么的了。目录cookie 和 sessionsession 写入 redis开发登陆功能,和前端联调(用到nginx反向代理)2.cookie什么是cookieJavaScript操作cookie,浏览器中查看cookieserver 端操作 cookie,实现登陆验证什么是cookie?

2020-10-11 18:08:45 86

原创 02——开发博客之数据存储04

API对接mysql(博客更新)controller/blog,jsconst updateBlog = (id, blogData = {}) => { const title = blogData.title const content = blogData.content const sql = ` update blog set title='${title}',content='${content}' where id=${id} `

2020-10-10 22:02:33 115

原创 11 Promise对象

1. Promise 的含义2.基本用法1.Promise的含义异步编程的解决方案,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。Promise 是一个对象,从它可以获取异步操作的消息Promise对象有以下两个特点:1.对象的状态不受外界影响。有三种状态: pending(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操作的结果可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。2.一旦状态改变,就不会再变,任何时候都可以得到

2020-10-10 19:10:32 166

原创 10 Class 的基本语法

1.简介1.简介类的由来生成实例对象的传统方法是通过构造函数。function Point(x, y) { this.x = x; this.y = y;}Point.prototype.toString = function () { return '(' + this.x + ', ' + this.y + ')';};var p = new Point(1, 2);ES6写法class Point { constructor(x, y) { this.

2020-10-10 16:02:22 152

原创 09 Set和 Map数据结构

1.Set2.Map1.Setes6提供了新的数据结构Set类似于数组,但是成员都是唯一的,没有重复的值1.基本用法2.Set 实例的属性和方法1.基本用法const s = new Set();[2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));console.log(s) // Set { 2, 3, 5, 4 }for (let i of s) { console.log(i) // 2 3 5 4}Set函数可以接受

2020-10-10 15:28:11 101

原创 08 对象的新增方法

1.Object.is()2.Object.assign()3.Object.getOwnPropertyDescriptors()4.__proto__属性,Object.setPrototypeOf(),Object.getPrototypeOf()5.Object.keys(),Object.values(),Object.entries()1.Object.is()作用:比较两个值是否严格相等,与严格比较运算符的行为基本一致。es5比较实现缺点== (相等运算符): 自动转换数据

2020-10-10 12:55:55 52

原创 02——开发博客之数据存储03

API对接mysql(博客详情)controller/blog.js// 博客详情处理逻辑const getDetail = (id) => { const sql = `select * from blog where id=${id}` return exec(sql).then(rows => { return rows[0] })}router/blog.js // 获取博客详情 if (method === 'GET' &a

2020-10-10 00:49:20 97

原创 02——开发博客之数据存储02(博客列表)

1.API对接mysql(博客列表)1.API对接mysql(博客列表)controller/blog.jsconst {exec} = require('../db/mysql')// 博客列表处理逻辑const getList = (author, keyword) => { let sql = `select * from blog where 1=1 ` if (author) { sql += `and author='${author}' ` }

2020-10-10 00:13:01 66

原创 02——开发博客之数据存储01

1.Node.js 操作 Mysql(Demo)2.在项目中实现Mysql 连接1.Node.js 操作 Mysql(Demo)示例:用demo 演示,不考虑使用封装: 将其封装为系统可用的工具使用: 让API直接操作数据库,不再使用假数据npm i mysqlindex.jsconst mysql = require('mysql')// 创建连接对象const con = mysql.createConnection({ host: 'localhost',

2020-10-09 22:46:08 92

原创 07 对象的扩展

1.属性的可枚举性和遍历1.属性的可枚举性和遍历可枚举性属性的遍历

2020-10-09 20:18:15 144

原创 06 数组的扩展

1. res 参数和扩展运算符2. Array.from()与Array()3.数组实例的 find() 和 findIndex()4.数组实例的 fill()5.数组实例的 entries() keys() values()6.数组实例的 includes()1.res 参数和扩展运算符rest参数的形式为:…变量名;扩展运算符是三个点(…数组)rest参数扩展运算符1.res 参数rest参数用于获取函数的多余参数,这样就不需要使用arguments对象了。rest参数搭配的变

2020-10-09 17:40:54 259

原创 05函数的扩展

1.函数参数的默认值2.res 参数3.name 属性4.箭头函数1.函数参数的默认值function log(x, y = 'world') { console.log(x,y)}log('Hello') // Hello world2.res 参数ES6 引入 rest 参数(形式为...变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了。rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中。function add (...values)

2020-10-09 15:36:54 44

原创 04 字符串的新增方法

1.String.fromCodePoint()2.String.raw()3.String.codePointAt()4.实例方法:includes(),startsWith(),endsWidth()5.实例方法:repeat()6.实例方法:padStart()、padEnd()7.实例方法:trimStart()、trimEnd()1.String.fromCodePoint()String.fromCodePoint(0x20BB7)// "????"用于从 Unicode

2020-10-09 15:03:51 60

原创 03字符串的扩展

1.字符的 Unicode 表示法2.字符串的遍历器接口3.直接输入 U+2028和 U+20294.模板字符串1.字符的 Unicode 表示法ES6 加强了对 Unicode 的支持,允许采用\uxxxx形式表示一个字符,其中xxxx表示字符的 Unicode 码点。console.log("\u0061") // a2.字符串的遍历器接口for (let codePoint of 'foo') { console.log(codePoint) // f o o}3.直接输入

2020-10-09 14:02:16 55

原创 02 变量的解构赋值

1. 数组的解构赋值2.对象的解构赋值3.字符串的解构赋值4.数值和布尔值的解构赋值5. 函数的解构赋值1. 数组的解构赋值基本用法默认值1. 基本用法let [a,b,c] = [1,2,3] console.log(a) //1let [foo, [[bar], baz]] = [1, [[2], 3]];foo // 1bar // 2baz // 3let [ , , third] = ["foo", "bar", "baz"];third // "baz"

2020-10-09 13:35:55 91

原创 01 let 和 const 命令

1.let 命令2.块级作用域3.const 命令4.顶层对象的属性1.let 命令基本用法不存在变量提升暂时性死区1.基本用法{ let a = 10; var b = 1;}console.log(b)console.log(a) //ReferenceError: a is not definedvar a = []for (let i = 0; i< 10; i++) { a[i] = function () { console.log(i

2020-10-09 12:44:32 154

原创 01——开发博客项目之接口06

1.更新博客接口2.删除博客接口3.登陆接口1.更新博客接口router/blog.js // 更新一篇博客 if (method === 'POST' && req.path ==='/api/blog/update') { const result = updateBlog(id, req.body) if (result) { return new SuccessModel() } else {

2020-10-09 01:02:40 105

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除