查漏补缺 - ES6

2023-11-03

js 在 2015年发布了新版本,被称为 es6,之后每年更新一个版本。自 es7 之后,就直接用年份命名了

版本 年份
es6 2015
es7 2016
es2017 2017
es2018 2018

1,let 和 const

1,会产生块级作用域。

if (true) {
  const a = 1
}
console.log(a) // ReferenceError: a is not defined

下面如果用 var 会打印3个2。

for (let i = 0; i < 3; i++) {
  setTimeout(function() {
    console.log(i)
  }, 1000)
}

2,如何理解 const 定义的变量不可被修改?

指这个变量不能被修改

  • 重新赋值,和修改这个对象的属性值是没有关系的。
const obj = {}

obj = 1 // TypeError: Assignment to constant variable.

obj.a = 1 // ok
  • 自增
const a = 1
a++ // TypeError: Assignment to constant variable.

2,数组

1,for…of 用于遍历可迭代对象,也包括伪数组,比如 argumentsNodeList(querySelectAll 获取的)

2,判断是不是数组,Array.isArray()

3,解构数组

const arr = [1, 2, 3, 4, 5];

const [a, b] = arr; // 1 2
const [, , a, b] = arr; // 3 4
const [a, , b, c] = arr; // 1 3 4
const [a, b, ...c] = arr; // 1 2 [ 3, 4, 5 ]

4,数组去重

const arr = [1, 3, 4, 3, 6];
const newArr = [...new Set(arr)]; // [ 1, 3, 4, 6 ]

5,打平数组

参数为遍历的层级。

const arr1 = [1, 2, [3, 4]];
arr1.flat();
// [1, 2, 3, 4]

const arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat();
// [1, 2, 3, 4, [5, 6]]

const arr3 = [1, 2, [3, 4, [5, 6]]];
arr3.flat(2);
// [1, 2, 3, 4, 5, 6]

const arr4 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]];
arr4.flat(Infinity);
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

6,创建指定 length 的数组

Array(10).fill(0)

3,对象

1,Object.is()

MDN - Object.is(),判断2个值是否相同,和 === 唯一的区别是:

Object.is(-0, +0) // false
Object.is(NaN, NaN) // true

-0 === +0 // true
NaN === NaN // false

Array.prototype.includes() 使用的就是 Object.is() 的规则。

2,属性描述符

js 使用属性描述符,来描述对象中的每个成员。vue2 通过此特性实现响应式核心原理。

const obj = {
  name: '下雪天的夏风',
  age: 18
};

在 js 内部被描述为

{
  // 属性 name 的描述符
  name: {
    value: '下雪天的夏风',
    configurable: true, // 该属性的描述符是否可以被重新定义
    enumerable: true, // 该属性是否允许被遍历,会影响for-in循环
    writable: true // 该属性是否允许被修改
  },
  // 属性 age 的描述符,同理。
  age: {
    value: '18',
    configurable: true,
    enumerable: true,
    writable: true
  },
}

有 API 可以操作属性描述符

const obj = {
  name: '下雪天的夏风',
  age: 18
};

// 修改属性描述符
Object.defineProperty(obj, "name", {
  value: "新值",
  writable: false,
  enumerable: false,
  configurable: true,
});

// 获取属性描述符
Object.getOwnPropertyDescriptor(obj, "name");

// 输出
{
  value: '下雪天的夏风',
  writable: false,
  enumerable: false,
  configurable: true
}

1,属性描述符 writable: false 时,修改无效,但不报错。

2,当通过 Object.defineProperty 设置 configurable: false 后,就不能再次修改属性描述符了,会报错。

gettersetter

const obj = {};

let init;

Object.defineProperty(obj, "a", {
  get() { // 读取属性 a 时,得到的是该方法的返回值
    return init;
  },
  set(val) { // 设置属性 a 时,会把值传入 val,调用该方法
	init = val
  }
});

3,常用API

const obj = { name: "名字", age: "年龄" };
console.log(Object.keys(obj)); // [ 'name', 'age' ]
console.log(Object.values(obj)); // [ '名字', '年龄' ]
console.log(Object.entries(obj)); // [ [ 'name', '名字' ], [ 'age', '年龄' ] ]

还有一个,正好和 Object.entries() 相反。

const obj = Object.fromEntries([
  ["name", "名字"],
  ["age", "年龄"],
]); // { name: '名字', age: '年龄' }

4,得到除某个属性之外的新对象。

const obj = {
  a: 1,
  b: 2,
  c: 3,
};

const { a, ...newObj } = obj; // newObj { b: 2, c: 3 }

//或
const newObj = {...obj}
delete newObj.a

·

4,函数

1,箭头函数

特点

  1. 不能使用new调用
  2. 没有原型,即没有prototype属性
  3. 没有arugments
  4. 没有this

关于原型

普通函数:

在这里插入图片描述

箭头函数:

在这里插入图片描述

关于 arugments :

function fun() {
  const fun2 = () => {
    console.log(arguments);
  };
  fun2(1, 2);
}
fun(3, 4); // [Arguments] { '0': 3, '1': 4 }

在箭头函数中,可以使用剩余参数代替 arguments

const fun = (a, ...args) => {
  console.log(a, args); // 1 [ 2, 3, 4 ]
  console.log(Array.isArray(args)); // true
};
fun(1, 2, 3, 4);

2,默认参数

const fun = (a, b = 1) => {
  console.log(a, b);
};
fun(1, undefined); // 1 1

3,解构传参

const fun = (config = { page: 1, limit: 10 }) => {
  console.log(config); // { page: 1 }  { page: 2, limit: 10 }
};

// 这样才能使用默认值
const fun = ({ page = 1, limit = 10 } = {}) => {
  console.log(page, limit); // 1 10 和 2 10
};

fun({ page: 1 });

fun({
  page: 2,
  limit: 10,
});

4,类语法

基础写法:

// 旧的写法
function User(firstName, lastName){
  this.firstName = firstName;
  this.lastName = lastName;
  this.fullName = `${firstName} ${lastName}`;
}
User.isUser = function(u){
  return u && u.fullName
}
User.prototype.sayHello = function(){
  console.log(`姓名:${this.fullName}`);
}

// es6 等效写法
class User{
  constructor(firstName, lastName){
    this.firstName = firstName;
    this.lastName = lastName;
    this.fullName = `${firstName} ${lastName}`;
  }
  
  static isUser(u){
  	 return u && u.fullName
  }
  
  sayHello(){
    console.log(`姓名:${this.fullName}`);
  }
}

继承关系

function Animal(type, name){
  this.type = type;
  this.name = name;
}

Animal.prototype.intro = function(){
  console.log(`I am ${this.type}, my name is ${this.name}`)
}

function Dog(name){
  Animal.call(this, '狗', name);
}

Dog.prototype = Object.create(Animal.prototype); // 设置继承关系

// 新的方式

class Animal{
  constructor(type, name){
    this.type = type;
    this.name = name;
  }
  
  intro(){
    console.log(`I am ${this.type}, my name is ${this.name}`)
  }
}

class Dog extends Animal{
  constructor(name){
    super('狗', name); // 调用父级构造函数
  }
}

