ES6语法 2(函数,对象,数组功能新增,for of ,symbol,set,map集合)

1.函数功能新增

1.1参数解构

	function add(a,b){
	    console.log(a+b);
	}
	add(1,2);
	
	//参数为数组
	function add([a,b]){ 
	    console.log(a+b);
	}
	var arr=[1,2]; //相当于数组解构
	add(arr);
			
	//参数为对象
	function add({a,b}){  
	    console.log(a+b);
	}
	var arr={a:1,b:2}; //对象解构
	add(arr);

	 //设置参数默认值
	function add([a=1,b=2]){ 
	    console.log(a+b);
	}
	add([ ]); //设置了参数默认值时,可以没有参数值,但是参数解构必须要有

1.2 rest参数

ES6 引入 rest 参数(形式为…变量名),用于获取函数的多余参数,就不需要使用arguments对象了。
这里的变量就是一个数组,rest参数将多余的参数放入数组。
使用rest参数就可以像函数中传入任意数量的参数。

rest和arguments的区别
arguments是一个类数组对象,但是不是数组,要想使用数组方法时需要使用Array.prototype.slice.call转换为数组。
而rest就是一个数组,可以直接使用数组的方法。

注:
rest参数之后不能放置别的参数,否则会出错。
函数的length属性不包括rest参数。

function add(a,...b){
    console.log(arguments); //类数组 	[Arguments] { '0': 1, '1': 2, '2': 3, '3': 4, '4': 5 }
    console.log(a);  // 1
    console.log(b); //数组  [ 2, 3, 4, 5 ]
}
add(1,2,3,4,5); 

1.3 箭头函数 ()=>{}

  1. 没有this,super,arguments

     	var name='zhangsan';
     	function getname(){
         console.log(111)
     	};
     	
     	var f1=function(){
     	    console.log(this.name);
     	    getname() //全局
     	}; 
     	var f2=()=>{
     	    console.log(this.name);
     	    getname();
     	    //console.log(arguments); //报错,箭头函数没有arguments
     	};
     	
     	console.dir(f1);
     	console.dir(f2); //没有protptype原型
     	f1();
     	f2();
    
     
     	var obj={
     	    getname(){
     	        console.log(222);
     	    }
     	}
     	
     	var f1=function(){
     	    console.log(this.name);
     	    this.getname();
     	}; //在何处调用this就指向谁
     	var f2=()=>{
     	    console.log(this.name);
     	    this.getname(); //箭头函数中无法改变this的指向
     	}; //谁定义箭头函数this指向谁(外层),无法改变
     	
     	f1.call(obj); //通过call改变运行环境
     	f2.call(obj); 
    
  2. 不能通过new关键字调用(不能当构造函数使用)

     	var f3=()=>{
         this.name=name;
         this.age=age;
         console.log(this.name);
     	};
     	var obj=new f3('zhangsan',13); //箭头函数不能当作构造函数使用(不能通过new关键字调用)
    
  3. 没有原型prototype

  4. 不能改变this的指向(普通函数的this指向调用他的对象,箭头函数的this指向定义他的对象(即永远指向他的父级作用域,任何方法都改变不了,包括call,apply,bind))

  5. 不支持重复的命名参数

  6. 当参数只有一个时,小括号可以省略;功能体只有一行时,大括号可以省略,会默认添加return进行返回;无参数时需要用小括号进行占位,代表参数部分。

     	var f4=a=>a; //代码比较简单,可以省略括号
     	/*
     	function f4(a){
     	    return a;
     	}
     	*/
     	var num=f4(1); // 获取return的值
     	console.log(num);
     	
     	var f5=(a,b)=>{ //若参数有多个或功能体比较复杂时需要加括号
     	    var c=a+b;
     	}
    

2.对象简写

var name='zhangsan';
var age=10;

var obj={
    name:name,
    age:age,
    getname:function(){}
} //对象原写法

var obj={
    name,
    age,
    getname(){}
}  //对象简写

