let: 声明的变量只有在let命令下的代码块有效,也叫块级作用域
const: 声明的变量是只读的,一旦声明常量的值就不能改变,
但是如果用const来声明数组或者对象,则数组,对象下的值可以改变,原因是const指向的变量的地址没有发生改变
let
是在代码块内有效,var
是全局范围有效let
只能声明一次,var
可以多次声明;let
不存在变量提升,但有作用域链从数组和对象中提取值,对变量进行赋值,称为解构赋值
let [a,b,c] = [1,2,3];//a=1,b=2,c=3
let [a,...b] = [1,2,3];//a=1,b=[2,3]
剩余运算符表示用b来接收之后的所有值,所以返回数组
let [a,b,c,d,e] = 'hello';//hello
将字符串拆分成一个个字符来赋值,将字符串转化为对象
let {foo, bar} = { foo: 'aaa',bar: 'bbb'};
console.log(foo);//aaa
console.log(bar);//bbb
let { baz : foo} = {baz : 'ddd'}
console.log(foo);//ddd
console。log(baz);undefind
baz
是模式,foo
才是值,在解构的时候,内部会先寻找同名的属性,赋值给他,所以这里是foo
接收到了ddd
var a = 1;
var b = 2;
[a,b] = [b,a];
function fn() {
return [1,2,3];
}
var [a,b,c] = fn();
var data = {
name : 'ljc',
age : 20
}
var {name,age} = data;
console.log(name + age);//ljc20
var ljc=[1,2,3];
var [,x,]=ljc;
console.log(x);//2
var obj = {x : 1,y : 2, z : 3};
var {y : a} = obj;
console.log(a);//2
console.log(`hello world`);
let str = `<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>`;
模板字符串中嵌入变量,需要将变量名写在
${}
之中
let lovest = 'ljc';
let out = `${lovest}最帅`;
console.log(out);//ljc最帅
function fn () {
console.log('我是ljc');
}
let out = `${fn()}`;//我是ljc
省略同名的属性值,省略方法的function
const name = 'ljc';
const age = 20;
const my = {
name,
age,
say() {
console.log('我是' + name + '今年' + age);
}
}
my.say()//我是ljc,今年20
//ES6
let res = () => {
let a = 3;
console.log(a);
}
//ES5
var rel = function() {
var b = 2;
console.log(b);
}
res();//3
rel();//2
let say = () => {
console.log('ljc');
}
say();//ljc
let test = a => {
console.log(a);
}
test('我是ljc');//我是ljc
let test = (a,b) => {
console.log(a + b);
}
test(2,3);
let say = () => console.log('ljc');
say();//ljc
箭头函数的 this 指向定义时所在的对象
箭头函数没有原型
箭头函数不可以作为构造函数(即不能使用 new)
箭头函数没有 arguments 对象
返回值是一个数组,rest参数必须要放到参数最后
function date(...args) {
console.log(args);
}
date('l','j','c');//['l','j','c']
将一个数组转化成用逗号分隔的参数列表
function add(x,y) {
return x + y;
}
let num = [1, 2];
add(...num)//3
function push(array, ...rest) {
array.push(...rest);//这个是扩展运算符,将...rest转化成参数列表
}
let arr =[1,2];
push(arr,3,4,5);
console.log(arr);//[1,2,3,4,5]
Symbol能够产生独一无二的值,避免与之前的代码产生覆盖。
传入一个值,作为描述字符串,更好的理解这个值的作用
无论传入的值,参数名是否相同,都是独一无二的
let s1 = Symbol();
let s2 = Symbol();
console.log(typeof s1);// symbol
console.log(s1 === s2); // false
let s4 = Symbol.for('ljc');
let s5 = symbol.for('ljc');
console.log(s4 === s5);//true
通过这种方法创建的是可以通过描述字符串得出唯一的symbol
不能与其他数据进行运算
let mySymbol = Symbol();
var a = {};
a[mySymbol] = 'Hello!';
console.log(a);//{ symbol(): 'Hello!' }
Symbol值作为属性名要使用方括号定义,不能使用点运算符
var obj = {}
var a = Symbol('a')
var b = Symbol('b')
obj[a] = 'a'
obj[b] = 'b'
Object.getOwnPropertySymbols(obj)
//[Symbol(a), Symbol(b)]
使用Reflect.ownKeys可以遍历Symbol的键名
var a = Symbol('a');
var b = Symbol('b');
var obj = {
foo: