ES6--ES12笔记整理(1)
一、let const
五个共同特点
- 不允许重复声明
- 块级作用域
- 不存在变量提升
- 不影响作用域链
- 暂时性死区---在代码块内,使用let/const命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”
const 特殊性
- 声明必须赋初始值;
- 标识符一般为大写(习惯);
- 值不允许修改;
- 指向的那个内存地址所保存的数据不得改动。
- 对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。
- 对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。
二、解构赋值
允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构
- 数组的解构赋值
- 对象的解构赋值
- 字符串的解构赋值
- 数值和布尔值的解构赋值
- 函数参数的解构赋值
1、数组的解构赋值
数组的元素是按次序排列的,变量的取值由它的位置决定
let [a, b, c] = [1, 2, 3];
let arr = [1, 2, 3];
let {0 : first, [arr.length - 1] : last} = arr;
first // 1
last // 3
默认值
let [x, y = 'b'] = ['a']; // x='a', y='b'
let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'
2、对象的解构赋值
对象的属性没有次序,变量必须与属性同名,才能取到正确的值
let { bar, foo } = { foo: 'aaa', bar: 'bbb' };
foo // "aaa"
let { baz } = { foo: 'aaa', bar: 'bbb' };
baz // undefined
let { first: f, last: l } = { first: 'hello', last: 'world' }
f // 'hello'
l // 'world
const node = {
loc: {
start: {
line: 1,
column: 5
}
}
};
let { loc, loc: { start }, loc: { start: { line }} } = node;
line // 1
loc // Object {start: Object}
start // Object {line: 1, column: 5}
默认值
var {x, y = 5} = {x: 1};
x // 1
y // 5
注意
(1)如果要将一个已经声明的变量用于解构赋值,必须非常小心。
// 错误的写法
let x;
{x} = {x: 1};
// SyntaxError: syntax error
// 正确的写法
let x;
({x} = {x: 1});
3、字符串的解构赋值
- 字符串也可以解构赋值。这是因为此时,字符串被转换成了一个类似数组的对象。
- 类似数组的对象都有一个length属性,因此还可以对这个属性解构赋值。
const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
let {length : len} = 'hello';
len // 5
4、数值和布尔值的解构赋值
解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。
let {toString: s} = 123;
s === Number.prototype.toString // true
let {toString: s} = true;
s === Boolean.prototype.toString // true
5、函数参数的解构赋值
三、字符串扩展
序号 | 写法 | 解释 |
---|---|---|
1 | Unicode 表示法 | 允许采用\uxxxx形式表示一个字符 |
2 | for of 遍历 | 类似于for in ,可以便利原型链上的内容 |
3 | 字符串 |
模板字符串:可换行,${}传参 |
4 | String.fromCodePoint()、ES5 fromCardCode | 从 Unicode 码点返回对应字符 |
5 | String.raw() | 返回一个斜杠都被转义(即斜杠前面再加一个斜杠)的字符串 |
6 | 实例方法:codePointAt()、ES5 cardCodeAt() | 字符转code码 |
7 | 实例方法:at(index) | 查看指定位置的字符 |
8 | 实例方法:includes(), startsWith(), endsWith() | 匹配是否存在 |
9 | 实例方法:repeat() | 将原字符串重复n次 |
10 | 实例方法:padStart(),padEnd() | 补全 |
11 | 实例方法:trimStart(),trimEnd() | 消除空格 |
12 | 实例方法:replaceAll() | 替换所有匹配的内容 |
1、Unicode 表示法
- 允许采用\uxxxx形式表示一个字符
- 限于码点在\u0000~\uFFFF之间的字符
"\u{20BB7}"
// ""
- JavaScript 共有 6 种方法可以表示一个字符
'\z' === 'z' // true
'\172' === 'z' // true
'\x7A' === 'z' // true
'\u007A' === 'z' // true
'\u{7A}' === 'z' // true
2、for of 遍历
for (let codePoint of 'foo') {
console.log(codePoint)
}
// "f"
// "o"
// "o"
可以识别大于0xFFFF的码点
let text = String.fromCodePoint(0x20BB7);
for (let i = 0; i < text.length; i++) {
console.log(text[i]);
}
// " "
// " "
for (let i of text) {
console.log(i);
}
// ""
3、模板字符串
let msg = `Hello, ${place}`;
4、String.fromCodePoint()
从 Unicode 码点返回对应字符
String.fromCodePoint(0x20BB7)
ES5 提供String.fromCharCode()方法
不能识别码点大于0xFFFF的字符。
String.fromCharCode(0x20BB7)
5、String.raw()
用来充当模板字符串的处理函数
返回一个斜杠都被转义(即斜杠前面再加一个斜杠)的字符串,往往用于模板字符串的处理方法
let message1 = `Multiline\nstring`,
console.log(message1); // "Multiline
message2 = String.raw`Multiline\nstring`;
console.log(message2); // "Multiline\\nstring
如果原字符串的斜杠已经转义,那么String.raw()不会做任何处理
String.raw`Hi\\n`
// "Hi\\n"
实现方式
String.raw = function (strings, ...values) {
let output = "";
let index;
for (index = 0; index < values.length; index++) {
output += strings.raw[index] + values[index];
}
output += strings.raw[index]
return output;
}
String.raw方法也可以作为正常的函数使用。这时,它的第一个参数,应该是一个具有raw属性的对象,且raw属性的值应该是一个数组
console.log(String.raw({ raw: 'test' }, 0, 1, 2))// 't0e1s2t'
// 等同于
console.log(String.raw({ raw: ['t', 'e', 's', 't'] }, 0, 1, 2))
6、includes(), startsWith(), endsWith()
- includes():返回布尔值,表示是否找到了参数字符串。
- startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。
- endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部。
let s = 'Hello world!';
s.startsWith('Hello') // true
s.endsWith('!') // true
s.includes('o') // true
let arr = [1, 2, 3, ]
arr.includes(1) //true
注意:
- 只针对字符串,数值类型不好用
- 支持第二个参数,表示开始搜索的位置
let s = 'Hello world!';
s.startsWith('world', 6) // true
s.endsWith('Hello', 5) // true
s.includes('Hello', 6) // false
7、repeat()
将原字符串重复n次。
'x'.repeat(3) // "xxx"
'hello'.repeat(2) // "hellohello"
'na'.repeat(0) // ""
注意:
- 参数如果是小数,会被取整。
'na'.repeat(2.9) // "nana"
- 0 到-1 之间的小数,则等同于 0
- 参数是负数或者Infinity,会报错
- repeat的参数是字符串,则会先转换成数字
'na'.repeat('na') // ""
'na'.repeat('3') // "nanana"
8、ES7--padStart(),padEnd()
字符串补全长度的功能
字符串不够指定长度,会在头部或尾部补全
padStart():用于头部补全
padEnd():用于尾部补全。
'x'.padStart(5, 'ab') // 'ababx'
'x'.padStart(4, 'ab') // 'abax'
'x'.padEnd(5, 'ab') // 'xabab'
'x'.padEnd(4, 'ab') // 'xaba'
参数1:字符串补全生效的最大长度,
参数2:是用来补全的字符串
注意
- 等于或大于最大长度,则字符串补全不生效,返回原字符串
'xxx'.padStart(2, 'ab') // 'xxx'
- 补全的字符串与原字符串,两者的长度之和超过了最大长度,则会截去超出位数的补全字符串
'abc'.padStart(10, '0123456789')// '0123456abc'
- 省略第二个参数,默认使用空格补全长度
'x'.padStart(4) // ' x'
9、ES9--trimStart(),trimEnd()
与trim()一致消除空格,
trimStart()消除字符串头部的空格,
trimEnd()消除尾部的空格
10、replaceAll()
替换所有匹配的字符
'aabbcc'.replace('b', '_')
// 'aa_bcc'
'aabbcc'.replace(/b/g, '_')
// 'aa__cc'
'aabbcc'.replaceAll('b', '_')
// 'aa__cc'
11、at()
参数指定位置的字符
支持负索引(即倒数的位置)
const str = 'hello';
str.at[1] // "e"
str.at[-1] // "o"
四、数值扩展
序号 | 写法 | 解释 |
---|---|---|
1 | 0b(或0B)和0o(或0O) | 二进制和八进制表示法 |
2 | 1_000_000_000_000 | 数值分隔符 |
3 | Number.isFinite(), Number.isNaN() | 无穷,非数值类型 |
4 | Number.parseInt(), Number.parseFloat() | 整数,小数 |
5 | Number.isInteger() | 判断一个数值是否为整数。 |
6 | Math | 对象的扩展 |
7 | BigInt | 更长的数据类型 |
1、二进制和八进制表示法
二进制:前缀0b(或0B)
八进制:前缀0o(或0O)
0b111110111 === 503 // true
0o767 === 503 // true
Number('0b111') // 7
Number('0o10') // 8
2、 Number.isFinite(), Number.isNaN()
Number.isFinite()用来检查一个数值是否为有限的(finite),即不是Infinity
参数类型不是数值,Number.isFinite一律返回false
Number.isFinite(15); // true
Number.isFinite(0.8); // true
Number.isFinite(NaN); // false
Number.isFinite(Infinity); // false
Number.isFinite(-Infinity); // false
Number.isFinite('foo'); // false
Number.isFinite('15'); // false
Number.isFinite(true); // false
Number.isNaN()用来检查一个值是否为NaN
isFinite(25) // true
isFinite("25") // true
Number.isFinite(25) // true
Number.isFinite("25") // false
isNaN(NaN) // true
isNaN("NaN") // true
Number.isNaN(NaN) // true
Number.isNaN("NaN") // false
Number.isNaN(1) // false
3、 Number.isInteger()
判断一个数值是否为整数。
Number.isInteger(25) // true
Number.isInteger(25.1) // false
Number.isInteger(25.0) // true
Number.isInteger(null) // false
Number.isInteger('15') // false
Number.isInteger(true) // false
4、Math 对象的扩展
写法 | 功能 |
---|---|
Math.trunc() | 去除一个数的小数部分,返回整数部分 |
Math.sign() | 判断一个数到底是正数+1、负数-1、还是零0 |
Math.cbrt() | 计算一个数的立方根 |
Math.hypot(,) | 返回所有参数的平方和的平方根 |
Math.sinh(x) | 返回x的双曲正弦(hyperbolic sine) |
Math.cosh(x) | 返回x的双曲余弦(hyperbolic cosine) |
Math.tanh(x) | 返回x的双曲正切(hyperbolic tangent) |
Math.asinh(x) | 返回x的反双曲正弦(inverse hyperbolic sine) |
Math.acosh(x) | 返回x的反双曲余弦(inverse hyperbolic cosine) |
Math.atanh(x) | 返回x的反双曲正切(inverse hyperbolic tangent) |
5、 BigInt 数据类型
ES2020 引入了一种新的数据类型 BigInt(大整数),来解决这个问题,这是 ECMAScript 的第八种数据类型。BigInt 只用来表示整数,没有位数的限制,任何位数的整数都可以精确表示。
1234 // 普通整数
1234n // BigInt
// BigInt 的运算
1n + 2n // 3n
typeof 123n // 'bigint'
BigInt(123) // 123n
BigInt('123') // 123n
BigInt(false) // 0n
BigInt(true) // 1n
ES6--ES12笔记整理(1)的更多相关文章
- ES6 学习笔记(整理一遍阮一峰大神得入门文档,纯自己理解使用)
1.let命令 1)let和var的区别:let声明的变量只有所在的代码块有效. 2)没有变量的提升,一定要声明后使用.使用let命令声明变量之前,该变量都是不可用的.形成“暂时性死区”. 3)typ ...
- ES6读书笔记(三)
前言 前段时间整理了ES6的读书笔记:<ES6读书笔记(一)>,<ES6读书笔记(二)>,现在为第三篇,本篇内容包括: 一.Promise 二.Iterator和for of循 ...
- ES6读书笔记(二)
前言 前段时间整理了ES6的读书笔记:<ES6读书笔记(一)>,现在为第二篇,本篇内容包括: 一.数组扩展 二.对象扩展 三.函数扩展 四.Set和Map数据结构 五.Reflect 本文 ...
- JS第一周学习笔记整理
目录 JS正式课第一周笔记整理 JS正式课第一周笔记整理 webstorm : 代码编辑器 浏览器: 代码解析器: Git : 是一个工具;用于团队协作开发项目管理代码的工具:在工作中用git.svn ...
- ES6入门笔记
ES6入门笔记 02 Let&Const.md 增加了块级作用域. 常量 避免了变量提升 03 变量的解构赋值.md var [a, b, c] = [1, 2, 3]; var [[a,d] ...
- python学习笔记整理——字典
python学习笔记整理 数据结构--字典 无序的 {键:值} 对集合 用于查询的方法 len(d) Return the number of items in the dictionary d. 返 ...
- 从0开始学Swift笔记整理(五)
这是跟在上一篇博文后续内容: --Core Foundation框架 Core Foundation框架是苹果公司提供一套概念来源于Foundation框架,编程接口面向C语言风格的API.虽然在Sw ...
- Deep Learning(深度学习)学习笔记整理系列之(五)
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
- 学习ReactNative笔记整理一___JavaScript基础
学习ReactNative笔记整理一___JavaScript基础 ★★★笔记时间- 2017-1-9 ★★★ 前言: 现在跨平台是一个趋势,这样可以减少开发和维护的成本.第一次看是看的ReactNa ...
- Deep Learning(深度学习)学习笔记整理系列之(八)
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
随机推荐
- Java程序的执行过程
Java程序的执行过程 编译器将 Java 源代码编译成字节码class文件 类加载到 JVM 里面后,执行引擎把字节码转为可执行代码 执行的过程,再把可执行代码转为机器码,由底层的操作系统完成执行
- 从零入门 Serverless | Serverless Kubernetes 应用部署及扩缩容
作者 | 邓青琳(轻零) 阿里云技术专家 导读:本文分为三个部分,首先给大家演示 Serverless Kubernetes 集群的创建和业务应用的部署,其次介绍 Serverless Kuberne ...
- 初探区块链数字加密资产标准ERC721
ERC721介绍 数字加密货币大致可以分为原生币(coin)和代币(token)两大类.前者如BTC.ETH等,拥有自己的区块链.后者如Tether.TRON.ONT等,依附于现有的区块链.市场上流通 ...
- C# 三种方式实现Socket数据接收(经典)
Stream.Read 方法 当在派生类中重写时,从当前流读取字节序列,并将此流中的位置提升读取的字节数. 语法: public abstract int Read(byte[] buffer, in ...
- Linux 命令后&的作用
cp $filename /dev/ & & 代表非阻塞方式拷贝文件,如果不加& 则必须等到执行完该指令后才能执行后来的指令.
- /usr/bin/python^M: bad interpreter: No such file or directory
利用如下命令查看文件格式 :set ff 或 :set fileformat 可以看到如下信息 fileformat=dos 或 fileformat=unix 利用如下命令修改文件格式 :set f ...
- 【UE4 设计模式】简单工厂模式 Simple Factory Pattern
概述 描述 又称为静态工厂方法 一般使用静态方法,根据参数的不同创建不同类的实例 套路 创建抽象产品类 : 创建具体产品类,继承抽象产品类: 创建工厂类,通过静态方法根据传入不同参数从而创建不同具体产 ...
- BUAA-软件工程-个人总结与心得
提问回顾以及个人总结 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 提问回顾与个人总结 我在这个课程的目标是 学习软件开发的过程,团队之间的写作 ...
- pwn200,一道不完全考察ret2libc的小小pwn题
pwn200 ---XDCTF-2015 每日一pwn,今天又做了一个pwn,那个pwn呢???攻防世界的进阶区里的一道小pwn题,虽然这个题考察的知识不多,rop链也比较好构建,但是还是让我又学到了 ...
- Zabbix 5.0:监控阿里云RDS
Blog:博客园 个人 由于近期压测,需要频繁登录阿里云查看RDS监控,每次登录查看监控步骤较为繁琐,故将监控接入到zabbix. 概述 由于阿里云已做了RDS的监控,我们只需要通过阿里云SDK把这些 ...