es6划重点

1.作用域变量

1.1.letvar对比

1.变量不提升

var 可能会造成变量提升

这里变量提升了,先声明a然后打印再赋值,结果是undefined

console.log(a);//undefined
var a = 1; //相当于
var a;
console.log(a);
a = 1;

let的话,变量不会提升,打印的时候,会报错,因为还没声明

console.log(a);//a is not defined
let a = 1;

2.不能重复定义

var 可能会被重新赋值, let不能重复声明一个变量

var a = 1;
var a = 2;
console.log(a);//2
let a = 1;
let a = 2;//Identifier 'a' has already been declared 这里是说它已经被声明了,不能重复声明
console.log(a);

3.暂存死区

var的作用域问题 (函数作用域 全局作用域) (let 暂存死区)

只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。

{
let a = 1;
}
console.log(a);//a is not defined
{
var a = 1;
}
console.log(a)//1

4.闭包新写法

以前

;(function () {

})();

现在

{}

2.const(常量)

const声明一个只读的常量。一旦声明,常量的值就不能改变。



const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用

const PI = 3.141593
PI > 3.0

es5写法

Object.defineProperty(typeof global === "object" ? global : window, "PI", {
value: 3.141593,
enumerable: true,//对象属性是否可通过for-in循环,flase为不可循环,默认值为true
writable: false,//对象属性是否可修改,flase为不可修改,默认值为true
configurable: false//能否使用delete、能否需改属性特性、或能否修改访问器属性
})
PI > 3.0;

3.解构

1.数组解构

let [,b,c,d=100] = [1,2,3];
console.log(b,d);

2.对象解构

let obj = {name:'cjw',age:18};
//这里重新命名了
let {name:Name,age,address="默认"} = obj;
console.log(Name, age, address)

3.混合解构

let [{name}] =  [{name:'cjw'}];

4.传递参数,结果解构

Promise.all(['cjw','9']).then(([name,age])=>{
console.log(name, age);
});

4.拷贝

4.1.浅拷贝

let arr1 = [1,2,3,[1,2,3]];
let arr2 = [1,2,3];
let arr = [...arr1,...arr2];
console.log(arr)
arr1[3][0] = 100;

4.2.对象合并

let school = {name:'zfpx',a:{a:1}};
let my = {age:18};
let newObj = {...school,a:{...school.a},...my};
console.log(newObj)

4.3.JSON.parse(JSON.stringify())

这个只能拷贝普通对象,new Date之类不能拷贝

let school = { name: 'zfpx', a: { a: 1 } ,date:new Date(),reg:new RegExp(/\d+/),fn:function(){}};
let s = JSON.parse(JSON.stringify(school));

4.4.深拷贝(递归拷贝)

function deepClone(obj) { // 递归拷贝 深拷贝
if(obj == null) return null;
if (obj instanceof Date) return new Date(obj);
if(obj instanceof RegExp) return new RegExp(obj);
if(typeof obj !== 'object') return obj;
let t = new obj.constructor
for(let key in obj ){
t[key] = deepClone(obj[key])
}
return t;
}
let o = { a: [1, 2, 3] }
let r = deepClone(o);
o.a[1] = 1000

4.5.展开运算符

// 剩余运算符只能用在最后一个参数
function test(a, b,...c) { // c = [5,6,7]
// 将类数组转化成数组
let d = Array.prototype.slice.call(arguments,2)
// a,b,...c
let e = Array.from(arguments).slice(2);
let arr = [...arguments].slice(2);
console.log(e);
}
test(1,2,3,5,6,7);

把多个对象的属性复制到一个对象中,第一个参数是复制的对象,从第二个参数开始往后,都是复制的源对象

// Object.assign  {...}
let name ={name:'zfpx'}
let age = {age:9}
let obj = Object.assign(name,age); // {...}
console.log(obj);

5. 代理proxy

5.1.普通函数(defineProperty)

