let和const
let
块级作用域:一种普遍存在于各个语言中的作用域范围;
{
var a = 10;
let b = 20;
}
console.log(a)//10
console.log(b)// b is not defined
在一个大括号中用let声明的变量在外部不可访问了,每个大括号都是独立的作用域
有了let声明我们在函数外部就无法访问到 i ,i作为下标只存在于for循环中, 所以,这个时候每个i都是独立的;我们在点击的时候可以轻易的获取当前元素的下标,而不用做很多繁琐的处理了
var aLi = document.querySelectorAll("li");
for(let i = 0;i<aLi.length;i++){
aLi[i].onclick = function(){
alert(i);
}
console.log(i);//0 1 2 3
}
JS中var声明一个变量是存在声明提升的,这是JS中的一个缺陷所在, 但是现在的let不存在声明提升
// console.log(a);//undefined
// console.log(b);//b is not defined
// var a = 10;
// let b = 20;
let a = 20;
function foo(){
console.log(a);
let a = 10;
}
foo();//a is not defined
//报错,暂时性死区
//js预编译的时候发现有一个局部的a,所以就不会再去寻找全局的a
//但是在执行的时候他发现局部的a在后面let声明的,所以报错
ES6规定在某个区块中, 一旦用let或const声明一个变量,那么这个区块就变成块级作用域,用let 或者const声明的变量即为该区块绑定, 该变量不受任何变量影响。 在该变量使用let声明前不可以用。在语法上,我们叫这种情况为:暂时性死区 (temporal dead zone,简称 TDZ)
const常量
声明常量:
const a = 20;//常量:不能被修改的量
a = 30;
//Uncaught TypeError:Assignment to constant variable.(未捕获的类型错误:赋值给常量变量)
console.log(Math.PI);//3.141592653589793
Math.PI = 4;
console.log(Math.PI);//3.141592653589793
const arr = [2,3,4,5];
//arr = [3,4,4,6];
//不能修改数组或对象的引用,但是可以通过API取修改内部结构
arr.push(6,7);
console.log(arr);//[2, 3, 4, 5, 6, 7]
扩展运算符 …
三个点号,功能是把数组或类数组对象展开成一系列用逗号隔开的值
var arr = [1,2,3,4,5];
console.log(arr);//Array(5)
console.log(...arr);//1 2 3 4 5 console.log 不会显示逗号,中间其实是有逗号的
function add(arr){
arr.pop();
console.log(arr);
}
var foo = function(a, b, c) {
console.log(a);
console.log(b);
console.log(c);
}
var arr = [1, 2