3.对象功能新增

  • Object.is()
    判断两个值是否为一个值,返回true或false

    如果满足以下条件则两个值相等:

  1. 都是 undefined

  2. 都是 null

  3. 都是 true 或 false

  4. 都是相同长度的字符串且相同字符按相同顺序排列

  5. 都是相同对象(意味着每个对象有同一个引用)

  6. 都是数字且
    都是 +0
    都是 -0
    都是 NaN
    或都是非零而且非 NaN 且为同一个值

       console.log(Object.is('1','1'));  //true
       console.log(Object.is(1,'1')); //false
       console.log(Object.is({},{})); //false
       console.log(Object.is([],[])); //false 引用数据类型的内存地址不同
       console.log(Object.is(null, null)); //true
       console.log(+0 === -0);  //true
       console.log(Object.is(+0, -0));  //false
       console.log(NaN === NaN); //false
       console.log(Object.is(NaN, NaN));  //true
    
  • Object.assign()
    将另一个对象中可枚举的属性拷贝到原对象中

     var obj1={n1:1,n2:2};
     var obj2=Object.assign({},obj1); //深拷贝 要开辟新的内存空间
     var obj3=Object.assign(obj1,{}); //浅拷贝 传引用
     var obj4={n2:3,n3:4};
     var obj5=Object.assign(obj1,obj4); //如果重复后者会覆盖前者
     console.log(obj5); //{n1:1,n2:3,n3:4}
    
  • Object.getPrototypeOf()
    获取一个对象的原型

     var obj={}
     console.log(Object.getPrototypeOf(obj)); //获取的就是对象隐式原型属性
     console.log(obj._proto_);
    
  • Object.setPrototypeOf()
    设置一个对象的原型

     function Animal(name){
         this.name=name;
     }
     Animal.prototype.getname=function(){ //设置对象的原型,原型方法getname
         console.log(this.name);
     }
     var d1=new Animal('yangyang');
     d1.getname(); //yangyang
    
  • Object.keys()
    获取所有可枚举属性名,返回值为数组。

  • Object.values()
    获取所有的可枚举属性值

  • Object.entries()
    获取所有的可枚举属性名和属性值键值对

     var obj={
         name:'zhangsan',
         age:10,
         getname(){}
     }
     var keys=Object.keys(obj); //获取对象的可枚举属性名 ['name','age']
     var values=Object.values(obj); //获取对象的所有可枚举属性值 
     var ens=Object.entries(obj); //获取所有可枚举属性名和属性值键值对
     console.log(keys,values,ens);
    

4.数组功能新增

  • Array.from()
    将类似数组或可迭代对象转为数组

     var str='hello';
     console.log(Array.from(str));//[ 'h', 'e', 'l', 'l', 'o' ]
     var obj={
         0:'h',
         1:'e',
         2:'l',
         3:'l',
         4:'o',
         length:5
     } //下标对应元素,length不可少
     console.log(Array.from(obj));  [ 'h', 'e', 'l', 'l', 'o' ]
    
  • Array.of()
    创建一个具有可变数量参数的新数组实例,而不考虑参数的数量或类型(创建数组)

     var arr1=new Array(1); //数组中有一个元素,元素为空
     var arr2=Array.of(1); //将值当做元素传到数组中
     arr1[0]=1; //给arr1元素赋值为1
     console.log(arr1);
     console.log(arr2);
    
  • Array.prototype.find()
    返回数组中满足条件函数的第一个元素的值(只会找一个)

     var nums=[1,2,3,4,5];
     var res=nums.find((v,k,arr)=>{  //k和arr可以省略
         return v>2;
     })
     console.log(res);
    
  • Array.prototype.findIndex()
    返回数组中满足条件函数的第一个元素的索引,未找到元素则返回-1

     var res1=nums.findIndex((v,k,arr)=>{
         return v>2;
     })
     console.log(res1);
    
  • Array.prototype.includes()
    找到一个元素是否存在于数组中,返回true或false

     console.log(nums.includes(6)); //false nums中不包含6
    
  • Array.prototype.fill(v,start,end)
    填充数组

     var ns=new Array(100); //数组有100位空元素
     ns.fill(1);
     console.log(ns);
     ns.fill(1,0,50);
     ns.fill(2,50,100);
     console.log(ns);
    
  • Array.prototype.keys()
    返回一个包含数组中每个索引的对象。

  • Array.prototype.values()
    返回一个包含该数组中索引所对应的值的对象。

  • Array.prototype.entries()
    返回包含数组中索引键值对的对象。

     var nums=[1,2,3,4,5];
     //返回可迭代对象
     console.log(nums);
     console.log(nums.keys());
     console.log(Array.from(nums.keys())); //可迭代对象转为数组
     console.log(nums.values());
     console.log(nums.entries());
     //遍历可迭代对象
     for(var v of nums.keys()){
         console.log(v);
     }
    