Object.defineProperty(obj, 'PI', {
enumerable: true,
configurable: false,
get(){
console.log('get');
},
set(){
console.log('set');
val = v;
}
})
obj.PI = 3.15;

5.2.mvvm

let obj = {name: {name: 'cjw'}, age: 18};
function observer(obj){
if(typeof obj != 'object') return obj;
for(let key in obj){
defineReactive(obj, key, obj[key]);
}
}
function defineReactive(obj, key, value){
observer(value);
Object.defineProperty(obj, key, {
get(){
return value;
},
set(){
console.log('update');
}
})
}
observer(obj);
obj.name.name = 'cjw';

5.3 普通代理

let proxy = new Proxy(obj, {
set(target, key, value){
if(key === 'length') return true;
console.log('update');
return Reflect.set(target, key, value);
},
get(target, key){
return Reflect.get(target, key);
}
})
proxy.push('123');
console.log(proxy.length);

5.4 多层代理

let obj = {name: {name: 'cjw'}, age : 18};
function set(obj, callback){
let proxy = new Proxy(obj, {
set(target, key ,value){
if(key === 'length') return true;
console.log('更新');
return Reflect.set(target, key, value);
},
get(target, key){
return Reflect.get(target, key);
}
})
callback(proxy);
}
set(obj, function(proxy){
proxy.age = '100';
console.log(proxy);
})

6.箭头函数

this 指向

去掉function 关键字

去掉return{}

6.1 普通剪头函数

function a(a) {
return function (b) {
return a + b;
}
}
let a = a => b => a + b;
console.log(a(1)(2));

6.2 类数组

let a = (...arguments) => {
console.log(arguments)
}
a(1, 2, 3);

6.3 this指向问题

// this指向问题
let obj = {
a: 1,
b() { // obj = this
console.log(this);
setTimeout(() => { // 箭头函数中没有this指向 从而解决了this的问题
this.a = 100;
}, 1000);
}
}
obj.b();
setTimeout(() => {
console.log(obj.a)
}, 2000);

6.4 let不会将变量放在window上

let a = 1000; // let不会将变量放在window上
let obj = {
a: 1,
b: () => {
this.a = 100; // window
}
}
obj.b();
console.log(obj.a,a);

7.arr(数组新方法)

filter过滤 forEach 循环 map 映射 reduce 收敛 some every 反义

7.1 reduce(收敛)

原生写法

let arr = [1,2,3,4,5];
Array.prototype.myReduce = function (callback,prev) {
for(let i = 0 ; i<this.length;i++){
if(!prev){
// 0 1
prev = callback(this[i],this[i+1],i+1,this);
i++;
}else{
prev = callback(prev,this[i],i+1,this);
}
}
return prev
}
let r = arr.myReduce((prev,next,currentIndex,arr)=>{
return prev+next
},100)

7.2 filter(过滤)

let arr = [1,2,3]
let arr1 = arr.filter(item=>item<=2);
console.log(arr1);

7.3 map

let arr =[1,2,3];
let arr1 = arr.map(item=>item*2);

7.3 every

let arr = [1,2,3];
let flag = arr.every(item=>item==3);
console.log(arr.includes(3)); //es7

7.4 findIndex

let arr = [1, 2, 3];
let item = arr.find(item => item == 4);
console.log(item); //es7

7.5 Array.from

将一个数组或者类数组变成数组,会复制一份

let newArr = Array.from(oldArr);

7.6 Array.of()

of是为了将一组数值,转换为数组

console.log(Array(3), Array(3).length);
console.log(Array.of(3), Array.of(3).length);

7.7 copyWithin

Array.prototype.copyWithin(target, start = 0, end = this.length) 覆盖目标的下标 开始的下标 结束的后一个的下标

[1, 2, 3, 4, 5].copyWithin(0, 1, 2)//[ 2, 2, 3, 4, 5 ]

7.8 Object.keys

Object.keys可以把对象取出来key组成数组 for of 可以迭代数组

