1、let、const和var的區別
let用於聲明變量,const聲明常量。const聲明常量時,必須在聲明的同時賦值;對普通常量聲明後不能再修改;對引用類型的常量,指向對象存儲地址的指針,可以修改其中的內容。
let和const不存在變量提升、重複聲明變量、使用未經聲明的變量(ES6強制開啓嚴格模式)都會報錯。var有變量提升、可以重複聲明變量。
console.log(i); // undefined
var i=1;
console.log(j); // Uncaught ReferenceError: j is not defined
let j=2;
function func(){
let b=100;
var b=10;
}
func(); // Uncaught SyntaxError: Identifier 'b' has already been declared
function add(num){
let num;
}
add(); // Uncaught SyntaxError: Identifier 'num' has already been declared
let和const只在塊作用域中有效。
// ES5
var a=[];
for(var i=0;i<10;i++){
a[i]=function(){
console.log(i);
};
}
a[6](); // 10
var a=[];
for(var i=0;i<10;i++){
a[i]=(function(i){
return function(){
console.log(i);
}
})(i);
}
a[6](); // 6
// ES6
var a=[];
for(let i=0;i<10;i++){
a[i]=function(){
console.log(i);
};
}
a[6](); // 6
2、聲明變量的方式
ES5:var a; var b=1; function add(a){}
ES6:let a; let b=1; const b=1; class Point{} import { foo } from 'my_module';
2、Object.assign()函數的作用及用法,舉例說明
Object.assign方法用於對象的合併,將源對象的所有可枚舉屬性,複製到目標對象。第一個參數是目標對象,後面的參數都是源對象。如果目標對象與源對象或多個源對象有同名屬性,則後面的屬性會覆蓋前面的屬性。
如果只有一個參數,Object.assign會直接返回該參數。如果該參數不是對象,則會先轉成對象,然後返回。由於undefined和null無法轉成對象,所以如果它們作爲參數,就會報錯。
如果非對象參數非首參數,那麼處理規則有所不同。這些參數都會轉成對象,如果無法轉成對象,就會跳過。這意味着,如果undefined和null不在首參數,就不會報錯。數值、字符串和布爾值,除了字符串會以數組形式,拷貝入目標對象,其它值都不會產生效果。
只拷貝源對象的自身屬性,不拷貝繼承屬性,也不拷貝不可枚舉的屬性。
淺拷貝,而不是深拷貝,如果源對象某個屬性的值是對象,那麼目標對象拷貝得到的是這個對象的引用。
只能進行值的複製,如果要複製的值是一個取值函數,那麼將求值後再複製。
深拷貝和淺拷貝
3、函數聲明
const add=(a,b)=>{return a+b} // ES6
const add=(a,b)=>a+b // ES6
function add(a,b){return a+b;}
const add=function(a,b){return a+b};