let和const、var
let和const、var
一、var声明的变量会挂载在window上,而let和const声明的变量不会
- var a = 100;
- console.log(a,window.a); // 100 100
- let b = 10;
- console.log(b,window.b); // 10 undefined
- const c = 1;
- console.log(c,window.c); // 1 undefin
二、let
用来声明变量,但是所声明的变量只在let
命令所在的代码块内有效
{
let a=12
alert(a)//12
}
alert(a)//报错 找不到
let不像var那样会发生变量提升,所以一定要先声明后使用。
console.log(foo); //undefined
console.log(bar); //报错
var foo = 2;
let bar = 3;
let不允许在相同作用域内重复声明同一个变量。
let a=12; let a=5;//报错 console.log(a)
三、const
const
同样可以创建块作用域变量,同样只在声明所在的块级作用域中有效。但其值是固定的,不可更改,只读。
{
const a=12;
alert(a);//12
}
alert(a)//报错
一旦声明变量,就必须立即初始化,不能留到以后赋值。
//只声明不赋值就会报错,不能使用null占位
const foo; //报错
const和let一样没有变量提升,同样不能重复声明。
如果声明的是复合类型数据,可以修改其属性
const obj = {a:100};
a = 10;
五、三者之间的区别:
- var声明的变量会挂载在window上,而let和const声明的变量不会
- var声明变量存在变量提升,let和const不存在变量提升
- let和const声明形成块作用域,而var不存在此作用域
- 同一作用域下let和const不能声明同名变量,而var可以
注意:在js解析的时候,优先解析const,因为它不能修改的是栈内存在的值和地址。然后解析let 因为没有块作用域可能底层有处理,最后解析var。
标签模板
本质不是模板 而是函数的另一种调用形式
标签就是事先封好的函数 参数就是后面接的字符串
alert`hello`
//等同于
alert(["hello"])
以${}作为分隔符 固定的字符串 放进数组里面 ${}里面的变量依次作为后面的参数
标记模板(函数)的参数:
参数1 :被变量分割成的字符串数组
参数2… :变量
函数的扩展
函数参数的默认值
ES6里面可以给参数设置默认值
1.为了防止报错 不用特地在函数内部处理参数
2.设置了默认值 即使不传参数 程序也不会报错
注意:参数是在函数的局部作用域内设置的局部变量 默认是函数内部声明过的 所以不要使用let在函数内部声明
Symbol
Symbol 是ES6新引入的一种基本数据类型 表示独一无二的值 是js中的第六种基本数据类型
基本数据类型:string number boolean undefined null Symbol
typeof的返回值 string number boolean undefined object function Symbol
特性
Symbol函数生成的数据 是唯一的 即便是参数也是不一样的
-
引入的背景
- 对象的属性名容易产生命名冲突,为保证键名的唯一性,所以es6引入Symbol数据类型,确保创建的每个变量都是独一无二的。
-
特点
-
Symbol类型的数据是类似字符串的数据类型,由于Symbol函数返回的值是原始类型的数据,不是对象,所以Symbol函数前不能使用new命令,否则会报错。
-
可选参数。由于控制台输出不同的Symbol变量时都是Symbol(),所以为了区分,在Symbol变量传入参数进行区分。
-
let a1 = Symbol('a1')
let a2 = Symbol('a2')
- 用法
-
定义对象的唯一属性名
//在对象里用Symbol作为属性名的三种写法 let name = Symbol() //第一种方式:借助数组读取name变量,此时不能用点运算符,点运算符默认后面的参数时字符串 let a = {} a[name] = 'Nick' //第二种方式:构造时声明 let a = { [name]:'Nick' } //第三种Object.defineProperty let a = {} Object.defineProperty(a,name,{value:'Nick'});
- 定义常量
//定义字符串常量 const name = Symbol('Nick')