以上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查漏补缺 - ES6 的相关文章

  • 检测单选按钮/复选框状态的变化

    我需要可靠地检测页面上单选按钮 复选框的状态变化 以便查看表单是否被修改 现在 这是一个完全独立的脚本 我无法修改任何控制表单的内容 目前 我只能看到两种方法 onchange事件处理程序 有助于处理文本框 文本区域和选择 但不会针对复选框
  • 如何恢复文本框数据

    我有一个小小的要求 我们已经恢复了之前清除的文本框数据 下面是我的 HTML 代码 table tr td td tr table
  • 当内部元素滚动位置到达顶部/底部时防止父元素滚动?

    我有一个小 浮动工具箱 一个带有position fixed overflow auto 效果很好 但是 当在该框内滚动 使用鼠标滚轮 并到达底部或顶部时 父元素 接管 滚动请求 工具框后面的文档滚动 这很烦人 而不是用户 要求的 我正在使
  • 在 Node.js 中生成带条形码的 pdf

    我在用https github com devongovett pdfkit https github com devongovett pdfkit生成 PDF 文件 我可以简单地使用类似的方法 app get get pdf req re
  • 如何将值发布到输入框中?

    Intro I would like to get the current time after clicking at click and POST the value into input text box Note 假设包含引导样式表
  • Javascript 进程是否有多个执行线程?

    背景 我正在创建一个 地址簿 类型的应用程序 有很多条目需要加载 一个想法是首先加载一小部分条目 让用户开始 然后将剩余条目排队 优先考虑用户单击的条目 例如 如果他们单击以 X 开头的名称 请先加载这些名称 然后再处理队列的其余部分 这个
  • 以下文档我无法创建 Vue.js 3 的实例

    The code https stackblitz com edit vue ttt file src main js https stackblitz com edit vue ttt file src main js 问题 我正在尝试在
  • Angular UI 路由器嵌套视图问题

    我在理解 Angular UI Router 嵌套视图的工作原理时遇到了一些问题 我的 stateProvider 看起来像这样 stateProvider state login url login views main template
  • onClick 处理程序在每个渲染周期触发

    我有这样的默认状态 this state selectedTab tab1 then 我的渲染方法是这样的 render const selectedTab this state return li tab1 li li tab2 li d
  • 正则表达式中连字符的这种用法有效吗?

    NB I only想知道它是否是正则表达式定义中未转义连字符的有效应用 它是not关于匹配电子邮件 连字符或反斜杠的含义 量词或其他任何内容的问题 另外 请注意 链接的答案并没有真正讨论转义 未转义连字符之间的有效性问题 通常我会像这样声明
  • 如何显示接下来的三个图像单击加载更多按钮

    我需要一个加载更多按钮来显示图像 页面加载时 我显示 3 个图像 单击 加载更多 按钮后 接下来的 3 个图像将显示在屏幕上 我尝试了下面的代码 但它不起作用 你能帮我解决这个问题吗 function item slice 0 2 show
  • 从链接打开本地文件夹

    如何通过单击任何链接打开本地文件夹视图 我尝试了很多选择 例如 a href Open folder a or a Open folder a or a Open folder a 解决方案 启动可下载链接 以下内容适用于所有浏览器 但一如
  • 在反应中访问回调内的 event.target

    我有以下课程片段 constructor props super props this timeout null search e gt clearTimeout this timeout this timeout setTimeout f
  • 了解 Document.createElement()

    我在用着GWT及其底层DOM能力 我基本上想要实现的是 Have a div包含一些文本的元素 其中一些文本将被包围span元素 span 元素可相互拖动并提供上下文菜单 New span元素可以由最终用户动态创建 它可能是这样的 在应用程
  • Firebase + Node.js:错误:找不到 XMLHttpRequest 兼容性库

    Firebase Node js On iOS 安装的 Node js npm 安装 firebase save 节点测试 js 其中 test js 是一个非常简单的连接到 Firebase 的脚本 var firebase requir
  • 如何将MathJax公式转换为img

    Mathjax 现在在我的项目中运行良好 但有一个问题 有没有办法将MathJax的公式 纯html和css 转换成img文件 我可以保存 MathJax 可以配置为生成 SVG 看http docs mathjax org en late
  • React Redux - 在辅助函数中访问现有存储

    我试图在反应组件之外获取存储实例 存储状态 即在单独的辅助函数中 我有我的减速器 我的动作 我在最上面的组件中创建了一个商店 configStore js import createStore from redux import gener
  • onPress 方法中箭头函数与普通函数的行为

    正在学习 Native React 并学习更多关于 javascript 的知识 所以我仍然不明白它的行为的很多事情 我使用 TouchableOpacity 及其 onPress 属性创建了一个按钮组件 为了让它工作 我必须发送我想要执行
  • 为什么 JavaScript 中是 [1,2] + [3,4] = "1,23,4" ?

    我想将一个数组的元素添加到另一个数组中 所以我尝试了以下方法 1 2 3 4 它的回应是 1 23 4 到底是怎么回事 The 操作员没有为数组定义 发生的事情是 JavaScript将数组转换为字符串并将它们连接起来 Update 由于这
  • JavaScript 阶乘防止无穷大

    我一直在 JavaScript 中使用这个函数来计算阶乘数 var f function factorial n if n 0 n 1 return 1 if f n gt 0 return f n return f n factorial

