let 命令
1.块内有效,块外声明的变量调用报错,var则返回正常值
2.for循环中适用,for外报错
3.let在for中相当于父作用域
for (let i = 0; i < 3; i++)
{let i = 'abc';
console.log(i); }
// abc // abc // abc
4.不存在变量提升
var
命令会发生”变量提升“现象,即变量可以在声明之前使用,值为undefined
。这种现象多多少少是有些奇怪的,按照一般的逻辑,变量应该在声明语句之后才可以使用。
为了纠正这种现象,let
命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错
const命令
const声明的只是一个只读常量,一旦声明则值不变;
const声明变量就必须立即初始化,不能以后再再赋值,否则报错;
与let一样,变量不提升,不能重复声明,只在块内作用域有效;
箭头函数
f=u=>v 等价于 var f = function(v)
{ return v; };
尾调用:function f(x){
return g(x);
}
try...catch
传统的写法是catch
语句必须带有参数,用来接收try
代码块抛出的错误。
!!!!!!set和Map很重要
set:。它类似于数组,但是成员的值都是唯一的,没有重复的值。
const s = new Set();
[2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));
for (let i of s) {
console.log(i);
}
// 2 3 5 4
Set 函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化。
map是键值对的集合
promise对象
Promise 是异步编程的一种解决方案
简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果
Promise
对象有以下两个特点。
(1)对象的状态不受外界影响,只有结果会改变状态:pending
(进行中)、fulfilled
(已成功)和rejected
(已失败);
var promise = new Promise(function(resolve, reject) {
// ... some code
if (/* 异步操作成功 */){
resolve(value);
} else {
reject(error);
}
});
Promise
实例生成以后,可以用then
方法分别指定resolved
状态和rejected
状态的回调函数。
promise.then(function(value) {
// success
}, function(error) {
// failure
});
promise 与ajax
new XMLHttpRequest();对象用于在后台与服务器交换数据
XMLHttpRequest.open()
初始化 HTTP 请求参数
(method, url, async, username, password)
method 参数是用于请求的 HTTP 方法。值包括 GET、POST 和 HEAD。
POST:用"POST"方式发送数据,可以大到4MB
GET:用"GET"方式发送数据,只能256KB
XMLHttpRequest.send()
发送一个 HTTP 请求
var getJSON = function(url) {
var promise = new Promise(function(resolve, reject){
var client = new XMLHttpRequest();
client.open("GET", url);
client.onreadystatechange = handler;
client.responseType = "json";
client.setRequestHeader("Accept", "application/json");
client.send();
function handler() {
if (this.readyState !== 4) {
return;
}
if (this.status === 200) {
resolve(this.response);
} else {
reject(new Error(this.statusText));
}
};
});
return promise;
};
getJSON("/posts.json").then(function(json) {
console.log('Contents: ' + json);
}, function(error) {
console.error('出错了', error);
});