笔记目录
前言
本章的学习内容:es6 声明关键字let const,解构赋值,扩展运算符,对象简化赋值,Set对象,箭头函数,Node.js的内置模块(fs,path)
1. var let const声明关键字
var :es6之前只有全局作用域和函数作用域,var声明的变量是全局变量,直接挂载在window全局,而且存在变量提升,但是不会提升变量的初始化和赋值,相对来说逻辑不是很严谨。
let :块级局部变量,let 禁止重复声明变量(let不允许在同一作用域重复声明变量),不存在变量提升,let有循环作用域的概念。
const: let 的规则基本适用于 const,不存在变量提升,不允许重复声明,有块级作用域。而且const声明一个常量,不允许被修改,声明时必须初始化。(常量的栈地址不能被修改,但是如果是一个对象或者函数,里面的属性和元素是可以修改的)
2. 解构赋值
对象结构赋值
声明的常量的名字,必须要和对象的属性的名字一致
//声明了两个常量 name age
//将p1对象中的同名属性的值赋值给前面声明的常量
const {name, age} = p1;
console.log(name, age);
//声明的常量的名字,必须要和对象的属性的名字一致.
数组解构赋值
将数组arr中元素的值,按照顺序赋值给前面的常量
const arr = [10, 20, 30, 40];
//声明4个常量 a1 a2 a3 a4
//将数组arr中元素的值,按照顺序赋值给前面的常量.
//const [a1, a2, a3, a4] = arr;
//const [a100, a90, a80, a1] = arr;
const [a1, , a2] = arr;
console.log(a1, a2);
函数参数解构赋值
//表示: 函数的参数是1个对象.
// 这个对象包含的属性写在里面
// 函数内部直接使用,不需要点.
function demo( {name,age,weight} ){
console.log(name);
console.log(age);
console.log(weight);
}
//好处:
//调用这个函数的人,只要看到了这个函数的函数头,
//就可以知道传入的=对象 应该包含哪些属性.
demo({
name: 'jack',
age: 19,
weight: 79
});
3. 扩展运算符
对象的扩展运算符
// const p1 ={
// name: 'jack',
// age: 19
// }
// const p2 = {
// gender: '男',
// ...p1 //扩展p1对象: 将p1对象扩展开来,将p1对象中的所有的属性拿出来放在p2对象中.
// }
const p1 ={
name: 'jack',
age: 19,
weight: 75
}
const p2 = {
...p1,
gender: '男',
weight: 50
//...p1 //扩展p1对象: 将p1对象扩展开来,将p1对象中的所有的属性拿出来放在p2对象中.
}
//如果存在同名属性,后面的属性会覆盖前面的属性.
console.log(p2);
数组的扩展运算符
//const arr1 = [10,20, 30];
// const arr2 = [40, 50, ...arr1]; //将arr1数组中的所有的元素扩展开来,放在arr2数组中
// console.log(arr2);
const arr1 = [10, 20, 30];
const arr2 = [40, 50, 60];
const arr3 = [...arr1, ...arr2];
console.log(arr3);
4. 对象简化赋值
如果对象的属性的名字和值,与之前声明的变量的名字和值一致.,可以只写一个。
const name = 'jack';
const age = 19;
// const p1 = {
// name: name,
// age: age
// }
const p1 = { name, age }; //对象有1个name属性的,值是name常量的值.
5. Set对象
ES6新增的,和数组类似,但是不允许存储相同变量(可以用来去重)
方法和属性:set.add() 新增
set.delete()删除
set.size 数据的个数
set.has() 检测一个元素是否在set对象中存在
set.clear() 清空所有数据
//1. 创建1个Set对象
// const set = new Set();
// //2. 往set对象中存储数据
// set.add('jack');
// set.add('rose');
// set.add('lucy');
// set.add('rose'); //如果存储的数据 在set中已经存在了,那么就不会将其存储进去. 相同的数据在set中只会保留1份.
//3. set不是数组.
// console.log(set.length);
// for(let i = 0; i < set.length; i++){
// console.log(set[i]);
// }
//4. set的数据的个数
// console.log(set.size);
// set不是数组,所以它没有下标.
// for(let i = 0; i < set.size; i++){
// console.log(set[i]);
// }
//let item 表示声明了1个变量,所以item可以任意取名字.
// set中有多少个数据,那么这个循环就会循环多少次.
// 每次循环的时候: 声明item, 然后将set中的数据从头到尾赋值给item
// for(let item of set){
// console.log(item);
// }
//const arr = [10, 10, 20, 20, 30,40];
//如果通过构造函数传入1个数组,那么这个set中存储的就是这个数组的不重复的数据.
//const set = new Set(arr);
//这个时候,不重复的数据,是存储在set中的. 数组的数据是没有变化的.
//将set中的数据 存储到数组中.
//const arr1 = [...set]
//console.log(arr1);
// console.log(arr);
// console.log(set);
//item 迭代变量.
// for(const item of set){
// console.log(item);
// }
const arr1 = [10, 10, 20, 20, 30,40];
const arr2 = [...new Set(arr1)];
console.log(arr2);
数组转set :const set = new Set(arr1);set转数组:const arr2 = […new Set(arr1)]
6. 箭头函数
作用:简化函数的定义(本质是匿名函数)
特点:箭头函数没有自身的this绑定,在箭头函数中使用this,this指向的是父级函数的this。
setTimeout(() => console.log(this), 1000); //this=window window.setTimeout
7. node.js模块
内置模块:是由Node.js提供的模块. 我们可以直接使用.不同的模块 提供不同的功能(fs,path,http)
文件模块/自定义模块
第3方模块.(express)
7.1 fs模块
// 1. 将fs模块导入.
// fs就指向fs模块.
const fs = require('fs');
//2 读取文件的内容
//2.1 回调函数的执行时机: 文件读取完毕之后,就会执行这个回调.
// err: 如果读取的时候,发生了错误,那么err就有值,值就是错误的详细信息.
// data: 如果读取成功,那么读取到的数据就在这个data中.
const path = __dirname+'/data/1.txt';
console.log(path);
fs.readFile(path, 'utf-8', (err, data) => {
//err如果有值,就代表读取失败,err中存储的就是失败的详细信息.
if(err) return console.log('读取文件失败, 失败的原因:'+err);
//否则,代表读取成功.读取到的数据在data中.
console.log(data);
});
__dirname 关键字.
它的值是 当前文件所在的目录的绝对路径.
__filename 关键字
它的值是 当前文件的绝对路径.
7.2 path模块
const fs = require('fs');
const path = require('path');
// path.join()用来拼接路径
//1. 自动判断是否要加棍
//2. 自动判断正棍还是反棍,.
const filename = path.join(__dirname, 'data', '1.txt');
fs.readFile(filename, 'gb2312', (err, data) => {
if(err) return console.log('读取错误 错误信息: ' + err);
//说明err没有值,代表读取成功
console.log(data);
});
path.join(__dirname+ ‘当前文件夹的那个文件路径’) 可以自动拼接路径
8. 字符编码
计算机只能存储0 1(高/低电频)把人类的语言文字翻译成0 1 这个动作就叫字符编码(我现在的理解)
一个字节=8个bit
(0000 1111)
ASCLL码: 规定使用1个bit字节来表示1个美国人的文字.在这个表中,规定了每一个文字存储在计算机中对应的二进制(一个字节有256种状态)
GB2312 : 规定使用两个字节表示一个文字: 2个字节 == 16个比特位 65536个.GB2312 编录了 几乎所有的常见的简体汉字 希腊文 日文.规定了每一个文字 在计算机中存储的二进制
Big5: 收录了几乎所有的繁体中文,不包括简体中文
UTF-8编码表:ISO 国际标准化组织发布,收录了世界上几乎所有的文字,使用变长字节,最多使用4个字节表示1个文字.中文: 大部分 3个字节 小部分4个字节(好处是全世界通用,但是存储的内容(最多需要4个字节表示一个文字)比较大)
总结
浏览器非常重要的两个部分:渲染引擎(浏览器内核),js解析引擎(chrome 的v8)
了解node:底层是基于v8解析引擎的,它是js另外的一个宿主,支持跨平台,开发Web应用
var let const 之前写过一篇稍微详细的,ES6还有很多语法待补充,慢慢积累吧,