当前位置: 首页 > news >正文

前端基础:回顾es6相关知识

Author note(题记):

ECMAscript is international standard of javascript。

ECMA 是 js的国际标准版语言。

let and const 

为什么之前用var现在需要用let,const呢?

其实就是因为规范作用域的问题。var的作用域无块级

for (var i = 0; i < 10; i++) {console.log('i')}console.log(i)// 10for (let j = 0; j < 10; j++) {console.log('j')}console.log(j) // 报错

 我们看这个代码会发现代码块里边使用var外边也能访问,而let就不能,所以let更加严谨,const也一样,只不过const是声明常量的词,用作不改变的变量内容。

顺便提一下var的变量提升也是鸡肋的存在,不太严谨,所以let与const的暂时性死区也是解决这个问题的。

解构赋值

功能就是为了方便取值,解构解构先了解之前的结构才能解开,结构需一样,但取值可少取

比如let 【x,y] = [1,2,3]

let arr = [1,2,3]let a = arr[0]let b = arr[1]let c = arr[2]console.log('数据是', a, b, c)

vs

let [a,b,c] = [1,2,3]console.log('数据是', a, b, c)

你会发现es6的写法真的很nice

事实上,只要某种数据结构具有 Iterator 接口,都可以采用数组形式的解构赋值。

使用场景上对象的解构赋值非常常用,比如使用Vuex,路由,第三方模块等等。

字符串扩展 

unicode表示法

ES6 加强了对 Unicode 的支持,允许采用\uxxxx形式表示一个字符,其中xxxx表示字符的 Unicode 码点。

let b = '\u0061'console.log('数据是', b) // a

遍历字符串 

for (let a of 'hep') {console.log('数据是', a)}

 模板字符串

提示:这个场景用的最多

let name = 'john'let age = '18'let sentence = 'my name is' + name + ',' + 'my age is' + ageconsole.log(sentence)let esSentence = `my name is ${name},my age is ${age}`console.log(esSentence)

字符串的新增方法

String.fromCodePoint()

String.fromCharCode(0x20BB7)

正则

RegExp 构造函数

第一种情况是,参数是字符串,这时第二个参数表示正则表达式的修饰符(flag)

var regex = new RegExp('xyz', 'i');
// 等价于
var regex = /xyz/i;

第二种情况是,参数是一个正则表示式,这时会返回一个原有正则表达式的拷贝。

var regex = new RegExp(/xyz/i);
// 等价于
var regex = /xyz/i;

数值的扩展

Number.parseInt(), Number.parseFloat()

// ES6的写法
Number.parseInt('12.34') // 12
Number.parseFloat('123.45#') // 123.45

Number.isInteger()

Number.isInteger()用来判断一个数值是否为整数。

Number.isInteger(25) // true
Number.isInteger(25.1) // false

Math对象的扩展

Math.trunc()

Math.trunc方法用于去除一个数的小数部分,返回整数部分。

Math.trunc(4.1) // 4
Math.trunc(4.9) // 4
Math.trunc(-4.1) // -4
Math.trunc(-4.9) // -4
Math.trunc(-0.1234) // -0

Math.sign()

Math.sign方法用来判断一个数到底是正数、负数、还是零。对于非数值,会先将其转换为数值。

它会返回五种值。

  • 参数为正数,返回+1
  • 参数为负数,返回-1
  • 参数为 0,返回0
  • 参数为-0,返回-0;
  • 其他值,返回NaN
Math.sign(-5) // -1
Math.sign(5) // +1
Math.sign(0) // +0
Math.sign(-0) // -0
Math.sign(NaN) // NaN

 函数的扩展

function Point(x, y) {this.x = x || 0;this.y = y || 0;
}const p = new Point();
p // { x: 0, y: 0 }

vs es6

function Point(x = 0, y = 0) {this.x = x;this.y = y;
}const p = new Point();
p // { x: 0, y: 0 }

当然下边这个更好一些

我们再看下边这个结合解构赋值的例子

function foo({x, y = 5}) {console.log(x, y);}foo({}) // undefined 5foo({x: 1}) // 1 5foo({x: 1, y: 2}) // 1 2

也就是当一个参数为复杂数据类型的时候使用更加的方便了

数组的扩展

合并数组es6之前用concat(),以后就let arr2 = 【...arr1】

Array.from()

let arrayLike = {'0': 'a','1': 'b','2': 'c',length: 3
};// ES5 的写法
var arr1 = [].slice.call(arrayLike); // ['a', 'b', 'c']// ES6 的写法
let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']

延申:[].slice.call()等同于Array.prototype.slice.call() 

实例方法:entries(),keys() 和 values() 