随机推荐

  • Qt Creator中一些常用小技巧(总结)

    参考博客 https blog csdn net luoyayun361 article details 105431913 以下代码摘抄以上大神博客 1 代码注释 常用双斜杠 是单行注释 可以多行注释 其实在Qt creator里面还有一
  • Qt — xml读写及常用操作示例

    文章目录 1 QXML类概述 2 XML示例 2 1 示例1 3 XML节点说明 3 1QDomNode 3 2 QDomDocument 3 3 QDomElement 3 4 QDomAttr 3 5 QDomText 4 使用示例 4
  • TypeScript 接口继承

    TypeScript 接口继承 和类一样 接口也可以通过关键字 extents 相互继承 接口继承 分为 单继承和多继承 即继承多个接口 另外 接口也可以继承类 它会继承类的成员 但不包括具体的实现 只会把类的成员作为一种声明 本文主要总结
  • 7-项目成本管理

    高项第一阶段 日签 这世上没有毫不后悔的选择 生活也是没有正确答案的 只要坚信选择的道路就是正确答案 并把它变成正确答案就可以了 导图 一个过程记录
  • 第四课 小程序列表渲染特性 条件渲染特性

    小程序 列表渲染特性 1 block标签是包装元素 不是Ui现实元素 渲染后不会被显示出来 2 wx key 属性 重排序保证唯一值 提高整体渲染效率 条件渲染特性 wx if和hidden有什么区别 1 都有显示和隐藏的作用 2 if条件
  • 为什么上线要做防御?

    导语 随着5G时代到来和ipv6的普及 攻击者手段层出不穷 从一开始简单的DDOS分布式拒绝服务 后到蔓延ACK 从不同协议通讯层面发起的攻击 现在CC请求类型攻击 已经可以绕过域名验证 以及模拟正常用户访问 1 黑客勒索 2021年 8月
  • Pycaret详细介绍该库用法及案例(分类方法案例胎儿状态分类指南)

    Pycaret 基本流程一般包含 读取数据 gt 建模 对比模型 gt 模型预测 gt 绘图分析 gt 模型导出 安装pycaret见此篇博文 gt 安装pycaret遇到的问题 使用此命令 pip default timeout 100
  • 字符检测识别机器视觉系统方案设计——东莞康耐德

    字符识别机器视觉系统概述 系统功能 可以自动搜索定位视野中的字符位置 可以自动识别出其中的字符值 可以自动校验字符是否正确并且标记出不正确的字符位置 可以进行在线检测 系统稳定 高效 成本低 应用现状 根据被测产品 字符 测量要求 需要对其
  • UAT测试和SIT测试的区别

    区别如下 1 UAT 终端用户集成测试 主要是要求用户参与进测试流程 并得到用户对软件的认可 鼓励用户自己进行测试设计和进行破坏性测试 充分暴露系统的设计和功能问题 显然 用户的认可和破坏性测试是难点 因为测试人员并不了解用户用什么样的手段
  • Flutter:App级别组件 - MaterialApp、Scaffold、AppBar、Drawer、BottomNavigationBar、SnackBar

    参考 老孟App级别组件 MaterialApp Flutter中的MaterialApp是一个基于Material Design风格的顶层Widget 它提供了许多常用的Material Design风格的组件和样式 例如AppBar B
  • Klocwork 2021.3 linux

    Klocwork 2021 3 linux 2692407267 qq com 更多内容请见http user qzone qq com 2692407267
  • gerrit的简单介绍

    什么是Gerrit Gerrit 是一个基于 web 的代码评审工具 它基于 git 版本控制系统 Gerrit 旨在提供一个轻量级框架 用于在代码入库之前对每个提交进行审阅 更改将上载到 Gerrit 但实际上并不成为项目的一部分 直到它
  • css查询无作用,body中的css为何有些没有作用?

    请看 body display block margin 0 auto font size 40px width 900px height 50px border solid 4px green d2 width 100 height au
  • vue 表格根据日期排序

  • window10下安装tensorflow-gpu1.14(RTX2080Ti+cuda10.0+cudnn7.6.5)

    文章目录 前言 一 准备安装包 二 安装cuda 1 选择一个临时解压目录 2 我选了精简 因为我看到 推荐 3 这个说没有合适版本的Visual Studio Integration 没有关系 勾一下 Next 4 设置环境变量 5 验证
  • Lombok详细教程及idea中lombok插件的安装

    一 背景 我们在开发过程中 通常都会定义大量的JavaBean 然后通过IDE去生成其属性的构造器 getter setter equals hashcode toString方法 当要对某个属性进行改变时 比如命名 类型等 都需要重新去生
  • Jeesite框架实用 查询当前用户拥有权限

    http 127 0 0 1 8980 js a authInfo
  • 微信小程序显示加空格

  • FreeRTOS通过消息队列实现串口命令解析(串口中断)

    作者 Jack G 时间 2023 08 08 版本 V1 0 上次修改时间 环境 quad quad quad
  • 查漏补缺 - ES6

    目录 1 let 和 const 1 会产生块级作用域 2 如何理解 const 定义的变量不可被修改 2 数组 3 对象 1 Object is 2 属性描述符 3 常用API 4 得到除某个属性之外的新对象 4 函数 1 箭头函数 2