一小时学会ECMAScript6新特性(二)
1、对象属性名
es5中我们为一个对象添加属性可以用如下代码:
let foods = {}; foods.dessert = '蛋糕'; console.log(foods)
但是属性名中间有空格则不能用点的形式添加,es6中的属性名可以有空格:
let foods = {}; foods.dessert = '蛋糕';
foods['hot drink'] = '可乐' console.log(foods)
方括号中还可以用变量的形式引入:
let foods = {},
drink = 'hot drink'; foods.dessert = '蛋糕';
foods[drink] = '可乐' console.log(foods)
2、对比两个值是否相等
方括号中还可以用变量的形式引入:ES5 比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===)。它们都有缺点,前者会自动转换数据类型,后者的NaN不等于自身,以及+0等于-0。 JavaScript 缺乏一种运算,在所有环境中,只要两个值是一样的,它们就应该相等。
ES6 提出 “Same-value equality” (同值相等)算法,用来解决这个问题。Object.is就是部署这个算法的新方法。它用来比较两个值是否严格相等,与严格比较运算符( === )的行为基本一致,Object.is()括号中放的是对比的两个值。
+0 === -0 //true
NaN === NaN // false
Object.is(+0, -0) // false
Object.is(NaN, NaN) // true
3、把一个对象的值复制到另一个对象里 Object.assign()
Object.assign()
方法用于将所有可枚举的属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
Object.assign(target, ...sources)
参数
target
- 目标对象。
sources
- (多个)源对象。
返回值
目标对象。
如果目标对象中的属性具有相同的键,则属性将被源中的属性覆盖。后来的源的属性将类似地覆盖早先的属性。
let breakfast = {drink: '咖啡'},
foods = {drink: '蛋糕'}; Object.assign(
breakfast,
foods
) console.log(breakfast)
4、创建新对象 Object.create()
Object.create()
方法会使用指定的原型对象及其属性去创建一个新的对象。
Object.create(proto, [ propertiesObject ])
参数
- proto
- 一个对象,应该是新创建的对象的原型。
- propertiesObject
- 可选。该参数对象是一组属性与值,该对象的属性名称将是新创建的对象的属性名称,值是属性描述符(这些属性描述符的结构与
Object.defineProperties()
的第二个参数一样)。注意:该参数对象不能是undefined
,另外只有该对象中自身拥有的可枚举的属性才有效,也就是说该对象的原型链上属性是无效的。
抛出异常
如果 propertiesObject
参数不是 null
也不是
对象,则抛出一个 TypeError
异常。
let breakfast = {
getDrink() {
return '咖啡';
}
}; let dinner = {
getDrink() {
return '牛奶';
}
}; let sunday = Object.create(breakfast);
console.log(sunday.getDrink())
5、设置对象的prototype Object.setPrototypeOf() (现在这个方法只是草案 推荐用__proto__)
Object.setPrototypeOf() 方法设置一个指定的对象的原型 ( 即, 内部[[Prototype]]属性)到另一个对象或 null
。
Object.setPrototypeOf(obj, prototype)
参数
- obj
- 要设置其原型的对象。.
- prototype
- 该对象的新原型(一个对象 或
null
).
let breakfast = {
getDrink() {
return '咖啡';
}
}; let dinner = {
getDrink() {
return '牛奶';
}
}; let sunday = Object.create(breakfast);
console.log(sunday.getDrink());
console.log(Object.getPrototypeOf(sunday) === breakfast); // 判断原型是否相同 Object.setPrototypeOf(sunday, dinner);
console.log(sunday.getDrink())
6、__proto__ (前后各两个下划线)
let breakfast = {
getDrink() {
return '咖啡';
}
}; let dinner = {
getDrink() {
return '牛奶';
}
}; let sunday = {
__proto__: breakfast
} console.log(sunday.getDrink());
console.log(Object.getPrototypeOf(sunday) === breakfast); sunday.__proto__ = dinner;
console.log(sunday.getDrink());
console.log(Object.getPrototypeOf(sunday) === dinner);
7、super (得到方法返回的内容)
super 关键字用于调用一个对象的父对象上的函数。
super.prop
和 super[expr] 表达式在类 和 对象字面量 任何 方法定义 中都是有效的。
let breakfast = {
getDrink() {
return '咖啡';
}
}; let dinner = {
getDrink() {
return '牛奶';
}
}; let sunday = {
__proto__: breakfast,
getDrink() {
return '返回了 ' + super.getDrink();
}
} console.log(sunday.getDrink())
8、迭代器 Iterators (轮流交换)
Iterator
函数返回一个对象,它实现了遗留的迭代协议,并且迭代了一个对象的可枚举属性。
Iterator(object, [keyOnly]) 每次执行返回一个对象 {value: xx, done: true/false} //value 返回的值; done 还有没有可以迭代的东西,没有返回true。
参数
object
- 要迭代属性的对象。
keyOnly
- 如果
keyOnly
是真值,Iterator.prototype.next
只返回property_name
。
模拟迭代器
function chef(foods) {
let i = 0; return {
next() {
let done = (i >=foods.length);
let value = !done ? foods[i++] : undefined; return {
value: value,
done: done
}
}
}
} let yang =chef(['西红柿', '鸡蛋']);
console.log(yang.next());
console.log(yang.next());
console.log(yang.next());
9、迭代生成器 Generators
function* chef(){
yield '西红柿';
yield '鸡蛋';
} let yang = chef(); console.log(yang.next());
还可以以数组的形式传入
function* chef(foods){
for (let i = 0; i<foods.length; i++){
yield foods[i];
}
} let yang = chef(['西红柿', '鸡蛋']); console.log(yang.next());
10、Classes 类
ECMAScript 2015 中引入的 JavaScript 类主要是 JavaScript 现有的基于原型的继承的语法糖。 类语法不是向JavaScript引入一个新的面向对象的继承模型。JavaScript类提供了一个更简单和更清晰的语法来创建对象并处理继承。
类实际上是个“特殊的函数”,就像你能够定义的函数表达式和函数声明一样,类语法有两个组成部分:类表达式和类声明。
类声明
定义一个类的一种方法是使用一个类声明。要声明一个类,你可以使用带有class关键字的类名(这里是“Rectangle”)。
class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
}
}
提升
函数声明和类声明之间的一个重要区别是函数声明会声明提升,类声明不会。你首先需要声明你的类,然后访问它,否则像下面的代码会抛出一个ReferenceError
:
let p = new Rectangle(); // ReferenceError class Rectangle {}
声明实例使用类
class Chef {
constructor(food) {
this.food = food;
} cook() {
console.log(this.food)
}
} let yang = new Chef('番茄');
yang.cook();
11、类中的 get (得到东西的方法)与 set(设置东西的方法)
class Chef {
constructor(food) {
this.food = food;
this.dish = [];
} get menu() {
return this.dish;
} set menu(dish) {
this.dish.push(dish);
} cook() {
console.log(this.food)
}
} let yang = new Chef();
console.log(yang.menu = '番茄');
console.log(yang.menu = '鸡蛋');
console.log(yang.menu)
12、静态方法 static
class Chef {
constructor(food) {
this.food = food;
this.dish = [];
} get menu() {
return this.dish;
} set menu(dish) {
this.dish.push(dish);
} static cook(food) {
console.log(food)
}
} Chef.cook('番茄')
12、继承 extends
class Person {
constructor(name, birthday) {
this.name = name;
this.birthday = birthday;
} intro() {
return `${this.name}, ${this.birthday}`;
}
} class Chef extends Person{
constructor(name, birthday) {
super(name, birthday);
}
} let yang = new Chef('yang', '01-30');
console.log(yang.intro())
13、set
Set
对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。(和数组类似,但是set中不能有重复的内容,即 Set 中的元素是唯一的。)
let dessert = new Set('123');
dessert.add('4'); //添加一个内容
dessert.delete('1'); //删除一个
let len = dessert.size; //Set 的length
let blen = dessert.has('1'); //Set 中有没有某个值
dessert.clear(); //清空Set; console.log(dessert); /*循环获取Set中的内容*/
dessert.forEach(dessert => {
console.log(dessert);
})
14、Map
Map
对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。
let food = new Map();
let fruit = {}, cook = function() {}, dessert = '甜点'; food.set(fruit, '香蕉'); //添加项目
food.set(cook, '下面');
food.set(dessert, '蛋糕');
let len = food.size; //Map 的length
let getFruit = food.get(fruit); //得到其中一个项目
food.delete(fruit); //删除某个项目
let boole = food.has(fruit) //查看有没有某个项目 console.log(boole); food.forEach((value, key) => {
console.log(`${key} = ${value}`)
}) food.clear(); //清空Map
15、Module 模块
可以直接在任何变量或者函数前面加上一个 export
关键字,就可以将它导出。
export const sqrt = Math.sqrt;
export function square(x) {
return x * x;
}
export function diag(x, y) {
return sqrt(square(x) + square(y));
}
引用
import { square, diag } from 'lib';
console.log(square(11)); //
console.log(diag(4, 3));
16、默认导出
export default function () { ... };
export { D as default };
一小时学会ECMAScript6新特性(二)的更多相关文章
- 一小时学会ECMAScript6新特性
ECMAScript 简介 简称es,是一套标准,javascript就是使用这套标准的语言.主流的浏览器使用的是ECAMScript5,ECAMScript6(ECAMScript2015)是一涛新 ...
- 一小时学会ECMAScript6新特性(一)
ECMAScript 简介 简称es,是一套标准,javascript就是使用这套标准的语言.主流的浏览器使用的是ECAMScript5,ECAMScript6(ECAMScript2015)是一涛新 ...
- HTML5 十大新特性(二)——表单新特性
H5的表单新特性可以分为两大类. 一.10个input的type值 1.email:邮件输入域,在表单提交时提供简单的邮箱格式验证,并弹出一个提示窗口. 2.url:地址输入域,在表单提交时提供简单的 ...
- ECMAScript6新特性之let、const
第一次在博客园写博客,想把自己每一天学习到的知识点记录下来,心里有点紧张(PS:不知道自己能不能写好......嘿嘿).言归正传,咱们先来说说"ECMAScript"这到底是啥玩意 ...
- web全栈架构师[笔记] — 01 ECMAScript6新特性
ES6新特性 一.变量 var:重复定义不报错:没有块级作用域:不能限制修改 let:变量,不能重复定义,有块级作用域 const:常量,不能重复定义,有块级作用域 二.函数/参数 箭头函数——简写: ...
- 轻松学会ES6新特性之生成器
生成器虽然是ES6最具魔性的新特性,但也是最难懂得的一节,笔者写了大量的实例来具体化这种抽象的概念,能够让人一看就懂,目的是希望别人不要重复或者减少笔者学习生成器的痛苦经历. 在说具体的ES6生成器之 ...
- JAVA 8 主要新特性 ----------------(二)JDK1.8优点概括
一.JDK1.8优点概括 1.速度更快 由于底层结构和JVM的改变,使得JDK1.8的速度提高. 2.代码更少(增加了新的语法 Lambda 表达式) 增加新特性Lambda表达式的 ...
- 深入理解java虚拟机---jdk8新特性(二)
1.jdk8新特性 1.新特性 2.lambda函数表达式的作用 A: 替换内部类 B:对集合的操作并行化
- ECMAScript6 | 新特性(部分)
新特性概览 参考文章:http://www.cnblogs.com/Wayou/p/es6_new_features.html 这位前辈写的很好,建议深入学习 ———————————————————— ...
随机推荐
- .net 笔试题目
2.1.using关键字有什么用?什么是IDisposable? using可以声明namespace的引入,还可以实现非托管资源的释放,实现了IDisposiable的类在using中创建,usin ...
- ccf 201503-5 最小花费 这题交上去只有10分嗨!求大佬的题解啊
问题描述 C国共有n个城市.有n-1条双向道路,每条道路连接两个城市,任意两个城市之间能互相到达.小R来到C国旅行,他共规划了m条旅行的路线,第i条旅行路线的起点是si,终点是ti.在旅行过程中,小R ...
- Arduino常用的数据类型以及转换
常用的数据类型有布尔类型.字符型.字节型.整型.无符号整型.长整型.无符号长整型.浮点型.双精度浮点型等 布尔类型bollean: 布尔值是一种逻辑值,其结果只能为真(true)或者假(false). ...
- ”dpkg: 处理归档 /var/cache/apt/archives/XXXXXX(--unpack)时出错“的解决方法
在安装ROS时出现了下面的问题: 解决方法: sudo dpkg -i --force-overwrite <filename> 在我的问题中我的解决方法是: sudo dpkg -i - ...
- PC端判断浏览器类型及移动端判断移动设备类型
浏览器代理检测,可以检测出来用户使用的浏览器类型,也可以检测浏览器所在的操作系统 navigator.userAgent (1).判断浏览器类型 var t = navigator.userAgent ...
- Learning Feature Pyramids for Human Pose Estimation(理解)
0 - 背景 人体姿态识别是计算机视觉的基础的具有挑战性的任务,其中对于身体部位的尺度变化性是存在的一个显著挑战.虽然金字塔方法广泛应用于解决此类问题,但该方法还是没有很好的被探索,我们设计了一个Py ...
- 001 爬虫的基本概念以及urllib的request和parse
1.http的请求方式: get请求 优点:比较便捷 缺点:不安全.长度有限制post请求 优点:比较安全.数据整体没有限制.可以上传文件putdelete(删除一些信息) 发送网络请求(可以带一定的 ...
- 以慕课网日志分析为例-进入大数据Spark SQL的世界
下载地址.请联系群主 第1章 初探大数据 本章将介绍为什么要学习大数据.如何学好大数据.如何快速转型大数据岗位.本项目实战课程的内容安排.本项目实战课程的前置内容介绍.开发环境介绍.同时为大家介绍项目 ...
- 一丶Http协议
一 HTTP概述 HTTP(hypertext transport protocol),即超文本传输协议.这个协议详细规定了浏览器和万维网服务器之间互相通信的规则. HTTP就是一个通信规则,通信规则 ...
- crontab和at任务
crontab周期任务 名称解释: cron来源于希腊语 chronos(χρόνος),原意是时间.(引用自维基百科) tab全称是table,表 常用参数: -e 编辑crontab文件 -l 显 ...