一、变量

  1.var关键字的弊端

  var关键字的弊端:1.可以重复声明变量;2.无法限制变量修改;3.没有块级作用域,只有函数作用域。


<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<input type="button" value="按钮1">
<input type="button" value="按钮2">
<input type="button" value="按钮3"> <script>
var oBtn = document.getElementsByTagName("input");
for(var i=0; i< oBtn.length; i++){
oBtn[i].onclick = function () {
alert(i); // 三个按钮都是3
}
}
  // 点击按钮alert出来的都是3。因为事件没触发时,for循环已经遍历结束,当事件触发时i的值已经是3了。
</script>
</body>
</html>

  惯用的解决办法是将onclick写进一个匿名函数。

for(var i=0; i< oBtn.length; i++){
(function (i) {
oBtn[i].onclick = function () {
alert(i); // 三个按钮都是3
}
})(i);
}

  2.let和const关键字

  let和const关键字使得变量不可以被重复声明,且变量具有块级作用域。不同的是,let用来声明变量,const用来声明常量(不可被修改的常量)。

  注:在Java中,Java: int a = 123; int a = 12; 报错,变量不可以重复声明,因为它存在堆内存中,变量直接代表一块内存空间。而对象的值存在堆中,变量实际上这个对象的引用。js的var同样应遵循这样的规则。

// let写法
for(let i=0; i< oBtn.length; i++){
oBtn[i].onclick = function () {
alert(i); // 三个按钮都是3
}
}

二、数组

  1.解构赋值

let arr = [1, 2, 3];

// let a = arr[0];
// let b = arr[1];
// let c = arr[2]; // 等价于
let [a, b, c] = [1, 2, 3];
console.log(a, b, c); let {l, m, n} = {l: 1, m:2, n:3};
console.log(l, m, n); let [x, y, z] = [{p1: 123, p2: 234}, [345, 456], 789];
console.log(x, y, z); let [{p11, p12}, [p21, p22], p31] = [{p11: 123, p12: 234}, [345, 456], 789];
console.log(p11, p12, p21, p22, p31);

  注意,当右侧是一个json数据时,左侧相应的变量必须与其键名对应。

  2、新增map、reduce、filter、forEach函数

  常见的数组操作函数。

// map: 用给定的映射遍历数组,不改变原数组,生成新数组;
let arr = [12, 58, 99, 86, 45, 21];
let newArr = arr.map(item=>item>=60?"及格":"不及格");
console.log(arr, newArr); // reduce: 遍历累加
let sum = arr.reduce((item1, item2, index)=>item1+item2); // index表示下标,这里可不写
console.log(sum); // filter: 过滤器
let filter = arr.filter(item=>item<=60);
console.log(filter); let arr2 = [
{title: "奔驰", price: 20},
{title: "宝马", price: 35},
{title: "路虎", price: 30},
{title: "特斯拉", price: 40},
{title: "大众", price: 15},
{title: "标致", price:15},
];
let filter2 = arr2.filter(item=>item.price >=30);
console.log(filter2); // forEach 循环遍历
let newArr2 = arr.forEach((item, index)=>console.log(item, index));
newArr2; // 没有返

三、字符串

  1.新增startswith和endswith

let str = "http://www.baidu.com";
if(str.startsWith("https")){
console.log("加密网址");
}else if(str.startsWith("http")){
console.log("普通网址");
} let str2 = "abc1234@163.com";
if(str2.endsWith("163.com")){
console.log("163邮箱");
}else if(str2.endsWith("qq.com")){
console.log("qq邮箱");
}

  2.模板字符串

  用返单引号(``)包裹的字符串,其中的变量可以用${}来替换。它可以写多行字符串。

let title="标题", content="内容";
let str = `
<div><h1>${title}</h1><p>${content}</p></div>
`;
alert(str);

四、函数

  1.箭头函数

  箭头函数是函数的一种简写。

let show = function () {
console.log("what the hell?")
};
show();
// es6写法
let newShow = ()=>{
console.log("what the hell?")
};
newShow();

  带参数的写法。如果参数只有一个,那么()可以省略。

