开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
前言
近期在一些摸鱼群中发现了还是有好多童鞋不知道一些新的es6语法,所以我在这里进行一些记录方便童鞋们用来查阅
ECMAScript 6.0
介绍
ES6, 全称 ECMAScript 6.0 ,是 JavaScript 的下一个版本标准,2015.06 发版
反正就是一些新技术,能让我们代码写的飞起的新语法,所以还是有必要学一下的
新增语法
let, const, var
- let 声明变量,其作用域在代码块内,且不存在变量提升
- var 声明变量,其作用域在函数内,且存在变量提升
- const 声明常量,定义的常量不可再次修改,且在声明的时候就必须赋值
// 块级作用域
if (true) { let a = 10; }
console.log(a) // a is not defined
// 变量提升
console.log(a); // a is not defined
let a = 20;
// 利用let声明的变量会绑定在这个块级作用域,不会受外界的影响
var tmp = 123;
if (true) {
let tmp = 0;
console.log(tmp);// 0
}
console.log(tmp);// 123
拓展运算符
拓展运算符(…)用于取出参数对象所有可遍历属性然后拷贝到当前对象。
let person = {name: "jack", age: 15};
let someone = { ...person };
someone; //{name: "jack", age: 15}
自定义的属性和拓展运算符对象里面属性的相同的时候:自定义的属性在拓展运算符后面,则拓展运算符对象内部同名的属性将被覆盖掉
解构赋值
- 解构赋值就是把数据结构分解,然后给变量进行赋值
- 如果解构不成功,变量跟数值个数不匹配的时候,变量的值为undefined
- 数组解构用中括号包裹,多个变量用逗号隔开,对象解构用花括号包裹,多个变量用逗号隔开
- 利用解构赋值能够让我们方便的去取对象中的属性跟方法
数组
// 常见解构赋值
let [a, b, c] = [1, 2, 3];
// a = 1
// b = 2
// c = 3
// 嵌套用法
let [a, [[b], c]] = [1, [[2], 3]];
// a = 1
// b = 2
// c = 3
// 可忽略用法
let [a, , b] = [1, 2, 3];
// a = 1
// b = 3
// 不完全解构用法
let [a = 1, b] = [];
// a = 1,
// b = undefined
// 展开运算符用法
let [a, ...b] = [1, 2, 3];
// a = 1,
// b = [2,3]
对象
// 常见解构赋值
let {name,age} = {name:'jack',age:18};
// name=jack
// age=18
let {name:newName} = {name:'jack'};
// newName=jack
// 嵌套用法
let obj = {p: ['hello', {y: 'world'}] };
let {p: [x, { y }] } = obj;
// x = 'hello'
// y = 'world'
// 展开运算符用法
let {name,...other} = {name:'jack',age:18,sex:'男'}
// name = jack
// other = {age:18,sex:'男'}
提供默认值写法
只需要在赋值前加等号赋值即可,如果解构对象里面没有则用默认值
let [a,b,c=3] = [1,2]
// a = 1
// b = 2
// c = 3
let {name='rose',age} = {age:19}
// name = rose
// age = 19
set
常用去重
let mySet = new Set([1, 2, 2, 3, 4, 4]);
[...mySet]; // [1, 2, 3, 4]
Symbol
ES6 引入了一种新的原始数据类型 Symbol ,表示独一无二的值,最大的用法是用来定义对象的唯一属性名。
ES6 数据类型除了 Number 、 String 、 Boolean 、 Object、 Null 和 Undefined ,还新增了 Symbol 。
let name = Symbol("KK");
console.log(name); // Symbol(KK)
typeof(name); // "symbol"
// 相同参数 Symbol() 返回的值不相等
let name1 = Symbol("kk");
name === name1; // false
每一个Symbol的值都是不相等的,所以当业务需要有重名是时候可以合理使用Symbol
Proxy
Proxy 可以对目标对象的读取、函数调用等操作进行拦截,然后进行操作处理。它不直接操作对象,而是像代理模式,通过对象的代理对象进行操作,在进行这些操作时,可以添加一些需要的额外操作
let target = {
name: 'jack',
age: 24
}
let handler = {
get: function(target, key) {
console.log('getting '+key);
return target[key]; // 不是target.key
},
set: function(target, key, value) {
console.log('setting '+ key);
target[key] = value;
}
}
let proxy = new Proxy(target, handler)
proxy.name // 实际执行 handler.get
proxy.age = 25 // 实际执行 handler.set
一般我们了解的就是vue3内部proxy的代理方法,vue源码对数据跟踪处理就是利用的这个
字符串方法
includes, startsWith, endsWith, repeat, padStart ,padEnd
- includes():返回布尔值,判断是否找到参数字符串。
- startsWith():返回布尔值,判断参数字符串是否在原字符串的头部。
- endsWith():返回布尔值,判断参数字符串是否在原字符串的尾部。
- repeat():返回新的字符串,表示将字符串重复指定次数返回。
- padStart:返回新的字符串,表示用参数字符串从头部(左侧)补全原字符串。
- padEnd:返回新的字符串,表示用参数字符串从尾部(右侧)补全原字符串。
let string = "apple,banana,orange";
string.includes("banana"); // true
string.startsWith("apple"); // true
string.endsWith("apple"); // false
// 上面三个方法都可以接受两个参数,需要搜索的字符串,和可选的搜索起始位置索引
string.startsWith("banana",6) // true
console.log("Hello".repeat(2)); // "HelloHello,"
console.log("h".padStart(5,"o")); // "ooooh"
console.log("h".padEnd(5,"o")); // "hoooo"
console.log("h".padStart(5)); // " h"
// 以上两个方法接受两个参数,第一个参数是指定生成的字符串的最小长度,第二个参数是用来补全的字符串。如果没有指定第二个参数,默认用空格填充。
模板字符串
在模板字符串内可以使用变量,通过$符号加{},在大括号内加入变量名,并且还能加入表达式
let name = 'jack'
console.log(`我的名字叫${name}`) // 我的名字叫jack
console.log(`我的名字叫${name}今年${10+2}岁`) // 我的名字叫jack今年12岁
数值表达式
二进制表示法新写法: 前缀 0b 或 0B,八进制表示法新写法: 前缀 0o 或 0O
console.log(0b11 === 3); // true
console.log(0B11 === 3); // true
console.log(0o11 === 9); // true
console.log(0O11 === 9); // true
Number的isFinite方法
用于检查一个数值是否为有限的( finite ),即不是 Infinity
console.log( Number.isFinite(1)); // true
console.log( Number.isFinite(0.1)); // true
console.log( Number.isFinite(NaN)); // false
console.log( Number.isFinite(Infinity)); // false
console.log( Number.isFinite(-Infinity)); // false
// 非数字全部返回false
console.log( Number.isFinite('foo')); // false
console.log( Number.isFinite('15')); // false
console.log( Number.isFinite(true)); // false
指数运算符
1 ** 2; // 1 相当于1的2次方
// 右结合,从右至左计算
2 ** 2 ** 3; // 256 相当于 先计算2的三次方,在算2的(2的三次方),相当于2的八次方
属性名表达式
ES6允许用表达式作为属性名,但是一定要将表达式放在方括号内。
const obj = {
["he"+"llo"](){
return "Hi";
}
}
obj.hello(); //"Hi"
Object.assign
用于将源对象的所有可枚举属性复制到目标对象中
let target = {a: 1};
let object2 = {b: 2};
let object3 = {c: 3};
Object.assign(target,object2,object3);
// 第一个参数是目标对象,后面的参数是源对象
target; // {a: 1, b: 2, c: 3}
// 如果目标对象和源对象有同名属性,或者多个源对象有同名属性,则后面的属性会覆盖前面的属性。
// 如果该函数只有一个参数,当参数为对象时,直接返回该对象;当参数不是对象时,会先将参数转为对象然后返回
Object.assign(3);
typeof Object.assign(3); // "object"
// null 和 undefined 不能转化为对象,会报错
Object.assign(null); // TypeError: Cannot convert undefined or null to object
Object.assign(undefined); // TypeError: Cannot convert undefined or null to object
//当参数不止一个时,null 和 undefined 不放第一个,即不为目标对象时,会跳过 null 和 undefined ,不报错
Object.assign(1,undefined); // Number {1}
Object.assign({a: 1},null); // {a: 1}
assign 的属性拷贝是浅拷贝,当后面有相同属性名时后面会覆盖前面的
数组创建
- Array.of()将参数中所有值作为元素形成数组
- Array.from()将类数组对象或可迭代对象转化为数组
// 参数值可为不同类型
console.log(Array.of(1, '2', true)); // [1, '2', true]
// 参数为空时返回空数组
console.log(Array.of()); // []
// 参数为数组,返回与原数组一样的数组
console.log(Array.from([1, 2])); // [1, 2]
// 参数含空位
console.log(Array.from([1, , 3])); // [1, undefined, 3]
结尾
还有部分常见的在这里没写上,但是有些不常见的这里已经整理上去了。欢迎大家给予评论以及其它我未收集的新方法