# es6基础
# TDZ暂时性死域
暂时性死域(let/const的使用要求严格,如果先使用后声明赋值就会出现这种情况)
let const 新增块级作用域,而var作用域没有,比如以下的if语句。
if(true){
var a=10
}
console.log(a)//10
# 解构赋值
从数组和对象中提取值,对变量进行赋值。解构赋值让程序结构更清晰。
let [a,b,c]=[1,2,3];
# 默认值
let [a,b="JSPang"]=['技术胖']
console.log(a+b); //控制台显示“技术胖JSPang”
注意
undefined和null的区别
let [a,b="JSPang"]=['技术胖',undefined];
console.log(a+b); //控制台显示“技术胖JSPang”
undefined相当于什么都没有,b是默认值。
let [a,b="JSPang"]=['技术胖',null];
console.log(a+b); //控制台显示“技术胖null”
null相当于有值,但值为null。所以b并没有取默认值,而是解构成了null。
let [a, ...b] = [1, 2, 3];
//a = 1
//b = [2, 3]
对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
可以不完全解构
let {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40};
// a = 10
// b = 20
// rest = {c: 30, d: 40}
可给对象key重新命名
let {a = 10, b = 5} = {a: 3};
// a = 3; b = 5;
let {a: aa = 10, b: bb = 5} = {a: 3};
// aa = 3; bb = 5;
字符串也可以解构,这是因为,此时字符串被转换成了一个类似数组的对象。
const [a,b,c,d,e,f]="JSPang";
console.log(a);
console.log(b);
console.log(c);
console.log(d);
console.log(e);
console.log(f);
- 当解构null或者undefined时,会报错
let { length } = 'foobar';
console.log(length); // 6
let { constructor: c } = 4;
console.log(c === Number); // true
let { _ } = null; // TypeError
let { __ } = undefined; // TypeError
let [___] = null; // demo.html:19 Uncaught TypeError: null is not iterableat demo.html:19
# 数值Number
# Number 的属性和方法
| 属性或方法 | 功能描述 |
|---|---|
| EPSILON | 一个常量,表示 1 和大于 1 的最小值之间的差值:2^-52 |
| MAX_SAFE_INTEGER | 一个常量,表示 JavaScript 的安全整数的上限值:2^53 - 1 |
| MIN_SAFE_INTEGER | 一个常量,表示 JavaScript 的安全整数的下限值:-(2^53 - 1) |
| isFinite() | 判断一个数字是否为有限,如果参数是 NaN、Infinity、-Infinity 或非数字,都将返回 false |
| isNaN() | 判断一个值是否为 NaN,只有当参数是 NaN 时,才能返回 true |
| isInteger() | 判断一个数字是否为整数,注意,12 和 12.0 都被视为整数 |
| isSafeInteger() | 判断一个数字是否为安全整数 |
表中的安全整数是指处在 MIN_SAFE_INTEGER 和 MAX_SAFE_INTEGER 之间的整数。在全局对象中有两个全局函数也叫 isFinite()和 isNaN(),但它们会先将传入的参数转换成数字,再进行判断,而 Number 对象中的新方法却不会执行这步类型转换,因此新方法能得到更为准确的结果。下面会分别对新方法和全局函数传入相同的参数,从它们的结果可知,新方法得到了期望值,而全局函数并没有。
Number.isFinite(null); //false
isFinite(null); //true
Number.isNaN("abc"); //false
isNaN("abc"); //true
# 常量 Number.EPSILON
Number.EPSILON 属性表示 1 与大于 1 的最小浮点数之间的差。
0.1 + 0.2 === 0.3; // false
// 在误差范围内即视为相等
equal = (Math.abs(0.1 - 0.3 + 0.2) < Number.EPSILON); // true
# 安全整数
安全整数的范围在 2 的 -53 次方到 2 的 53 次方之间(不包括两个端点),超过这个范围的整数无法精确表示。
# 最大安全整数
安全整数范围的上限,即 2 的 53 次方减 1 。
Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2; // true
Number.MAX_SAFE_INTEGER === Number.MAX_SAFE_INTEGER + 1; // false
Number.MAX_SAFE_INTEGER - 1 === Number.MAX_SAFE_INTEGER - 2; // false
# 最小安全整数
安全整数范围的下限,即 2 的 53 次方减 1 的负数。
Number.MIN_SAFE_INTEGER + 1 === Number.MIN_SAFE_INTEGER + 2; // false
Number.MIN_SAFE_INTEGER === Number.MIN_SAFE_INTEGER - 1; // false
Number.MIN_SAFE_INTEGER - 1 === Number.MIN_SAFE_INTEGER - 2; // true
# 是否是整数 Number.isInteger
console.log(Number.isInteger(3.4))//false
console.log(Number.isInteger(34))//true
# Number.isFinite()
用于检查一个数值是否为有限的( finite ),即不是 Infinity
console.log( Number.isFinite(1)); // true
console.log( Number.isFinite(0.1)); // true
// NaN 不是有限的
console.log( Number.isFinite(NaN)); // false
console.log( Number.isFinite(Infinity)); // false
console.log( Number.isFinite(-Infinity)); // false
// Number.isFinate 没有隐式的 Number() 类型转换,所有非数值都返回 false
console.log( Number.isFinite('foo')); // false
console.log( Number.isFinite('15')); // false
console.log( Number.isFinite(true)); // false
let a =Number.MAX_INTEGER
let b=Number.MAX_VALUE
let c =Number.MAX_SAFE_INTEGER
console.log(isFinite(a))//false
console.log(isFinite(b))//true
console.log(isFinite(c))//true
console.log(b===c)//false
console.log(b>c)//true
console.log(a<b)//false
console.log(a>b)//false
# Math
ES6Math新增的方法
| 方法 | 功能描述 |
|---|---|
| sinh()和 | asinh() sinh()用于双曲正弦;asinh()用于反双曲正弦 |
| cosh()和 | acosh() cosh()用于双曲余弦;acosh()用于反双曲余弦 |
| tanh()和 | atanh() tanh()用于双曲正切;atanh()用于反双曲正切 |
| expm1() | 等价于 Math.exp(x) - 1,可计算 e^x - 1,其中 x 表示参数 |
| log2() | 返回以 2 为底的对数,如果参数小于 0,则返回 NaN |
| log10() | 返回以 10 为底的对数,如果参数小于 0,则返回 NaN |
| log1p() | 等价于 Math.log(x+1),返回一个数字加 1 后的自然对数,如果参数小于-1,则返回 NaN |
| hypot() | 先将所有参数的平方相加,再计算和的平方根 |
| cbrt() | 计算数字的立方根 |
| clz32() | 先将数字转换成 32 位无符号整数形式的二进制,再计算前导 0 的个数 |
| trunc() | 只取数字的整数部分 |
| imul() | 让两个数字的 32 位整数相乘 |
| fround() | 将数字转换为离它最近的单精度浮点数形式的数字 |
| sign() | 返回数字的符号,指明数字是正数、负数还是零 |
sign()方法有 5 种返回值,分别是 1、-1、0、-0 和 NaN,代表正数、负数、正零、负零和NaN,具体如下所示。
Math.sign(2); //1
Math.sign(-2); //-1
Math.sign(0); //0
Math.sign(-0); //-0
Math.sign(NaN); //NaN
# BigInt
BigInt数据类型的目的是比Number数据类型支持的范围更大的整数值,整数溢出将不再是问题。
不能使用严格相等运算符将BigInt与常规数字进行比较,因为它们的类型不同
除一元加号(+)运算符外,所有算术运算符都可用于BigInt
10n + 20n; // → 30n
10n - 20n; // → -10n
+10n; // → TypeError: Cannot convert a BigInt value to a number
-10n; // → -10n
10n * 20n; // → 200n
23n % 10n; // → 3n
10n ** 3n; // → 1000n
const x = 10n;
++x; // → 11n
不支持一元加号(+)运算符的原因是某些程序可能依赖于+始终生成Number的不变量,或者抛出异常。
# 箭头函数
箭头函数无prototype,arguments,super和new.target;不能进行实例化构造函数,没有this的强绑定。