ES6 提供三个新的方法——entries()keys()values()——用于遍历数组。它们都返回一个遍历器对象(详见《Iterator》一章),可以用for...of循环进行遍历,唯一的区别是keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。

for (let index of ['a', 'b'].keys()) {console.log(index);
}
// 0
// 1for (let elem of ['a', 'b'].values()) {console.log(elem);
}
// 'a'
// 'b'for (let [index, elem] of ['a', 'b'].entries()) {console.log(index, elem);
}
// 0 "a"
// 1 "b"

我们常常用Object.keys(obj).length来判断对象是否为null,arr.keys().length也可以啊,其实想一想直接arr.length就可以啊。

实例方法:includes()

Array.prototype.includes方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法类似。ES2016 引入了该方法。

之前经常使用这个去判断数据当中是否有某一个值,进行判断。

实例方法:flat(),flatMap()

数组的成员有时还是数组,Array.prototype.flat()用于将嵌套的数组“拉平”,变成一维的数组。该方法返回一个新数组,对原数据没有影响。

对象的扩展

属性的简洁表示法

提示:这个你会见的最多  比如import {name} from ’@/name.js‘

const foo = 'bar';
const baz = {foo};
baz // {foo: "bar"}// 等同于
const baz = {foo: foo};

Symbol

这个用的场景就是有些对象属性不想对外开发,想私有化就用它就对了

let obj = {[Symbol('name')]: '一斤代码',age: 18,title: 'Engineer'
}Object.keys(obj)   // ['age', 'title']for (let p in obj) {console.log(p)   // 分别会输出:'age' 和 'title'
}Object.getOwnPropertyNames(obj)   // ['age', 'title']

Set与Map

Set理解为数学的集合就行,Map就是为了解决键的多样化的设置,另外就是按顺序迭代,占用空间较小。

Proxy

可以理解的是这个比较重要,是对代码的再次编程。

var proxy = new Proxy({}, {get: function(target, propKey) {return 35;}
});proxy.time // 35
proxy.name // 35
proxy.title // 35

其实在Vue中我们知道数据的双向绑定Vue2使用的definePropty(),Vue3使用的就是Proxy

Promise 对象

这个非常关键,之前写过一篇。

promise的使用

async函数 

这个也用的特别多,其实就是就是返回一个Promise对象

function timeout(ms) {return new Promise((resolve) => {setTimeout(resolve, ms);});
}async function asyncPrint(value, ms) {await timeout(ms);console.log(value);
}asyncPrint('hello world', 50);

async function f() {return 'hello world';
}f().then(v => console.log(v))

模块化

目前很多项目都是使用的import,export,比较常用

结语:

工作之余顺便看看之前的知识是一件开心的事,每一次看都会有新的体会。

Module 的语法 - ECMAScript 6入门 (ruanyifeng.com)

相关文章:

  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • docker使用Dockerfile制做容器(以hyperf为列,开机启动)
  • SpiderFlow爬虫平台漏洞利用分析(CVE-2024-0195)
  • 基于双向长短期神经网络的客流量预测,基于bilstm的客流量预测
  • [MySQL]基础的增删改查
  • Java代码审计Shiro反序列化CB1链source入口sink执行gadget链
  • P2717 寒假作业 CDQ
  • GitHub Copilot 与 OpenAI ChatGPT 的区别及应用领域比较
  • 数据结构之顺序表的增删查改
  • 智能安全帽定制_基于联发科MT6762平台的智能安全帽方案
  • Spring Boot多环境配置
  • Winform使用Webview2(Edge浏览器核心)实现精美教程目录
  • PHP AES加解密示例【详解】
  • Qt 容器 Qlist
  • 伪装实例分割模型:OSFormer模型及论文解析
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • 【知识碎片】第三方登录弹窗效果
  • ES6系统学习----从Apollo Client看解构赋值
  • HTML-表单
  • JavaScript 一些 DOM 的知识点
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • leetcode讲解--894. All Possible Full Binary Trees
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • webpack+react项目初体验——记录我的webpack环境配置
  • 多线程 start 和 run 方法到底有什么区别?
  • 记一次和乔布斯合作最难忘的经历
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 那些年我们用过的显示性能指标
  • 排序算法之--选择排序
  • 前端学习笔记之观察者模式
  • 算法-图和图算法
  • 小程序01:wepy框架整合iview webapp UI
  • postgresql行列转换函数
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • $.ajax()方法详解
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (HAL库版)freeRTOS移植STMF103
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (第二周)效能测试
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)大道至简,职场上做人做事做管理
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .NET CLR基本术语
  • .Net Web窗口页属性
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET程序员迈向卓越的必由之路
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @RestController注解的使用