ECMAScript 6 中的一些新特性
1、箭头函数,直接写出来v =>看不出来什么,但是跟传统写法一比较,很直观地就能看出v =>是代替了匿名函数 function(v)的写法,{}与逻辑照旧,但是要注意,=与>之间不能有空格.
IDEA只需要改一下framework环境就好,默认是ES5.1
var arr = [1,2,3]; arr.forEach(function(v){
console.log(v);
alert(v);
}); //ES6
arr.forEach(v => {
console.log(v);
alert(v);
});
2、class类的支持,js已经向高级语言靠拢了,这种写法简单易读,比原型链继承通俗易懂
class Animal{
constructor(name){
this.name = name;
}
sayName(){
alert('my name is ' + this.name);
}
} class Person extends Animal{
constructor(name){
//调用父类构造
super(name);
}
program(){
alert('coding...');
}
} var an = new Animal('rab'),
ren = new Person('ren');
an.sayName();// alert('my name is rab')
ren.sayName();// alert('my name is ren')
ren.program();// alert('coding...')
3、增强的对象字面量
这么说不好理解,其实就是
- 可以在对象字面量里面定义原型
- 定义方法可以不用function关键字
- 直接调用父类方法
var human = { breathe(){ alert('human breathing...'); } }; var worker = { __proto__: human,// 此处,通过直接指向原型链实现继承 company: 'com', work(){ alert('worker is working'); } }; human.breathe();// human breathing... worker.breathe();// human breathing...
4、字符串模板
ES6中允许使用反引号 ` 来创建字符串(注意,什么是反引号?就是ESC下面,Tab上面那个键,从此告别 ‘++’...)
var num = Math.random();
alert(`your num is ${num}`);
特点一:字符串可换行
var s = `In JavaScript this is
not legal.`; console.log(s);
// In JavaScript this is
// not legal.
特点二:模板嵌套——可用于循环挂数据
const tmpl = addrs => `
<table>
${addrs.map(addr => `
<tr><td>${addr.first}</td></tr>
<tr><td>${addr.last}</td></tr>
`).join('')}
</table>
`; const data = [
{ first: '<Jane>', last: 'Bond'},
{ first: 'Lars', last: '<Croft>'}
]; console.log(tmpl(data));
// <table>
// <tr><td><Jane></td></tr>
// <tr><td>Bond</td></tr>
// <tr><td>Lars</td></tr>
// <tr><td><Croft></td></tr>
// </table>
特点三:可用于动态生成代码变成可执行函数
let str = "return" + "`Hello ${name}!`";
let func = new Function("name", str);
console.log(func("jack"));// Hello jack!
let str = "(name) => `Hello ${name}!`";
let func = eval.call(null, str);
console.log(func("jack"));// Hello jack!
特点四:可用于过滤恶意代码
function SaferHTML(templateData) {
var s;
for (var i = 0; i < arguments.length; i++) {
var arg = String(arguments[i]); s += arg.replace(/<script>/g, "<script>")
.replace(/<\/script>/g, "</script>");
}
return s;
}
var sender = '<script>alert("abc")</script>'; // 恶意代码
var message = SaferHTML`<p>${sender} has sent you a message.</p>`; console.log(message);//<p><script>alert("abc")</script> has sent you a message.</p>
展望:ES7即将加入位数“0”补全函数
var num = "1"; console.log(num.padStart(10,"0")); //
5、解构
啥是解构,,大白话就是,数组取值不用下标了,给事先定义一些key,通过key来取数组里对应的value
var [x,y] = getVal(),
[name,,age] = ['nam','female','18'];//此处,没有给第二个sex定义key function getVal() {
//此处,不能省略function关键字..说明只有在定义一个类对象时才可以省略..
return [ 1, 2 ];
}
//此处,模板写法是否很眼熟呢~
alert(`x:${x}, y:${y}`);// x:1, y:2
alert(`name:${name}, age:${age}`);// name:nam, age:18
try{
alert(`name:${name}, sex:${sex}, age:${age}`);
}
catch (e){
console.error(e.message);// sex is not defined
}
解构的用途:
(1)函数多个返回值:
//数组形式
function test() {
return [1,2,3];
}
var [a,b,c] = test();
//a==1
//b==2
//c==3 //对象形式
function test2() {
return {
fir:1,
sec:2
};
}
var { fir, sec } = test2();
//fir==1
//sec==2
(2)函数参数定义:
//有序传参
function test1([x,y,z]){}
test1([1,2,3]); //无序传参
function test2({x,y,z}){}
test2({y:3, x:9, z:1}) //无序默认值
function request(url,{
async = true,
headers = { 'Content-Type': 'application/json' },
method = 'GET'
}){
return [url, async, headers, method];
}
let [u, a, h, m] = request('/api/post.php',{method:'POST', headers:{'Content-Type': 'application/xml'}});
//u == '/api/post.php'
//a == true
//h == {'Content-Type': 'application/xml'}
//m == 'POST'
(3)提取json数据:
var json = {
id: 7,
state: "isOk",
list:[4,90]
};
let {id, state, list: data} = json;
console.log(id, state, data);
//7 isOk [ 4, 90 ]
(4)遍历对象key-value
var map = new Map();
map.set('k1','v1');
map.set('k2','v2'); for(let [key,value] of map){
console.log(key + ':' + value);
}
//k1:v1
//k2:v2 for(let [key] of map){
console.log(key);
}
//k1
//k2 for(let [,value] of map){
console.log(value);
}
//v1
//v2
(5)获取对象方法
var obj = {
sourceFunc:function () {
return "I'm sourceFunc";
},
paramsFunc: function (par1) {
return "I'm paramsFunc. par1 is " + par1;
}
} const {paramsFunc, sourceFunc} = obj;
//paramsFunc('参数1') == "I'm paramsFunc. par1 is 参数1"
//sourceFunc() == "I'm sourceFunc"
6、参数的各种玩法
6.1参数默认值,熟悉C#的同学一定不陌生了,函数参数默认值的这种写法(照这个趋势..以后大家都得是全栈工程师..)
function Say(msg){
//传统指定参数默认值
var msg = msg || 'message';
alert('nihao ' + msg);
} //ES6
function Say2(msg = '我不好'){
alert(`nihao ${msg}`);
} Say();// nihao message
Say2();// nihao 我不好
Say('WOHENHAO');// nihao WOHENHAO
Say2('你不好也得好');// nihao 你不好也得好
6.2不定参数,这个我在C#上没有见过(也可能是我孤陋寡闻了..)
//传统写法
var arr = [1,2,3,4] function add(m,n){
return m + n;
} alert(arr.reduce(add, 2));// 此处,结果为12,给了一个起始值2,2 + 1 + 2 + 3 + 4 = 12 //ES6
function add2(...x){
return x.reduce((m,n) => m+n);
} alert(add2(1,2,3,4));//
alert(add2(12,14));//
6.3拓展参数,个人理解也是多参映射的一种偷懒写法
var peoples = ['zhang','wang','li','zhao']; function hello(p1,p2,p3,p4) {
console.log(`hello ${p1} ${p2} ${p3} ${p4}`);
}
//将数组以拓展参数的形式传递,它能很好地映射到每个单独的参数
hello(...peoples);// hello zhang wang li zhao
7、for of循环【对比for in循环】
var arr = ['a','b','c']
var obj = { 'a':'aa', 'b':'bb', 'c': 'cc'}
function obj2(){
this.a = 'b';
this.c = 'd';
} for(var v in arr)
{
console.log(v);// 0 1 2
}
for(var v in obj)
{
console.log(v);// a b c
}
for(var v in obj2)
{
console.log(v);// 啥也输不出
} for(v of arr)
{
console.log(v);// a b c
}
for(v of obj)
{
console.log(v);// TypeError: obj is not iterable
}
for(v of obj2)
{
console.log(v);// TypeError: obj2 is not iterable
}
结论一:for in循环可以遍历数组与对象,但不能遍历值类型对象,只能遍历引用类型对象
结论二:for of循环只能遍历数组等一些继承了Iterator接口的对象
本文只是参考学习大神的博客做的笔记,并非原创哈~【http://www.cnblogs.com/Wayou/p/es6_new_features.html】
ECMAScript 6 中的一些新特性的更多相关文章
- ECMASCRIPT 6中字符串的新特性
本文将覆盖在ECMAScript 6 (ES6)中,字符串的新特性. Unicode 码位(code point)转义 Unicode字符码位的长度是21位[2].而JavaScript的字符串,是1 ...
- Jdk5.0中出现的新特性
掌握jdk5.0中出现的新特性1.泛型(Generics)2.增强的"for"循环(Enhanced For loop)3.自动装箱/自动拆箱(Autoboxing/unboxin ...
- MVC中的其他新特性
MVC中的其他新特性 (GlobalImport全局导入功能) 默认新建立的MVC程序中,在Views目录下,新增加了一个_GlobalImport.cshtml文件和_ViewStart.cshtm ...
- C#6.0 中的那些新特性
C#6.0 中的那些新特性 前言 VS2015在自己机器上确实是装好了,费了老劲了,想来体验一下跨平台的快感,结果被微软狠狠的来了一棒子了,装好了还是没什么用,应该还需要装Xarmain插件,配置一些 ...
- iOS中的项目新特性页面的处理
一般项目中都会出现新特性页面,比如第一次使用应用的时候,或者在应用设置里查看新特性的时候会出现. 这里,选择新建一个专门处理项目新特性的控制器,来完成功能. 首先是 NewFeaturesViewCo ...
- Xcode中StoryBoard Reference 新特性的使用
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- 浅析Oracle 12c中Data Guard新特性
浅析Oracle 12c中Data Guard新特性 写在前面 无论是做Oracle运维的小伙伴还是老伙伴,想必对Oracle数据库的数据级灾备核心技术—Data Guard是再熟悉不过了!这项从 ...
- ES6系列之项目中常用的新特性
ES6系列之项目中常用的新特性 ES6常用特性 平时项目开发中灵活运用ES6+语法可以让开发者减少很多开发时间,提高工作效率.ES6版本提供了很多新的特性,接下来我列举项目中常用的ES6+的特性: l ...
- ECMAScript 5和ECMAScript6的新特性以及浏览器支持情况
ECMAScript简介: 它是一种由Ecma国际(前身为欧洲计算机制造商协会)制定和发布的脚本语言规范,javascript在它基础上经行了自己的封装.但通常来说,术语ECMAScript和java ...
随机推荐
- hadoop-2.6.0.tar.gz + spark-1.5.2-bin-hadoop2.6.tgz的集群搭建(单节点)
前言 本人呕心沥血所写,经过好一段时间反复锤炼和整理修改.感谢所参考的博友们!同时,欢迎前来查阅赏脸的博友们收藏和转载,附上本人的链接.http://www.cnblogs.com/zlslch/p/ ...
- hdoj 1241 Oil Deposits
Oil Deposits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- PL/SQL基础
打印 hi set serveroutput on --打开输出开关 declare --说明部分(变量说明,光标申明或者例外说明) begin --程序 ...
- Linux为Tomecat指定JDK
在搭建Jenkin+Sonar集成时,由于系统环境配置了jdk1.7,但是jenkins在安装sonar的插件时,需要jdk1.8.,所以需要在Tomcat指定jdk1.8. (1)暂停Tomcat ...
- 【面试虐菜】—— Oracle知识整理《收获,不止Oracle》
普通堆表不足之处: 表更新有日志开销 表删除有瑕疵 表记录太大检索较慢 索引回表读开销很大 有序插入难有序读出 DELETE产生的undo最多,redo也最 ...
- EasyUI实例源码
jQuery+EasyUI实例源码 http://www.51aspx.com/code/jQueryEasyUIExample ASP.NET MVC+EF+EasyUI权限 http://www. ...
- 借助Ant工具,实现快速开发
当一个项目大了以后,每次重新编译,打包,运行等就会变得复杂.费时.重复,在c语言中有make脚本进行这些工作的批量完成,那么在java中,我们可以使用Ant. Ant是一个构建工具,可以完成这些任务: ...
- ubuntu卸载qq2012
xianbin@xianbin-ThinkPad-E520:~$ sudo dpkg --purge wine-qq2012-longeneteam [sudo] password for xianb ...
- ss与 netstat
ss快的秘诀在于,它利用到了TCP协议栈中tcp_diag.tcp_diag是一个用于分析统计的模块, 可以获得Linux 内核中第一手的信息,这就确保了ss的快捷高效.当然,如果你的系统中没有tcp ...
- TRUNCATE TABLE 与 DELETE table 区别
语法 TRUNCATE TABLE name;参数 TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行. TRUNCATE TABLE ...