let
不能重复声明
// var
var a = 123;
var a = 345
// let
let a = 123;
let a = 345;
块级作用域
// var
{
var a = 123;
}
console.log(a)
// let
{
let a = 123
}
console.log(a)
不存在变量提升
// var undefined
console.log(a);
var a = 123;
// let 报错
console.log(a);
let a = 123;
不影响作用域链
{
let a = 123;
function fn() {
console.log(a);
}
fn();
}
const
- 一定要赋初始值
- 一般常量使用大写(潜规则)
- 常量的值不能修改
- 块级作用域
- 对于数组和对象的修改,不算做对常量的修改,不会报错
const TEAM = ['Uzi','Mlxg','Ming','Letme'];
TEAM.push('Meiko');
变量的解构赋值
// 数组的结构
const F4 = ['小沈阳','刘能','赵四','宋小宝'];
let [xiao, liu, zhao, song] = F4;
console.log(xiao);
console.log(liu);
console.log(zhao);
console.log(song);
//对象的解构
const zhao = {
name: '赵本山',
age: '不详',
xiaopin: function() {
console.log("我可以演小品");
}
};
let {name, age, xiaopin} = zhao;
console.log(zhao);
console.log(age);
console.log(xiaopin);
// xiaopin();
zhao.xiaopin();
模板字符串
- 引入新的声明字符串方式:反引号
声明
let str = `我也是一个字符串`
console.log(str, typeof str);
内容中可以直接出现换行符
let str = `<ul>
<li>
沈腾
</li>
</ul>`;
变量拼接
let lovest = '魏翔';
let out = `${lovest}是我心目中最搞笑的演员`
console.log(out);
对象的简化写法
let name = '';
let change = function() {
console.log('');
}
const school = {
name,
change,
/*
improve1: function() {
}
*/
improve2() {
}
}
箭头函数
- 适合与this无关的回调(比如定时器,数组的方法回调)
- 不适合与this有关的回调(DOM元素的事件回调,对象的方法)
this是静态的,this始终指向函数声明时所在作用域下的this的值
let gatName() {
console.log(this.name);
}
let getName2 = () => {
console.log(this.name);
}
window.name = '尚硅谷'
const school = {
name: "ATGUIGU"
}
// 直接调用
// getName(); 尚硅谷
// getName2(); 尚硅谷
// call方法调用
// getName.call(school); ATGUIGU
// getName2.call(school); 尚硅谷
不能作为构造实例化对象
// 反例
let Person = (name, age) => {
this.name = name;
this.age = age;
}
let me = new Person('xiao',30);
console.log(me);
不能使用arguments变量
// 反例
let fn = () => {
console.log(arguments);
}
fn(1,2,3);
箭头函数的简写
省略小括号(当形参有且只有一个的时候)
/*
let add = (n) => {
return n + n;
}
*/
let add = n => {
return n + n;
}
console.log(add(9));
省略花括号,当代码体只有一条语句的时候
/*
let pow = (n) => {
return n * n;
}
*/
let pow = n => n*n;
console.log(pow(9));
函数参数的默认值
形参初始值,一般位置靠后(潜规则)
function add(a,b,c=10) {
return a + b + c;
}
let result1 = add(1,2,3);
let result2 = add(1,2);
console.log(result1); // 6
console.log(result2); // 13
与解构赋值结合
function connect({host="127.0.0.1", username="", password, port}) {
console.log(host);
}
connect({
host: 'atguigu.com',
username: 'root',
password: 'root',
port: 3306
})
rest参数
// es5的获取实参方式:arguments 得到对象
function date1() {
console.log(arguments);
}
date1(1,2,3);
// es6的rest参数 得到数组,可以使用数组的方法:filter some every map
function date2(...args) {
console.log(args);
}
date2(1,2,3);
// rest参数必须要放到参数最后
function fn(a,b,...args) {
console.log(a);
console.log(b);
console.log(args);
}
fn(1,2,3,4,5,6);
扩展运算符
- 扩展运算符能将数组转化为逗号分隔的参数序列
用法
// 声明一个数组
const tfboys = ['易烊千玺','王源','王俊凯'];
// 声明一个函数
function chunwan() {
console.log(arguments);
}
chunwan(tfboys); // 得到一个参数,数组
chunwan(...tfboys); // 得到三个参数
// 等同于chunwan('易烊千玺','王源','王俊凯')
可以复制对象,不能展开对象
let person = {name: 'tom', age: 18};
let person2 = {...person};
person.name = 'jerry';
console.log(person.name); //jerry
console.log(person2.name); //tom
适用场景
数组的合并
const kuaizi = ['王太利','肖央'];
const fenghuang = ['曾毅','玲花'];
// const zuixuanxiaopingguo = kuazi.concat(fenghuang);
const zuixuanxiaopingguo = [...kuaizi, ...fenghuang];
数组的克隆(有引用类型是浅拷贝)
const sanzhihua = ['E','G','M'];
const sanyecao = [...sanzhihua];
将伪数组转化为真正的数组
const divs = document.querySelectorAll('div'); //Obj
const divArr = [...divs]; //arguments也可以转,但是有rest,不需要
最简单面试题
有一个数组,所有值都是number类型的,计算和。
function sum(...numbers) {
return numbers.reduce((preValue,currentValue)=>{
return preValue + currentValue;
});
}
console.log(sum(1,2,3,4));
Q.E.D.