let alt = a=>{console.log(a*10)};// 单个参数
let add = (a, b) => {console.log(a + b);
}; // 两个参数
add(3,5);

  如果函数只有一个返回值,那么{}省略。

let arr = [12, 234, 345, 64, 23, 87];
arr.sort(function (n1, n2) { return n1 - n2 });
// 简写为
arr.sort((n1, n2) =>n1 - n2);
console.log(arr);

  2.默认参数

  可以像python那样在函数定义时设置默认参数的值。并且可以通过...args来展开元素,同样类似python的*args。

function show2(a, b=4, c=123) {
console.log(a, b, c);
}
show2(7);
function show(a, b, ...args) {
console.log(a + b);
console.log(args); // 剩余的写进...args数组里,必须写在最后
}
show(3, 5, 7, 9, 11);

  ...args甚至可以拆解数组。

let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
let arr = [...arr1, ...arr2]; // [1, 2, 3, 4, 5, 6]

五、json

  如果键名和值一致,那么键名可以省略。

let a=123;
let b=456;
// 当名字和值一样时可以简写
let json1 = {a, b}; // 等价于let json1 = {a: a, b: b}
let json2 = {
a,
b,
show(item){
console.log(item)
} // 等价于 show: function(){console.log(item};
};
json2.show(json2.a);

六、类

  相比函数构造类的外挂式写法,添加了class和constructor来声明类和构造函数。

// 声明
class Person{
constructor(name, gender){
this.name = name;
this.gender = gender;
}
showName(){
console.log(this.name);
}
showGender(){
console.log(this.gender);
}
} var sun = new Person("孙悟空", "male");
sun.showName();
sun.showGender();
// 继承
class Child extends Person{
constructor(name, gender, age){
super(name, gender);
this.age = age;
}
showAge(){
console.log(this.age);
}
} var child = new Child("小猴子", "male", 12);
child.showAge();

七、promise

  用同步的写法来管理异步。

function createPromise(url) {
return new Promise(function (resolve, reject) {
$.ajax({
url, // url: url
dataType: 'json',
success(arr){ resolve(arr);},
error(arr){vreject(arr);}
})
});
}
// 在当前目录下创建arr.txt和json.txt文件
Promise.all([createPromise("arr.txt"), "json.txt"]).then(function (arr) {
alert("全都成功了!");
}, function (arr) {
alert("至少有一个失败了!");
});

  高版本的Jquery中,$.ajax本身就是promise对象,所以上面的代码可简写为:

Promise.all([$.ajax({url:"arr.txt", dataType:"json"}), $.ajax({url: "json.txt", dataType: "json"})]).then(function (results) {
let [arr, json] = results;
// 分别处理自己的逻辑
console.log("全都成功了!");
console.log(arr, json);
}, arr=>alert("至少有一个失败了!"));

八、generator-yield

  生成器。惰性执行函数,和python中的生成器一致。

function *show() {
console.log("------1-----");
let a = yield 12;
console.log("------2-----");
console.log(a);
return a;
} let gen = show();
let a = gen.next(123); // 当yield 后赋值时,第一次执行到yield时返回该值
let b = gen.next(456);
console.log(a, b); // a是一个json对象