5.for-of(可迭代对象)

用来遍历可迭代对象。
一个数据结构只要部署了Symbol.iterator属性,就被视为具有iterator接口(可迭代对象),就可以用for…of循环遍历它的成员。

6.Symbol

ES5 的对象属性名都是字符串,这容易造成属性名的冲突。
防止属性名冲突,包装每个属性的名字都是独一无二的,从根本上防止属性名的冲突。
特点

  • 用来定义对象的唯一属性名

     var s1=Symbol();
     console.log(s1);
     var s2=Symbol();
     console.log(s2);
     console.log(s1==s2);  //false
     console.log(s1===s2); //false 每个symbol都是独一无二的
    
  • Symbol 值作为对象属性名,设置属性值时,不能用点运算符,要用中括号表示法

  • Symbol 值作为对象属性名时,该属性不会出现在for...infor...of循环中

      var obj={name:'zhangsan'};
      for(var k in obj){ //在for in 语句中,symbol不能被遍历出来
         console.log(obj[k]);
     }
    
  • 可以有参数,但是参数仅仅为一个描述,便于区分

在对象中当做属性名使用

var obj={name:'zhangsan'};
var name=Symbol('name'); //name仅仅只是symbol的描述
console.log(name);

obj[name]='xiaoming'; //将Symbol('name')当做属性名,只能使用[] 设置,不能使用.
console.log(obj[name]);

obj[Symbol.for('age')]=10; //若存在以该参数作为名称的symbol值,返回值,没有则新建
console.log(obj[Symbol.for('age')]);

消除魔术字符串
魔术字符串指的是,在代码之中屡次出现、与代码造成强耦合的某一个具体的字符串或者数值。

var stus={
n1:Symbol('xiaohong'),
n2:Symbol('xiaoming'),
n3:Symbol('xiaobai')
}
function test(name){
    if(name==stus.n1)
    console.log(1);
    else if(name==stus.n2)
    console.log(2);
    else if(name==stus.n3)
    console.log(3);
}
//test('xiaohong')
test(stus.n2);

方法

  • Object.getOwnPropertySymbols()
    返回一个数组,只包含symbol类型

  • Reflect.ownKeys()
    返回所有的键数组

  • Symbol.for()
    接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。若已经存在该值,就返回对应的Symbol值,否则就新建一个以该字符串为名称的 Symbol 值,并将其注册到全局

     var obj={name:'zhangsan'};
     obj[Symbol.for('age')]=10; //若存在以该参数作为名称的symbol值,返回值,没有则新建
     console.log(obj[Symbol.for('age')]);
     console.log(Object.getOwnPropertySymbols(obj)); //获取symbol设置的属性,返回数组,值包含symbol类型
     console.log(Reflect.ownKeys(obj));//获取对象所有的成员(包括symbol)
     var s5=Symbol.for('test');
     console.log(Symbol.keyFor(s5)); //获取已经注册过的Symbol的键
    

注意:
Symbol 值作为属性名时,该属性是公有属性不是私有属性,可以在类的外部访问。
但是不会出现在 for…in 、 for…of 的循环中,也不会被 Object.keys() 、 Object.getOwnPropertyNames() 返回。
如果要读取到一个对象的 Symbol 属性,可以通过 Object.getOwnPropertySymbols() 和 Reflect.ownKeys() 取到。

