const pi = 3.14;
pi=4; // 會被忽略
const pi =3.1; //發生錯誤無法重新定義
var pi =3.1; //發生錯誤無法重新定義
for(let x = 1 ;x < 5;x++) {
console.log(x); // 2 3 4
}
// for迴圈裡的let x回被提升到頂端
// 下面的程式碼等同上式
// let x;
// for(x = 1 ;x < 5;x++) { // 此行定義的let x
// console.log(x); // 1 2 3 4
// }
//-----------------------------------
console.log(x); // 4
if(x > 1){
let x = x +1;
console.log(x); // NaN
}
//等同
// if(x > 1){
// let x; // 並未給初始值,所以x = undefined
// x = x +1; // undefined + 1 =NaN
// console.log(x); // NaN
// }
提取等號右邊的值,存放到等號對應的變數。
let [x,y] = [1,2] // 等同於let x =1 , y=2
[x,y] = [x+1,y+2] // x = 1+1 , y =2+2
console.log([x,y]) // [2,4]
let [x]=[1,2] // 等同let x = 1 , 2 會被忽略
let [x,y]=[1] // 等同let x = 1 , y = undefined
let [,x,,y,]=[1,2,3,4,5] // 等同x = 2 , y = 4
let test={n:'Jackson',i:1}
let {n:name,i:id} = test; // name='Jackson' ,id=1
Math是全域變數,以下可以簡化使用方式
let {sin:sin,cos:cos,tan:tan} = Math;
// sin = Math.sin , cos = Math.cos , tan = Math.tan
宣告產生器函式前會多一個 * 。
yield會回傳value與done的物件。
function * gen(){
let a = yield "A";
let b = yield "B";
return "TEST";
}
var c = gen(); // gen為產生器,在被呼叫時並不會被執行
// 當執行next() 產生器才會開始執行,當遇到yield後會停止往下執行
// 待下次再執行next會再繼續往下執行直到遇到yield
c.next(); // {value: "A", done: false}
c.next(); // {value: "B", done: false}
c.next(); // {value: "TEST", done: true}
宣告成產生器,與平常宣告的function 結構不太一樣
var obj_A ={name:'Jackson', id:1, pos: 'taipen'};
// +--------------------+
// |下面的程式碼會有錯誤
// |因為obj_A並不是iterable
// +--------------------+
// for(let i of obj_A){
// ...
// }
//需實做Symbol.iterator
obj_A[Symbol.iterator] = function * (){
for(var i in this){
yield this[i];
}
}
for(var v of obj_A){
console.log(v);
}
// Jackson
// 1
// taipen