前端(七):ES6一些新特性的更多相关文章

  1. ES6常用新特性

    https://segmentfault.com/a/1190000011976770?share_user=1030000010776722 该文章为转载文章!仅个人喜好收藏文章! 1.前言 前几天 ...

  2. ES6 && ECMAScript2015 新特性

      ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015. 也就是说,ES6就是ES201 ...

  3. ES6实用新特性

    兼容性 http://kangax.github.io/compat-table/es5/ http://kangax.github.io/compat-table/es6/ ES6(ES2015)兼 ...

  4. ES6:JavaScript 新特性

    我相信,在ECMAScript.next到来的时候,我们现在每天都在写的JavaScript代码将会发生巨大的变化.接下来的一年将会是令JavaScript开发者们兴奋的一年,越来越多的特性提案将被最 ...

  5. ES6相关新特性介绍

    你可能已经听说过 ECMAScript 6 (简称 ES6)了.ES6 是 Javascript 的下一个版本,它有很多很棒的新特性.这些特性复杂程度各不相同,但对于简单的脚本和复杂的应用都很有用.在 ...

  6. es6的新特性--模板字符串

    这几天简单看了一下深入浅出es6这本书,感觉特实用,学习了一个新特性---模板字符串在项目开发中,拼接字符串是不可缺少的,动态创建dom元素以及js操作数据都要拼接字符串,在es6出来之前,我们都通常 ...

  7. H5、C3、ES6的新特性

    H5的新特性 1.语义化标签 有利于SEO,有助于爬虫抓取更多的有效信息,爬虫是依赖于标签来确定上下文和各个关键字的权重. 语义化的HTML在没有CSS的情况下也能呈现较好的内容结构与代码结构 方便其 ...

  8. JS - ECMAScript2015(ES6)新特性

    友情提示:本文仅mark几个常用的新特性,详细请参见:ES6入门 - ryf: 碎片 var VS let VS const var:声明全局变量, let:声明块级变量,即局部变量 const:声明 ...

  9. ES6的新特性(1)——ES6 的概述

    ES6 的概述 首先,感谢马伦老师的ES6新特性的教程. ECMAScript 和 JavaScript 的关系是 ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前 ...

  10. 关于ES6的新特性

    1  let声明变量 01    let声明的变量,不可重复声明,比如 let   a=1  : let   a=2 :这样申明会报错 02    let声明的变量,有块级作用域,比如  if( ){ ...

随机推荐

  1. linux将指令加入开机启动或加入环境变量

    以mongodb运行指令为例,/usr/local/webserver/mongodb/bin/mongo 1,linux将指令加入环境变量PATH 简单说PATH就是一组路径的字符串变量,当你输入的 ...

  2. FutureTask与Fork/Join

    在学习多线程的过程中,我们形成了一种思维习惯.那就是对于某个耗时操作不再做同步操作,让他分裂成一个线程之后执行下一步,而线程执行耗时操作.并且我们希望在我们需要它返回的时候再去调用它的结果集.好比我们 ...

  3. Java_多线程

    线程(Thread) 1.线程是CPU进行资源调度的最小单位 2.线程是进程实际运行的单位,处理进程中无数的小任务 3.线程共享代码和数据空间 4.一个进程可以并发多个线程,线程之间切换系统开销很小 ...

  4. ArcGis10.2破解教程

    ArcGis10.2下载地址: https://pan.baidu.com/s/15s5ki_8gf0_732br6h43Hw 破解步骤: 1.完成License Manager的安装. 2.将破解文 ...

  5. Sql语句里的递归查询 SqlServer2005和Oracle 两个版本

    以前使用Oracle,觉得它的递归查询很好用,就研究了一下SqlServer,发现它也支持在Sql里递归查询举例说明:SqlServer2005版本的Sql如下:比如一个表,有id和pId字段,id是 ...

  6. ACM练习网站

    1.http://www.acmerblog.com/ Acm之家 2.http://acm.nyist.net/JudgeOnline/problemset.php 南阳理工学院

  7. ifram的使用 左边是<a>链接 右边是对应网页嵌套的显示网页链接内容 和toggle的收放用法

    1.ifram的使用 左边是<a>链接  右边是对应网页嵌套的显示网页链接内容 <div class="container"> <div class= ...

  8. 《LeetBook》leetcode题解(10): Regular Expression Matching——DP解决正则匹配

    我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...

  9. IO流(三)其他流与File类

    1:其他的流 1: DataOutputStream ;多了一些操作基本数据类型的功能 DataInputStream:读取文件. 用DataOutputStream流写进去的数据,就用DataInp ...

  10. javac符号名字的管理

    在符号表中,很重要的一项内容就是符号的名字.名字的管理,要解决的主要问题就是名字的变长问题.在javac中,所有的符号名字放到了一个公用字符池中,对于相同的名字只保存一个. 其中涉及到的主要类及关系如 ...