ES6
let:
说明:访问不了num,但能访问abc.
说明:let霸占了整个if的{},所以外面的num都无效。外面的let对里面的域有效,子域中的let对外面的作用域没影响,外面用不到里面的let。
面试题:
说明:for执行结束后,没有执行function,到了该调用function的时候,进去找i,此时i=2,所以结果是2,2
说明:由于let,for产生了2个块级作用域,每个作用域中的变量值不同并保存在对应的块级作用域。执行函数时,到对应的域里面取。分别输出0,1
const:
说明:复杂数据类型不可直接赋值,因为这样会改变地址,但是可以更改内部的数据。
总结:
数组赋值:
说明:[a,b,c]不是数组,只是把它们集中赋值。
对象解构:从对象的属性中提取值,赋给新变量:
说明:name用于去匹配person当中的name属性,找到后将值赋给myName变量。
箭头函数,右边的{}是要定义的函数体,箭头函数中的this是箭头函数所在的作用域中的this:
面试题:
说明:obj没有产生作用域,所以箭头函数定义在了全局作用域下,而全局作用域下的this是window,而window没有age属性,则是undefined
剩余参数,注意箭头函数没有arguments参数,此时args收集参数形成数组:
扩展运算符:
数组合并:
Array.from()可以将伪数组转换为真正的数组,还能接受第二个函数参数用于处理伪数组中的每个元素:
find:find参数函数中的item代表数组每个元素,index为对应的索引,find是看每个元素最后的处理结果如果是true,则收集起来再返回。也是找出第一个符合条件的。:
findIndex(),查找数组中第一个满足条件的元素的索引:
includes()查看数组当中是否包含某个值:
模板字符串,使用反引号`定义,``内若要解析变量,则放到${}中,还可以换行,可以调用函数:
startsWith判断字符串是否以另一个字符串开头,endsWith是否结尾:
repeat将某个字符串重复n次:
set,类似于数组,只是过滤了重复的元素,使得最后每个元素都是唯一的,利用此可以构造新的元素唯一的树组:
node.js:
是一个js运行环境,chrome也是运行环境
安装:
卸载更新:
删除以下:
再下载新的nodejs .
使用nvm可以管理一台电脑上的多个版本的nodejs
vscode:复制的时候只用点1下就能Ctrl+c了。
nodejs版本:
查看node安装:node -v
命令行运行步骤:先去当前的目录下找thunder可执行文件,如果找不到,就去PATH所指向的目录里面找。
.代表当前目录,require中的路径是相对于当前文件的路径,A的变量或函数要给别的文件用,就得在A里面用exports。B文件通过require就可以拿到A文件中exports里面的变量和函数,同时导入js文件时后缀可以省略.exports是一个对象,require之后相当于把exports对象返回了:
import,export,exports,module.exports,require之间的区别和关联
a.js导出:
var age=22
module.exports.age=age // exports.age = age,此时exports就代表module.exports,它只能给属性赋值:exports.aa=...,不能直接赋值:exports = aa,但是module.exports可以直接赋值
export const a =123; // 等价于 export {a,函数名,.....}
b.js导入:
const obj = require('./a.js') // 相当于把a.js中的module.exports导入赋给obj。
import obj from './a.js' // 效果类似上面,不加{}就是把a.js的module.exports拿过来,但是要在服务器开启时才管用
import {a} from './a.js' // 此处要和export导出的变量名一致
module.exports,当给对象的属性赋值时,exports等价于module.exports。而如果给exports对象赋了对象,则其他文件以module.exports为准
系统模块的fs模块,readFile,第一个参数是相对于控制台的路径,第二个参数是编码,第三个是回调函数,当读完了会执行它:
写入文件writeFile,第一个参数是向哪里写,第三个参数是回调函数:
系统模块path,路径拼接join,能根据操作系统拼接多个字符串生成路径:
__dirname能够获得当前工作目录的绝对路径:
下载第三方模块(类似于插件),会下载到当前的cmd目录下,创建node_modules,并放进去。本地安装:将模块安装供本项目使用,全局安装:供所有项目使用。
查看帮助文档https://www.npmjs.com/package
卸载第三方:
nodemon下载,-g是全局安装:
输入一个命令,此时每次修改并保存文件...js,那么就会在控制台自动执行它,终止操作是Ctrl+c:
nrm切换npm的下载地址,nrm ls是查看当前可用的下载地址,前面的*是正在使用的下载地址:
gulp:
安装gulp
使用gulp:
任务1:将一个文件复制到另一个文件:新建一个文件夹作为项目的根目录,再在这个目录下新建gulpFile.js,新建src文件夹存放项目源代码,新建dist文件夹存储处理后的文件:
在gulpfile.js中建立任务,task第一个参数是任务名,第二个参数回调函数是任务的具体内容:
dest只是文件夹的名字,系统会在dist/css文件夹下创建base.css完全同名的文件
安装操纵任务的命令行工具,要安装它才能用gulp命令:
执行任务:
第二个任务,将A,B文件公布部分抽取出来,并引用,再压缩(比如将多行代码放到一行)起来:
为了压缩,下载gulp-htmlmin插件:
在gulpFile.js中引入插件:
查看另一个插件的官方文档:
为了使得@@include生效,下载该插件用于抽取:
引入插件:
在src目录下新建common文件夹,再在里面新建一个header.html,将A,B文件当中的相同的代码剪切到head.html里面,然后在A,B文件当中的原来位置将之前剪切走的代码引入回来,此时只需一条include命令:
fileinclude表示将A和B中的include命令生效,htmlmin表示压缩它们,最后一行表示压缩到dist目录下,如果没有htmlmin,则只替换include并放到对应文件夹下:
说明:collapseWhitespace表示是否压缩空格
执行任务,之后在dist目录下产生结果:
任务3:解析less文件为css文件,并将所有的css文件放到dist目录下:
在src的css目录下新建less文件:
下载并引入插件,这个插件用于转换less到css:
这个用于压缩css代码:
编辑任务:
执行任务:
任务4:ES6代码转换并压缩
下载并引用插件,babel后面的2个是它所依赖的模块,并列写上可以同时下载:
测试编写一个es文件:
编辑任务:babel那行是将es6装换为当前所支持代码,如es5,uglify是将其进行压缩,最后一行是目标位置。
执行任务:
任务5:复制文件夹:
关键代码:
创建构建任务,让上面的任务一起执行,后面的数组元素是要执行的任务名字,然后执行:
由于default是特殊的名字,所以可以省略不写,等价于:
package.json文件是项目的描述文件,在项目的根目录(假定为description)下输入命令生成json文件。npm install mime会在powershell当前目录下,创建node_modules,并把mime放到里面,同时也会更新当前目录的json文件中的dependencies。
创建package.json文件:
解释package.json文件:
第一行是项目名字,第二行是版本号,第三行是描述信息,第四行是项目的主入口文件,第五行是命令别名,第六行是项目关键字,第八行是项目遵循的协议,ISC是开放源代码协议
json的devDependencies:记录开发依赖,dependencies记录运营依赖,npm install是根据json安装开发依赖(所有依赖),npm install --production是根据json安装运营依赖
npm install mime是安装运营依赖,npm install mime --save-dev是安装开发依赖
利用npm随便下载插件,此时json文件会自动写入依赖信息:
此时把package.json文件拷贝给另一个人,让他输入命令就能自动安装项目所需的node_modules。
开发依赖:只有在开发中才需要,如gulp,运营依赖就不需要开发依赖了,开发依赖要大。
下载gulp,令其为开发依赖:
此时在json中就有了记录:
删掉node_modules文件夹,模拟在开发环境中下载,此时会根据json下载全部插件:
删掉,再模拟在运营环境中下载,此时只看dependencies而不看devDependencies:
在使用npm时会更新package.json文件,它记录了项目模块之间的依赖关系,锁定包的版本
json的script可以设置,此时build就是后面那句话的别名:
他俩等价:
没有后缀时,模块查找方法:
require('./find')先找当前目录下的find.js,找不到再找find文件夹下的index.js,再查看find文件夹下的package.js中的"main"值是什么,假如是aaa,则在find文件夹下找aaa,如果都没有则找不到。
举例,此时引用并执行了:
没有路径和后缀时的查找:
说明:1中,如果是系统模块则执行它。3中找的是node_modules下的js文件,4中找的是node_modules的find文件夹中的js
自测环境:
创建web服务器:
说明:这里的app变量名就是服务器
说明:req即request,代表客户端,res即response。
执行命令启动服务器:
浏览器访问:
http协议规定了客户端和服务器如何通信
查看请求与相应报文,request Headers,response Headers:
查看请求方式:
说明:请求网址时默认get请求,第二个get是浏览器请求图标
说明:如果不写method默认为get请求。第二个get时请求图标所用的。
根据请求方式做不同事情:
服务器获取url:
获取请求报文,报文中的属性:
响应报文的HTTP状态码及设置:
响应报文的内容类型及设置,res.writeHead:
说明:指定内容类型为html之后就能显示h2了,也指定了编码类型,这样就能解析中文了。
利用url对象的parse方法将url的各个参数进行解析:
进一步将query解析:
获得query对象和pathname,进一步判断:
处理post参数,data事件绑定到req上,可能会触发很多次data事件,此时自定义的param就接受每次的参数,postParams把所有参数都拼接起来。querystring.parse可以解析asd=as&asdasd这样的字符串成对象:
总结:
get的参数是在url中的,通过url.parse解析url得到包含参数的query对象。
post的参数是放在请求报文当中的,通过给res绑定data事件,用querystring.parse解析得到包含参数的对象,注意由于异步,处理参数得写到回调函数里面。
返回客户端所请求的静态资源:
建立一个专门的文件夹存放静态资源,比如图片,css等,再在static目录下建立app.js文件:
app.js:
下载mime插件用于查看客户端想要请求什么类型的页面:
API:
说明:用return拿不到结果。
利用回调函数拿到结果:
利用 promise得到异步API的执行结果:这里将fs的结果放到promise的resolve中,然后就能在外面对result进行处理。其实是resolve(result)调用了外面的函数:
该下参数使得找不到文件,就打印err:
利用promise依次读取A,B,C文件:
异步函数终极解决方案:
说明:r1,r2,r3为A,B,C文件的内容
const fs = require('fs'); const promisify = require('util').promisify; const readFile = promisify(fs.readFile); async function go () { console.log('a'); let a = await readFile('./public/a.txt', 'utf8'); let b = await readFile('./public/b.txt', 'utf8'); let c = await readFile('./public/c.txt', 'utf8'); console.log('b'); console.log(a); console.log(b); console.log(c); } go(); console.log('c');
控制台输出:a c b a文件内容 b文件内容 c文件内容
全局对象global: