es6中的变量 解构 对象 数组 函数
文章目录
- 一.变量/常量声明
- 二.解构
- 2.1.数组解构
- 2.2对象解构
- 3.3.字符串解构
- 4.数值解构
- 5.布尔值解构
- 三.对象
- 3.1.对象简写
- 3.2API拓展
- 四.扩展运算符
- 五.数组
- 5.1API拓展
- 六.函数
- 6.1函数参数
- 6.2.箭头函数
- 6.3 函数参数解构
- 七.Set
- 1)特性:
- 2)API
- 3)set应用
- 八.Map
- 1)特点:
- 2)API
一.变量/常量声明
1.let 用于声明一个变量
1 变量不会提升,即在变量声明之前无法使用该变量2.不可以重复声明3.具有块级作用域,只在当前作用域有效4.可以不用设置初始值
2.const 用于声明一个常量
1.变量声明不会被提升,即在变量声明之前无法使用该变量
2.不允许重复声明。
3.具有局部作用域,即const声明的变量只能在对应代码块中使用
4.const声明的变量在声明的时候就需要赋值,并且只能赋值一次,不能修改。
块级作用域 | 变量提升 | 给全局添加属性 | 能否重复声明 | 初始值设置 | 指针指向 | |
---|---|---|---|---|---|---|
var | 不存在 | 存在 | √ | √ | × | |
let | 存在 | 不存在 | × | × | × | √(可以重新赋值) |
const | 存在 | 不存在 | × | × | √ | × |
原文链接:https://blog.csdn.net/qq_42033567/article/details/107162586
二.解构
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构
,解构的本质属于“模式匹配
”.
只要等号两边的模式相同,左边的变量就会被赋予对应的值。
如果解构不成功,变量的值就等于undefined。
2.1.数组解构
等号左边的变量放到中括号内部,匹配右侧数组中的元素。
1.let [a,b,c]=[1,2,3];console.log(a,b);//1 2
2.let [a,b,c,d,e]=[1,2,3,[4,5],6];console.log(a,b,c,d,e);//1 2 3 [ 4, 5 ] 6
3.不完全解构
let [a,b,c,[d],e]=[1,2,3,[4,5,6],7];
console.log(a,b,c,d,e);
//1 2 3 4 7
4.集合解构 …扩展运算符
let [a,...b]=[1,2,3,4,5];console.log(a,b);
5.默认值解构(当匹配值严格等于undefined时,默认值生效)
let [a=1,b=2,c=3]=[4,5,6];
console.log(a,b,c);
//4 5 6
let [a=1,b=2,c=3]=[];
console.log(a,b,c)
//1 2 3
6.默认值也可以是函数
function test(){console.log('hello')}
let [a=test()]=[1];
console.log(a);
//1
function test(){console.log('hello')}
let [a=test()]=[];
console.log(a);
//hello
//undefined
let arr=[1,2,3,4];
let [...a]=arr;
console.log(a===arr);
//false
2.2对象解构
等号左边的变量放到大括号内部,匹配右侧对象中的元素。对象的属性没有次序,变量必须与属性同名,才能取到正确的值
1.
let {foo,bar}={foo:'hello',bar:"world"};
console.log(foo,bar);
//hello world
2.如果变量名和属性名不一致,需要重命名
let {foo:baz}={foo:"hello",bar:"world"};
console.log(baz);
// hello
3.对象的解构赋值是下面形式的简写 前面属性名后边变量名
let {foo:foo,bar:bar}={foo:'hello',bar:"world"};
4.嵌套结构
let obj={p:['hello',{y:"world"}]};let {p:[a,{y:b}]}=obj;console.log(a,b);//hello world
5.默认值结构
let {x:y=3}={};
console.log(y);
//3
典型题:
const [a, b, c, ...d] = [1, 2, 3, 11, 999];
//1 2 3 [11,999]
const { e, f,f1, g, ...h } = { f: 4, g: 5, i: 6, j: 7 };
//undefined 4 undefined 5 {i:6,j:7}
console.log(a, b, c, d, e, f1, g, h);
//1 2 3 [11,999] undefined undefined 5 {i:6,j:7}
3.3.字符串解构
1.可以使用对象解构或者是数组解构,使用数组结构可以获取指定字符;使用对象结构可以获取实例属性方法;
let [a,b,c]='hello';
console.log(a,b,c);
//h e l
2.也可以将string字符串转换为数组
let [...arr]='hello';
console.log(arr)
//[ 'h', 'e', 'l', 'l', 'o' ]
3.使用对象解构
let {toString,valueOf,length}='hello';
//相当于把‘hello’当成String基本包装器类型
console.log(toString,valueOf,length)
//[Function: toString] [Function: valueOf] 5
4.数值解构
可以获取到数值包装器构造函数原型中指定的方法。
let {toString,valueOf}=10;
console.log(toString,valueOf)
//[Function: toString] [Function: valueOf]
5.布尔值解构
let {toString,valueOf}=true;
console.log(toString,valueOf)
//[Function: toString] [Function: valueOf]
三.对象
ES6中对于Object的拓展主要是静态方法的拓展。
3.1.对象简写
ES6中规定可以直接在对象中写入变量和函数作为对象的属性和方法,此时属性名为变量名, 属性值为变量的值。对象简写在未来的使用频率极其高。
let name='larry';
let age=12;
let obj={name,age,//es5 sayName:function(){}// sayName(){// console.log(this.name) --按照这种形式写this依然指向调用者// },// sayName:()=>{// console.log(this)// }sayName(){//this-->objreturn ()=>{console.log(this)}}
}
obj.sayName()();
let name='larry';let age=12;let sayName=()=>{console.log(this)}let obj={name,age,//es5 sayName:function(){}// sayName(){// console.log(this.name)// },// sayName:()=>{// console.log(this)// }sayName(){return sayName}}// obj.sayName()()//箭头函数没有自己的this,内部this指向声明箭头函数时外部作用域中的this。obj.sayName()()
3.2API拓展
Object.is(a,b) 判断a,b两个值是否一样,类似于===
Object.assign() 深复制或者合并对象
Object.assign(obj1, obj2) 深复制,将obj2复制给obj1
Object.assign(obj1, obj2, obj3) 对象合并,将obj1、obj2合并后复制给obj1
Object.setPrototypeOf(obj1, obj2) 为目标对象设置原型,将obj2设置成obj1的原型
Object.getPrototypeOf() 获取目标对象的原型
Object.keys() 返回对象属性名组成的数组
Object.values() 返回对象属性值组成的数组
Object.entries() 返回对象[属性名, 属性值]组成的二维数组
四.扩展运算符
使用拓展运算符可以解构数组和对象,并返回解构后的新数组或者新对象
...用在=左边,聚合的作用(对象、数组的解构
...用在=右边,展开(剥离)的作用
let obj1 = {name: '张三'}
let obj2 = {...obj1,age: 12}
console.log(obj2)
//{ name: '张三', age: 12 }
function log(x, y = 'World',d) { console.log(x, y);}// log(1,2)console.log(log.length)//1
五.数组
5.1API拓展
Array.from() 将其他类型数据转成数组
Array.of() 创建数组实例,实参就是数组的元素
Array.prototype.find() 返回满足条件的第一个元素,参数为函数
Array.prototype.findIndex() 返回满足条件的第一个元素的索引,参数为函数
Array.prototype.includes() 判断当前数组中是否包含某个元素,参数为元素,返回true/false
Array.prototype.fill() 填充数组(所有元素填充),修改数组原值
Array.prototype.keys() 返回索引的迭代器对象
Array.prototype.values() 返回元素的迭代器对象
Array.prototype.entries() 返回键值对的迭代器对象
let arr=[1,2,3,2,3];let result=arr.find((item)=>{return item>2})console.log(result)
let arr = [2, 3, 4, 5, 6, 2];
let keys=arr.keys();
let values = arr.values();
let entries = arr.entries();
console.log(keys, values, entries);
六.函数
6.1函数参数
ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面。通常情况下,定义了默认值的参数,应该是函数的尾参数
,函数的length属性,将返回没有指定默认值的参数个数。
let myFun1=function(a,b,c=10,d){console.log(a,b,c,d); //null,1,10,undefined
}
myFun1(null,1);
console.log(myFun1.length); //2;长度只计算默认值前面的
6.2.箭头函数
ES6允许使用箭头(=>)定义函数
let myFun=()=>{}
等价于let myFun=function(){}
特点:
1.箭头函数的this是静态的,this始终指向函数声明时所在作用域下的this的值(即继承上一层的this)
2.不能作为构造函数实例化对象
3.不能使用arguments
4.只有一个形参,()可以省略;函数体只有一条语句,{}可以省略
let obj={name:'zs',sayHello:()=>{console.log(this.name); //undefined},sayName(){return ()=>{console.log(this.name); //zs}}
}
obj.sayHello();
obj.sayName()();
es5函数内部属性有this和arguments,箭头函数内arguments不再保存实参,如果想接受实参,可以使用rest参数
let test=(a,...b)=>{//console.log(this,arguments);console.log(a,b);//a--1 b--[2,3,4,5]}
test(1,2,3,4,5)
//1 [ 2, 3, 4, 5 ]
箭头函数this指向
普通函数:this指向调用者,没有调用者指向global
箭头函数:没有自己的this,this指向’声明时’外部作用域的this
箭头函数写法
极简写法(形参只有一个时,可省略括号,只有一句返回语句时,箭头后面可直接写表达式)
let result = arr.filter(item => item > 5)
箭头函数完整写法=>
let result = arr.filter((item) => {retrun item > 5})
ES5写法=>let result = arr.filter(function(item) {retrun item > 5})
箭头函数比较适用this无关的回调(定时器),数组的方法回调
不适合与this有关的回调(DOM事件回调),对象的方法
6.3 函数参数解构
…用在形参位置,叫做 rest 参数,用于获取函数实参,代替arguments,rest参数必须放在参数的最后
arguments—是一个对象,rest—是一个数组
function test(a,...b){console.log(a,b);
}
test(1,2,3,4,5,6);
//1 [ 2, 3, 4, 5, 6 ]
1.函数参数对象解构
function test({name,age,...a}){
//...a解构剩余对象中的属性并返回一个新对象
//...用在函数形参位置,叫做rest参数,也叫拓展运算符的逆运算console.log(name,age,a);
}
test({name:"zhangsan",age:12,gender:1});
//zhangsan 12 { gender: 1 }
2.函数参数对象默认值解构
function test({name,age=1,...a}){console.log(name,age,a);
}
test({name:"zhangsan",gender:1});
//zhangsan 1 { gender: 1 }
3.函数参数数组解构
function test([a,b,c]){console.log(a,b,c);
}
test([,2,3]);
//undefined 2 3
七.Set
Set类似于数组,但是成员的值都是唯一的,没有重复的值。Set 本身是一个构造函数,用来生成 Set 数据结构展。
Set 构造函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化var set = new Set();
类似于数组,key和value是相同
1)特性:
不允许重复值出现
2)API
Set.prototype.size 返回Set实例的成员总数。
Set.prototype.add(value) 添加某个值,返回Set结构本身
Set.prototype.delete(value) 删除某个值,返回一个布尔值,表示删除是否成功。
Set.prototype.has(value) 返回一个布尔值,表示该值是否为Set的成员。
Set.prototype.clear() 清除所有成员,没有返回值。
Set.prototype.keys() 返回键名的遍历器
Set.prototype.values() 返回键值的遍历器
Set.prototype.entries() 返回键值对的遍历器
Set.prototype.forEach() 使用回调函数遍历每个成员
let arr=[1,2,3,4,5,5,4,6,7,7,'hello']
let set=new Set(arr)console.log(set.delete(1));
let arr = [1, 2, 3, 4, 4, 5, 3, 2, 1, 7]
let set = new Set(arr)
set.forEach((value) => {console.log(value);
})
3)set应用
set构造函数可以接受数组或者其他可遍历的数据结构
//1.数组去重
let arr=[1,2,3,5,3,2];
let result=new Set(arr);
console.log(result);
//2.将字符串转换为数组
let [...arr1]='hello';
console.log(arr1);
//3.将set集合转换为数组
let arr=[1,2,3,5,3,2];
let result=new Set(arr);
let [...arr2]=result;
console.log(arr2);
或者
console.log([...new Set(arr)])
或者
console.log(Array.from(result));
八.Map
Map类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。Map 可以接受一个数组作为参数。该数组的成员是一个个表示键值对的数组。
类似于对象,key-value对应的集合。
1)特点:
key值不局限于字符串,可以是任意数据类型
2)API
Map.prototype.size 返回 Map 结构的成员总数。 Map.prototype.set(key,
value) set方法设置键名key对应的键值为value,然后返回整个map结构。如果key已经有值,则键值会被更新,否则就新生成该键。
Map.prototype.get(key) get方法读取key对应的键值,如果找不到key,返回undefined。
Map.prototype.has(key) has方法返回一个布尔值,表示某个键是否在当前 Map 对象之中。
Map.prototype.delete(key)delete方法删除某个键,返回true。如果删除失败,返回false。
Map.prototype.clear() 清除所有成员,没有返回值 Map.prototype.keys() 返回键名的遍历器
Map.prototype.values() 返回键值的遍历器 Map.prototype.entries() 返回键值对的遍历器
Map.prototype.forEach() 使用回调函数遍历每个成员
let obj={name:'jerry',age:12
}
let map=new Map(Object.entries(obj));
map.set({a:1,b:2},['tom','jacky']);
console.log(map);
/*Map(3) {'name' => 'jerry','age' => 12,{ a: 1, b: 2 } => [ 'tom', 'jacky' ]
}*/
es6中的变量 解构 对象 数组 函数相关推荐
- ES6学习(变量解构赋值)
解构赋值含义:允许按照一定模式,从数组和对象中提取值,对变量进行赋值,只要等号两边的模式相同,左边的变量就会被赋予对应的值 1.数组解构赋值 右侧必须是一个数组 let [a, b, c] = [1, ...
- 【JavaScript】32_解构对象与对象的解构
1.解构对象 数组中可以存储任意类型的数据,也可以存数组, 如果一个数组中的元素还是数组,则这个数组我们就称为是二维数组 解构对象,方便两数交换数值:可以反向赋值对象,数组 可以在解构的同时,进行声明 ...
- JS(解构) 之数组和对象中提取数据总结
解构含义 解构功能含义:从复杂数据类型中(数组或对象)中提取数据的过程. JS(解构) 之数组 从数组中提取首个元素 方式一:基于数组下标提取元素 const names = ['zzg', 'zcx ...
- ES6-4/5 解构赋值、函数默认值、数组解构、对象解构
ES-4 解构赋值.函数默认值.数组解构.对象解构 ES-5 隐式转换.函数参数解构.解构本质.()用法 一 解构赋值 1 虚值 含义:在Boolean转换结果为假的值falsy 2 函数默认值 ES ...
- 菜鸟也谈js(一)——ES6解构对象篇
前言 为什么我会在开篇谈这样一个low到爆的问题呢?这是因为一个伟大的错误,多么痛的领悟!从前,我深深的以为,后台是权威,后台的数据必须是对的.直到有一天测试给我反馈了一个bug,我的页面崩溃了... ...
- ES6新特性之解构表达式
解构表达式 什么是解构? -- ES6中允许按照一定模式从数组和对象中提取值,然后对变量进行赋值,这被称为解构 (Destructuring). 数组解构 比如有一个数组: let arr = [1, ...
- ES6语法规则之解构
解构:使用ES6的一种语法规则,将一个对象或数组的某个属性提取到某个变量中称为解构,并且解构不会对被解构的目标造成任何影响 首先给出一个对象用作解构 const user = {name: 'jwh' ...
- vue解构赋值_前端开发es6知识 模块化、解构赋值、字符串模板
项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍1.块级作用域 let const 2.箭 ...
- 第五节:一个令人兴奋的ES6新特性:解构赋值
端午节刚刚过,大家是回家陪家人吃粽子,还是约好朋友一起出去浪了?昨天上了一天班,不知道大家有没有把出去玩耍的心思收回来,准备接下来的学习. 继续学习吧骚年们...... 学完了前4节,今天我给大家带来 ...
最新文章
- idea中如何打开RunDashboard窗口,微服务最实用设置
- 【springboot】配置
- java opcode 反汇编,OPCode详解及汇编与反汇编原理
- MySQL引擎特性GIS-R-TREE
- ASP.NET MVC2+MSSQL+Godaddy
- 基于jquery的图片懒加载js
- 【面试招聘】一份转ML的面试心得记录
- sql express 无法启动服务_在Windows2012下安装SQL Server 2005无法启动服务的解决办法...
- 【java基础】idea配置jdk环境,创建项目输出“你好世界“实例
- 表格不换行_Excel表格如何强制换行?8个Excel实用小技巧,帮助你解放双手
- IDEA插件系列(45):UUID Generator插件——UUID生成器
- 物流项目面试题 整理终版
- KK课表抓取教务系统
- 温州大学《机器学习》课件!
- 万能的json格式化
- 关于Android 日历事件的实现
- 制作ROS移动机器人地盘
- 【sv】systemverilog之Automatic
- ubuntu为脚本添加桌面图标
- 机器学习实战2(决策树篇)
热门文章
- openvpn客户端使用
- android文字在图片底下的按钮样式、textview太长的情况用省略号表示
- Acer宏碁笔记本电脑 暗影骑士 AN515-52原装出厂恢复原厂系统1709
- 计算机课图画的变形教案,图画的移动复制和大小变化教学设计.doc
- 网络协议的三个要素是什么?各有什么含义?
- Extreme Drift赛车游戏C#源码详解(1)
- 【小白从小学Python、C、Java】【Python-计算机等级考试二级】【Python语言的注释方法】
- 互联网职位英文及缩写
- count(1)和count(*)的区别?
- NVIDIA Jetson AGX Xavier 刷机教程