let是ES中推荐的定义方式,默认情况下javascript中并没有块级(block)作用域,let则是块级定义域
let 关键词声明的变量不具备变量提升(hoisting)特性
let 和 const 声明只在最靠近的一个块中(花括号内)有效
当使用常量 const 声明时,请使用大写变量,如:CAPITAL_CASING
const 在声明时必须被赋值
let和var的区别
let x=100;
var y=100;
if(true){
let x=200;
var y=200;
console.log("x的值:"+x);
console.log("y的值:"+y)
}
console.log("x的值:"+x);
console.log("y的值:"+y);
x的值:200
y的值:200
x的值:100
y的值:200
const
被const修饰的变量,值不可以改变。本质上指的是内存地址不可变,所以在修饰对象的时候,对象的引用不可变,但是对象的属性却是可以改变的。
1、以下的NAME必须在初始化时赋值,且只有一次赋值机会。
const NAME="Tom";
console.group("关于const。。。");
console.log(NAME);
关于const。。。
Tom
2、修饰类时,类无法实例化
const People={
name:"Jack",
age:19
};
console.log(People.name);
//不可实例化
jack=new People();
3、以下对象都可以运行,其中cat对象实例化了两次,而被const修饰的dog对象,只可以被实例化一次,dog=new Animal()
function Animal(name,age) {
this.name=name;
this.age=age;
this.hello=function() {
console.log("大家好,我是"+name)
}
}
var cat=new Animal("Sally",19);
cat.hello();
cat=new Animal("Tom",10);
cat.hello();
const dog=new Animal("Jack",5);
dog.hello();
大家好,我是Sally
大家好,我是Tom
大家好,我是Jack
因为对象的内存已经是固定的,但是对象的属性却没固定,所以可以更改,而且即使改变的对象的属性,但是方法的内存也是固定的,所以打印的数据还是固定的。
dog.name="Tim";
dog.hello();
console.log(dog.name);
大家好,我是Jack
Tim
稍作修改,如下
function Animal(age) {
this.age=age;
this.hello=function(name) {
this.name=name;
console.log("大家好,我是"+name)
}
}
const dog=new Animal(19);
dog.hello("Tom");
dog.name="Tim";
dog.hello();
dog.hello("jack");
大家好,我是Tom
大家好,我是undefined
大家好,我是jack