7.Set集合

Set类似于数组,但是里面的成员是唯一的,且不会重复(可以用来去重);
Set是一个构造函数,成员不能通过索引的方式访问;
Set是一个可迭代对象(有iterable接口);
Set 构造函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化。

  • Set.prototype.size
    返回Set实例的元素总数

  • Set.prototype.add(value)
    添加某个值,返回Set结构本身,不能添加重复的值

  • Set.prototype.delete(value)
    删除某个值,返回一个布尔值,表示删除是否成功

  • Set.prototype.has(value)
    返回一个布尔值,表示该值是否为Set的元素。

  • Set.prototype.clear()
    清空一个 Set 对象中的所有元素。

  • Set.prototype.keys()
    返回Set 对象中的元素值的一个 Iterator 对象。

  • Set.prototype.values()
    返回Set 对象中的元素值的一个 Iterator 对象。

  • Set.prototype.entries()
    返回Set 对象中的[key, value]的一个 Iterator 对象。

  • Set.prototype.forEach()
    遍历

     var arr=[1,2,3,4,5,5,5]
     var s=new Set(arr);  //去重  可迭代对象
     console.log(s);
     var arr=Array.from(s); //转换为数组(完成数组去重)
     console.log(arr);
     console.log(s.size); //set元素总数
     
     s.add(6); //添加成员
     console.log(s);
     
     s.delete(1); //删除该成员
     console.log(s);
     
     console.log(s.has(2));//是否包含该成员
     //s.clear(); //清除所有数组元素
     console.log(s);
     console.log(s.keys()); //set对象的键
     console.log(s.values()); //set对象的值
     console.log(s.entries()); //set对象的键值对 键值相同
     s.forEach((v)=>{
         console.log(v);
     }) //遍历
    

8.Map集合

Map用于保存键值对,类似于对象,也是键值对的集合,任何值(对象或者原始值) 都可以作为一个键或一个值。
Map 可以接受一个数组作为参数。该数组的成员是一个个表示键值对的数组。[[key,value],[key,value]]

在Map中任何的类型的数据都可以为键,值跟Object一致。

  • 我们在使用{}时,有可能会出现属性名和原型中的属性名一致的情况,Map不会
  • 一个 Map的键可以是任意值,包括函数、对象或任意基本类型。
  • Map 中的 key 是有序的。{}无序
  • Map 的键值对个数可以轻易地通过size 属性获取,{}需要计算

Map集合在创建时,也可以传递一个数组进行创建,但是需要注意形似为[key,value]

  • Map.prototype.size
    返回Map对象的键/值对的数量。

  • Map.prototype.set(key, value)
    set方法设置键名key对应的键值为value

  • Map.prototype.get(key)
    get方法读取key对应的键值

  • Map.prototype.has(key)
    某个键是否在当前 Map 对象之中

  • Map.prototype.delete(key)
    delete方法删除某个键,返回true

  • Map.prototype.clear()
    清除所有成员

  • Map.prototype.keys()
    返回键名的遍历器对象

  • Map.prototype.values()
    返回键值的遍历器对象

  • Map.prototype.entries()
    返回键值对的遍历器对象

  • Map.prototype.forEach()
    遍历

     var k=[];
     var arr=[[0,'1'],[1,'2'],[k,3],[{},4]]
     var m=new Map(arr);
     console.log(m);
     console.log(m.get(k)); //获取键对应的值,[]和{}不能直接写
     m.set(4,'5'); //设置键值
     console.log(m);
     console.log(m.size); //键值对的数量
     console.log(m.has(0));//查找是否含有该成员
     m.delete(1);
     console.log(m);
     //m.clear();
     console.log(m.keys());
     console.log(m.values());
     console.log(m.entries());
     m.forEach((v,k,map)=>{
         console.log(v); //值
     })
     for(var k of m.keys()){
         console.log(k); //键
     }
    

关于es6的更多文章
es6基础
ES6语法 1(let,const,解构,模板字符串,扩展运算符)
ES6语法 3(class,迭代器,promise,generator,async/await,proxy/reflect)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值