for (var a of Object.values({ name: 'cjw', age: 9 }) ){ // forEach不能return
console.log(a);
}

8.Symbol

let s = Symbol();
let q = Symbol(); console.log(s === q);//false let s = Symbol.for('cjw');
let q = Symbol.for('cjw');
console.log(s);//Symbol(cjw)
console.log(q);//Symbol(cjw) console.log(Symbol.keyFor(q));
console.log(s === q);//ture

9.template

9.1 模板字符串

let name = 'cjw';
let age = 9; let str = `${name}今年${age}`;
console.log(str);

9.2 模板字符串实现原理

let newStr = str.replace(/\$\{([\s\S])\}/g, function(){
return eval(arguments);
})
console.log(newStr);

10.集合

10.1 Set

set可以做去重 set不能放重复的

let set = new Set([1,2,3,3,2,1]);
console.log([...set]);

10.2 Map

let map = new Map();
map.set('js','123');
map.set('node','456');
map.forEach(item=>{
console.log(item);
});

11 class

11.1 es5 实现的类

// call 构造函数里面的属性方法复制

// Object.crate 复制原型里面的属性和方法

function Animal(type) {
this.type = { t: type};
}
Animal.prototype.eat = function () {
console.log('eat');
}
function Cat(type) {
Animal.call(this,type); // 让父类在子类中执行,并且this指向子类
}
// 原型上还有一个属性
// 4.继承实例上和原型上的方法
function create(proto) {
let Fn = function () { }
Fn.prototype = proto;
return new Fn();
}
Cat.prototype = Object.create(Animal.prototype,{constructor:{value:Cat}});
let cat = new Cat('哺乳类')
console.log(cat.type);
cat.eat();
console.log(cat.constructor);

11.2 es6 写法

class Animal {
constructor(type){
this.type = type;
}
static flag(){
return 'animal';
}
eat(){
console.log('eat');
}
}
class Cat extends Animal{
constructor(type){
super(type);
}
} let cat = new Cat('哺乳类');
console.log(cat.type);
cat.eat();
console.log(Cat.flag);

11.3 get 与 set

getter可以用来得获取属性,setter可以去设置属性

class Person {
constructor(){
this.hobbies = [];
}
set hobby(hobby){
this.hobbies.push(hobby);
}
get hobby(){
return this.hobbies;
}
}
let person = new Person();
person.hobby = 'basketball';
person.hobby = 'football';
console.log(person.hobby);

参考文档

ECMAScript 6 入门 let 和 const 命令--阮一峰

es6-features.org

