一、變數
var
1 可以重複宣告(var a=1;var a=7;)(一開始用著會覺得限制很少,但是在大型專案會麻煩,人多嘴雜的時候定義重複了就容易出問題還不好找)
2 無法限制修改
3 沒有塊級作用域(塊指{}以外就不能訪問)
function(){
var a=10;
}
alert(a); //
ES6的變數:
let:
不能重複宣告(重複宣告會報錯:a已經宣告過了,const也是);
let a=0;
let a=1;
let是變數,可以修改;
let a=0;
a=1;
alert(a); //1
有塊級作用域;(const同理)
if(true){
let a=0;
}
alert(a);//報錯:a 沒定義(a只在語法塊起作用)
const:不能重複宣告;const是常量,不能修改;有塊級作用域;
const a=0;
a=1;
alert(a); //報錯
下面來看一個經典的運用場景:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用閉包來解決的問題:利用函式墊了一層作用域</title>
</head>
<body>
<input type="button" value="按鈕1">
<input type="button" value="按鈕2">
<input type="button" value="按鈕3">
</body>
<script>
// window.onload=function(){
// var aBtn=document.getElementsByTagName('input');
// for(var i=0;i<aBtn.length;i++){
// aBtn[i].onclick=function(){
// alert(i);//3 3 3
// };
// }
// }
window.onload=function(){
var aBtn=document.getElementsByTagName('input');
for(var i=0;i<aBtn.length;i++){
(function(i){
aBtn[i].onclick=function(){
alert(i);//0 1 2
};
})(i); }
}
</script>
</html>
但是如果用有塊級作用域的let宣告i,就直接可以打印出想要的結果。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>let</title>
</head>
<body>
<input type="button" value="按鈕1">
<input type="button" value="按鈕2">
<input type="button" value="按鈕3">
</body>
<script>
window.onload=function(){
var aBtn=document.getElementsByTagName('input');
for(let i=0;i<aBtn.length;i++){
aBtn[i].onclick=function(){
alert(i);//0 1 2
};
}
}
</script>
</html>
二、箭頭函式
之前函式寫法:
function 名字(){}
ES6寫法:
()=>{}
總結:
就是把名字省略,()後增加一個箭頭;是之前函式的一種簡寫,就像var a=new Array()可以簡寫成var a=[]一樣。
如果只有一個引數,()可以省;
如果只有一個return,{}可以省;(注意沒有或者多餘一個return都不能省)
舉例1:
let show=function(a,b){
alert(a+b);
} let show=(a,b)=>{
alert(a+b);
}
舉例2:
let arr=[2,5,1,9,4];
//arr.sort(function(n1,n2){
// return n1-n2;
//}); //arr.sort((n1,n2)=>{
// return n1-n2;
//}); arr.sort((n1,n2)=>return n1-n2); alert(arr);
三、解構賦值
1. 左右兩邊結構必須一樣
2. 右邊必須是個東西
3. 宣告和賦值不能分開(必須在一句話裡完成)
例如:
// 陣列
let[a,c,x]=[1,2,3];
console.log(a,c,x);// 1 2 3
// json
let{a,b,c}={a:1,b:2,c:3};
console.log(a,b,c);// 1 2 3
// 複雜一點的
let [{a,b},[n1,n2,n3],num,str]=[{a:12,b:5},[1,3,5],9,'lmx'];
console.log(a,b,n1,n2,n3,num,str);
// 粒度根據實際可更改
let [json,arr,num,str]=[{a:12,b:5},[1,3,5],9,'lmx'];
console.log(json,arr,num,str);
錯誤寫法:
// 左右兩邊結構不一樣
let {a,b}=[1,2];
console.log(a,b);
// 右邊不是個東西
let {a,b}={1,2};
console.log(a,b);//Uncaught SyntaxError: Unexpected token ,
// 解構賦值是同步的 不能拆分
let [a,b];//這樣定義是不標準的
[a,b]=[1,2];
console.log(a,b);// Uncaught SyntaxError: Missing initializer in destructuring declaration