# 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的强绑定。

最后更新: 11/21/2024, 2:37:03 PM