let和const
let声明的变量只在let命令所在的代码块生效
在声明之前使用会报错,而var则显示undefined。
在语法上称之为“暂时性死区”
我个人理解是当某个变量只在一个代码块内使用时用let比较方便,不会影响到其他地方,也不会有局部变量上升到全局变量的情况出现;也像我们规范中要求写成的let usedData = res;这样的;
function f(){
let x = 5
if (true) {
let n = 10;
}
console.log(n);
n输出为5,不会受if里面的影响;
}
es6允许块级作用域嵌套,每一层都是独立的,不会相互影响;不同层次可以使用相同的变量名。使用前必须有{},否则不存在块级作用域。
const声明一个只读常量,一旦声明后不能改变常量的值,否则报错;
const xxx = 1024
xxx //1024
只声明不赋值也会报错;
const xxx //报错
const的作用域与let相同;只在声明所在的块级作用域内生效,也不能重复声明
const func = {}
func.prop = 123;//为func添加一个属性,可以成功。
//将func指向一个对象,会报错。
func = {};
变量赋值
允许写成
let [a,b,c] = [1,2,3];
本质上这种写法叫匹配模式;只要等号两边模式相同,左边的变量就会赋上对应的值
还有一种不完全结构的方式
let [x,y] = [1,2,3]
//输出为x=1,y=2,
Set结构也可以使用数组的解构赋值
let [x,y,z] = new Set(['a', 'b', 'c']);
对象的解构赋值实际上是下面形式的简写
let {fox: answer} = { fox: "111",bar: "222"}
//最后输出answer=111,而fox=undefined
指定默认值
var {x:y=3} = {};
//输出y=3
var {x: y=3} = {x: 5};
//输出y=5
默认值生效的条件是对象属性值严格等于 undefined
嵌套赋值
let obj = {}
let arr = []
({ foo: obj.prop, bar: arr[0] } = { foo: 123, bar : true})
obj //{prop:123}
arr //[true]
//在嵌套对象中子对象的父属性不存在,那将报错。
let {foo: {bar}} = {baz: 'baz'};
模板字符串
模板字符串是增强版的字符串,用反引号 `` 标识。可以当作普通字符串使用;也可以用来定义多行字符串,或者在字符串中嵌入变量。
在表示多行字符串的时候,所有的空格和缩进都保留在输出中;可以使用trim方法消除。
`xxxxxx`.trim()
需要嵌套变量的时候。将变量写在&{}中;
可以进行运算,引用对象属性。
let x = 1
let y = 2
`${x} + ${y} = ${x+y}`
//"1+2=3"
`${x} + ${y*2} = ${x+y*2}`
//"1+4=5"
let obj = {x:1,y:2};
`${obj.x+obj.y}`
//"3"
模板字符串中可以调用函数
function fn() {
return "hello world";
}
`foo ${fn()} bar`
//foo hello world bar
标签模板
alert`123`
等于
alert(123)
网友评论