const // 定义静态变量 --> 定义之后不允许修改
let // 定义局部变量 只有在局部作用域中才有作用,如{}、function、for循环(比较特殊)、while循环
// let const 好处:防止变量污染
var 定义变量,变量提升。
用const定义对象和数组,可以随意添加,不会报错。
ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
let str = "I love JS";
str.includes("I"); // --> true 字符串中是否包含该字符。
str.startsWith("I") // --> true 字符串是否以I开头
str.endsWith("JS")// --> true 字符串是否以JS结尾
str.repeat(3) // 字符串重复三次 返回新字符串
str.padStart(10,'0'); // 字符串的长度最少为两位,不够的话在字符串的前面加0 返回新字符串
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构
let [a,b,c]=[1,2,3];
a // 1
b // 2
c // 3
let [a,...b]=[1,2,[12,34]];
// ...b是前面声明过的变量之后、所有变量的集合,在之后声明的变量会报错,(同一个数组内)
// 报错如下
let [a,...b,c] = [1,2,3,4,5];
VM253:1 Uncaught SyntaxError: Rest element must be last element
// 如果两边不相等,左边的会被赋值undefined,如果有...都会赋给...后面的变量
let [x, , y] = [1, 2, 3];
x // 1
y // 3
let [head, ...tail] = [1, 2, 3, 4];
head // 1
tail // [2, 3, 4]
let [x, y, ...z] = ['a'];
x // "a"
y // undefined
z // []
如果解构不成功,变量的值就等于undefined。
4.1 不完全解构
即等号左边的模式,只匹配一部分的等号右边的数组。这种情况下,解构依然可以成功。
let [a, [b], d] = [1, [2, 3], 4];
a // 1
b // 2
d // 4
如果等号的右边不是数组(可以是字符串)(或者严格地说,不是可遍历的结构,参见《Iterator》一章),那么将会报错。
// 报错
let [foo] = 1;
let [foo] = false;
let [foo] = NaN;
let [foo] = undefined;
let [foo] = null;
let [foo] = {
};
解构赋值允许制定默认值。注意,ES6 内部使用严格相等运算符(===),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined,默认值才会生效。
null===undefined. // --> false
注意:
4.2 对象的解构赋值
对象的解构与数组有一个重要的不同:数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
let {
bar, foo } = {
foo: "aaa", bar: "bbb" };
如果变量名与属性名不一致,必须写成下面这样。
let {
foo: baz } = {
foo: 'aaa', bar: 'bbb' };
baz // "aaa"
对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。
let {
foo: baz } = {
foo: "aaa", bar: "bbb" };
baz // "aaa"
foo // error: foo is not defined
如果解构模式是嵌套的对象,而且子对象所在的父属性不存在,那么将会报错。
// 报错
let {
foo: {
bar}} = {
baz: 'baz'};
let num = 12;
Number.isNaN(num) // --> false
let str = "12";
Number.isNaN(str) // --> false
let na = NaN;
Number.isNaN(na) // --> true
// 此方法只能校验是否为NaN
let b = b=>{
}
箭头函数指向this是定义时候的上级,而不是调用时决定的。
find
let arr = [1,2,3];
// find方法 用于找出第一个符合条件的数组成员,并返回。参数为一个回调函数,所有数组成员依次执行该回调,直到找出第一个返回值为true的成员并返回,如果没有符合条件的成员则返回undefined.
arr.find(num=>num===1); // ->1
arr.find(num=>num>1); // ->2
findIndex
let arr = [1,2,3];
// findIndex方法的用法与find方法非常类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1。
arr.findIndex((value,index,arr)=>value>2); // ->2
// 与find方法的区别是,此方法返回的是下标,而find方法返回的是元素本身。
Array.from
console.log(Array.from('foo'));
// expected output: Array ["f", "o", "o"]
console.log(Array.from([1, 2, 3], x => x + x));
// expected output: Array [2, 4, 6]
// Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)。还可以接受第二个参数(一个函数),作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组。
Array.of
Array.of(12,34,32)//把括号内的参数转换为数组。
// 如果不传参数,返回空数组。
some
let arr = [1,2,3];
arr.some(item=>item>2); // 如果数组内有一个符合结果就返回true,
every
let arr = [1,2,3];
arr.every(item=>item>2); // 如果数组内都符合结果就返回true,
includes
let arr = [1,2,3];
arr.includes(2); // arr.includes方法返回一个布尔值,表示某个数组是否包含给定的值,
//该方法的第二个参数表示搜索的起始位置,默认为0。如果第二个参数为负数,则表示倒数的位置,
//如果这时它大于数组长度(比如第二个参数为-4,但数组长度为3),则会重置为从0开始。
Object.is(NaN,NaN) // ->true 返回值为布尔值,判断两个值是否全等
Object.is(undefined,null) // ->false
Object.is(null,null) // ->true
let nestedProp = obj&&obj.first&&obj.first.second; // 旧语法
let nestedProp = obj?.first?.second; // 新语法
let c = a !== undefined && a !== null ? a : b; // 旧语法
let c = a ?? b; // 新语法
const aBigInt = BigInt(1234324);
typeof aBigInt === 'bigint'; // true