es6划重点的更多相关文章

  1. Andrew Ng机器学习课程笔记--week11(图像识别&总结划重点)

    一.内容概要 Photo OCR Problem Decription and pipeline(问题描述和流程图) Sliding Windows(滑动窗口) Getting Lots of Dat ...

  2. .NET日志记录之——log4net划重点篇

    .NET日志记录之--log4net划重点篇 1.概述 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不 ...

  3. JS划重点——类和对象的不正经阐述

    JS划重点--类和对象的不正经阐述 /在JS 类里面函数也是一个对象,那么要创建一个对象就需要一个类,这个类可以由这个对牛逼的对象-函数来实现/ /首先是普罗大众都会的 工厂模式来创建一类/ func ...

  4. Android -- 贝塞尔实现水波纹动画(划重点!!)

    1,昨天看到了一个挺好的ui效果,是使用贝塞尔曲线实现的,就和大家来分享分享,还有,在写博客的时候我经常会把自己在做某种效果时的一些问题给写出来,而不是像很多文章直接就给出了解决方法,这里给大家解释一 ...

  5. ES6方面重点摘要

    1.变量声明(1)内层变量覆盖外层变量(即后面的覆盖前面的)(2)循环变量的声明,i值在全局范围内有效,所以最后输出的都是最后一轮i的值(3)let.const的引入,为JS增加了块级作用域的概念(c ...

  6. MapReduce Tutorial(划重点)

    Mapper Mapper的maps阶段将输入键值对经过计算得到中间结果键值对,框架会将中间结果按照key进行分组,然后传递给reducer以决定最终的输出.用户可以通过Job.setGrouping ...

  7. datatable动态列处理,重绘表格(敲黑板,划重点!!!我肝了一天半才彻底弄懂这个东西,TAT)

    datatable动态列处理,重绘表格 前言:至于动态列的绘画,我前面博客已经写过了,就是动态列的配置问题,不懂的去我博客看下,今天要写的呢,就是你已经写了一个动态列在datatable,现在你想重新 ...

  8. 《阿里巴巴 Java 开发手册》划重点!

    [强制]小数类型为 decimal,禁止使用 float 和 double. 说明:float 和 double 在存储的时候,存在精度损失的问题,很可能在值的比较时,得到不 正确的结果.如果存储的数 ...

  9. ES6,ES7重点介绍

    1. 字符串模板 <!--旧版拼接字符串--> var str = '我是时间:'+new Date(); <!--新版拼接字符串--> let str = `我是时间${ne ...

  10. 划重点!AWS的湖仓一体使用哪种数据湖格式进行衔接?

    此前Apache Hudi社区一直有小伙伴询问能否使用Amazon Redshift查询Hudi表,现在它终于来了. 现在您可以使用Amazon Redshift查询Amazon S3 数据湖中Apa ...

随机推荐

  1. .NET周刊【5月第1期 2025-05-04】

    dotnet 9 通过 AppHostRelativeDotNet 指定自定义的运行时路径 https://www.cnblogs.com/lindexi/p/18847625 这篇文章讨论了在 .N ...

  2. 实现高质量视频通话的javascript技巧与方法

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  3. SOUI2-布局系统

    布局系统 每个UI界面都是由大量的界面元素构成的,在window编程中,这些界面元素的最小单位被称为控件,而布局则是这些控件在界面的相对位置和大小. 目前SOUI支持锚点布局.线性布局.网格布局,下面 ...

  4. RPC实战与核心原理之熔断限流

    熔断限流 服务端的自我保护 策略 在 RPC 调用中服务端的自我保护策略就是限流 如何实现 方式有很多,比如最简单的计数器,还有可以做到平滑限流的滑动窗口.漏斗算法以及令牌桶算法等等.其中令牌桶算法最 ...

  5. IDEA主题下载仓库地址

    拿去,不多BB https://plugins.jetbrains.com/search?tags=Theme

  6. C# 在Excel中设置文本的对齐方式、换行、旋转

    在 Excel 中,对齐.换行和旋转是用于设置单元格内容显示方式的功能.合理的设置这些文本选项可以帮助用户更好地组织和展示 Excel 表格中的数据,使表格更加清晰.易读,提高数据的可视化效果.本文将 ...

  7. CSP-S 2020全国开放赛前冲刺模拟训练题1信友队集训队员周镇东出题 小结

    题目&官方题解下载 我的题解 CSP-S 2020模拟训练题1-信友队T1 四平方和 CSP-S 2020模拟训练题1-信友队T2 挑战NPC 我仍未看懂那天所看到的T3的题解 CSP-S 2 ...

  8. Windowns下Go环境搭建(含GoLand激活),并运行第一个Go程序

    As we all know, Go是一门注重简单.可靠.高效的编程语言.它比其他语言都简单,所以学起来更快. 在2007年,谷歌的搜索引擎出了一个问题.当谷歌工程师尝试调试新代码时,单单编译就数百万 ...

  9. cmake基础知识

    Cmake Cmake变量 Cmake的基本类型只有两种,分别是字符串和字符串列表,使用set命令来设置变量 set(var abc) # abc是字符串,var是值为"abc"的 ...

  10. 「Log」做题记录 2024.1.1-2024.1.28

    \(2024.1.1-2024.1.7\) \(\color{blueviolet}{P1501}\) LCT 板子,链加链乘查询链和,断边加边. \(\color{black}{P4332}\) L ...