变量的解构赋值
数组解构赋值
前后模式必须匹配
后面的值是什么格式前面的变量声明就是什么格式
后面的值是二维数组
前面声明的变量也得是二维格式
let [a,b,c] = ["45","56","67"];
console.log(a,b,c) //45 56 67
前多后少
前面声明的变量多,后面赋值的值少,解构不成功,就相当于只声明了变量,但没有赋值,解构不成功的变量值是undefined;
let [a,b,c] = [12,23]
console.log(a,b,c) // 12 23 undefine
前少后多
省略赋值
let [ , , c] = [45,56,67];
console.log(c) //67
不定参数解构赋值 使用... 叫 扩展运算符
let [a,d,...c] = [45,56,48,68]
console.log(c) //48 68
(扩展运算符要写在最后面)
带默认值
先给默认值再解构赋值?还是先解构赋值再给默认值?
let [x,y = (function(){console.log("你好"); return 10;})()] = [12,23]
console.log(y)
没有输出你好,说明不是先给默认值,而是先解构赋值,不再考虑默认值
所以,就是解构不成功的时候,才会走默认值。解构不成功就是没有定义;
var a = null a = [] a = {} a = "" 这都叫定义了;
var a = undefined 这叫没有定义
所有只有解构的时候,后面是undefined的时候,才会走默认值,否则后面给什么就赋值什么;
let [a = 12,b] = [[],45];
console.log(a) //[]
对象解构赋值
变量和属性必须同名,才可以解构赋值
let {name,age} = {name:"王一博",age:22}
console.log(name)//王一博
如果解构失败,值是undefined;
let {name,age} = {age:22};
console.log(name); //undefined
如果变量名跟属性名不一致
let {name:aa,age:bb} = {name:"张三",age:23};
console.log(aa)//张三
前面name是属性 ,后面aa是变量,解构的机制,是对应的属性值赋值给后面的变量
默认值
默认值跟数组解构的默认值一样,解构成功就直接赋值,解构不成功就是没有值,或者是undefined,就走默认值
var {x = 3} = {};
x // 3
var {x, y = 5} = {x: 1};
x // 1
y // 5
var {x: y = 3} = {};
y // 3
var {x: y = 3} = {x: 5};
y // 5
var { message: msg = 'Something went wrong' } = {};
msg // "Something went wrong"
对象解构赋值的注意点
{}前面不能没有东西 前面必须带声明变量的关键字
等号右边在什么情况下能解构?
等号右边的值只要带有length属性,都可以解构
字符串的解构赋值
const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"
函数参数的解构赋值
函数参数的默认值
(带默认值的写后面 函数参数 等号左边是参数 右边是默认值 函数调用时不传参,走函数形参的默认值 ,如果传参,默认值就不走了,走实参)
function move({x = 0, y = 0} = {}) {
return [x, y];
}
move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, 0]
move({}); // [0, 0]
move(); // [0, 0]
function move({x, y} = { x: 0, y: 0 }) {
return [x, y];
}
move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, undefined]
move({}); // [undefined, undefined]
move(); // [0, 0]
函数作用域
函数在调用的时候 ,会形成一个私有的作用域,在这个作用域下声明的变量和参数变量都是私有变量,外界访问不到,同时他在
操作相同的变量时,不会操作外部的;
形参就是赋值,没有变量提升
箭头函数
只适用于匿名函数
let fn = function(){} 匿名函数
做回调函数 fn(12,funciton(){})
匿名函数:只要不是关键字function 声明的函数都叫匿名函数
let fn = (形参) => {函数体}
每个函数结束的时候一定要return
当只有一个 参数时,可以省略小括号()
当函数体只有一行代码 且 return xxx ;可以省略花括号 let fn = x => x //传一个x return一个x
箭头函数的优势
·箭头函数没有this指向
( 函数中改变this指向的方法
1、在函数前提前赋值
2、在函数的结尾处{}.bind(this)
3、在函数结尾处{}.apply(this)或者是{}.call(this)
4、箭头函数 )备注:箭头函数中的this指向当前父级
箭头函数获取参数 不能使用arguments 用...arg
箭头函数不能充当类
函数的角色
函数可以扮演 类 普通函数 function实例
类
每个类身上天生有一个prototype的属性,这个属性是一个对象,里面有一个constructor的属性,属性值是类(函数)本身
new 实例的时候其实就是调用constrctor函数
对象
每个对象天生有一个__proto__的属性,__proto__也是一个对象,这个对象也有一个constructor属性,属性值是他的类
注意:
object是所有对象的基类 包括window event等
普通函数的父类是Function
通过function定义的类,他的父类是Function
所有实例对象的__proto__都指向父类的原型prototype
对象.属性
首先看对象中私有的属性中有没有这个属性,有就直接用,没有就通过__proto__ 向他的父类的原型(prototype)上查找