for (var i = 0; i < 10; i++) {
setTimeout(function(){
console.log(i);
})
}
// 输出十个 10
for (let j = 0; j < 10; j++) {
setTimeout(function(){
console.log(j);
})
}
// 输出 0123456789
变量
i
是用
var
声明的,在全局范围内有效,所以全局中只有一个变量
i,
每次循环时,
setTimeout
定时器里面的
i
指的是全局
变量
i
,而循环里的十个
setTimeout
是在循环结束后才执行,所以此时的
i
都是
10
。
变量
j
是用
let
声明的,当前的
j
只在本轮循环中有效,每次循环的
j
其实都是一个新的变量,所以
setTimeout
定时器里面的
j
其实是不同的变量,即最后输出
12345
。(若每次循环的变量
j
都是重新声明的,如何知道前一个循环的值?这是因为
JavaScript
引擎内部会记住前一个循环的值)。
const 声明一个只读的常量,一旦声明,常量的值就不能改变。这意味着一旦声明必须初始化,否则会报错。
let 不存在变量提升,var 会变量提升:所以当脚本开始运行的时候,var定义的变量 已经存在了,但是还没有赋值,所以会输出
undefine
ES6 明确规定,代码块内如果存在 let 或者 const,代码块会对这些命令声明的变量从块的开始就形成一个封闭作用域。
const 如何做到变量在声明初始化之后不允许改变的?如何做到变量在声明初始化之后不允许改变的?
const 保证变量指向的内存地址所保存的数据不允许改动。
而简单类型和复合类型保存值的方式是不同的。
简单类型简单类型(数值 number、字符串 string 、布尔值 boolean),值就保存在变量指向的那个内存地址,因此 const 声明的简单类
型变量等同于常量。
复杂类型复杂类型(对象 object,数组 array,函数 function),变量指向的内存地址其实是保存了一个指向实际数据的指针,所以
const 只能保证指针是固定的,至于指针指向的数据结构变不变就无法控制了,所以使用 const 声明复杂类型对象时要慎重。
2.模版字变量模版字变量
**在ES6之前,将字符串连接到一起的方法是+或者concat()方法,**如
const student = {
name: 'Richard Kalehoff',
guardian: 'Mr. Kalehoff'
};
const teacher = {
name: 'Mrs. Wilson',
room: 'N231'
}
let message = student.name + ' please see ' + teacher.name + ' in ' + teacher.room + ' to pick up your report card.';
模板字面量本质上是包含嵌入式表达式的字符串字面量模板字面量本质上是包含嵌入式表达式的字符串字面量.
模板字面量用倒引号 ( “ )倒引号在1的左边可以包含用 ${expression} 表示的占位符
let message = `${student.name} please see ${teacher.name} in ${teacher.room} to pick up your report card.`;
3.解构赋值解构赋值
定义:定义:
解构赋值是对赋值运算符的扩展。解构赋值是对赋值运算符的扩展。
他是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值。他是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值。
在代码书写上简洁且易读,语义更加清晰明了;也方便了复杂对象中数据字段获取。在代码书写上简洁且易读,语义更加清晰明了;也方便了复杂对象中数据字段获取。
解构模型解构模型
解构的源,解构赋值表达式的右边部分。解构的源,解构赋值表达式的右边部分。
解构的目标,解构赋值表达式的左边部分。解构的目标,解构赋值表达式的左边部分。
解构数组的值解构数组的值:
const point = [10, 25, -34];
const [x, y, z] = point;
console.log(x, y, z);