目录
1、let、cons、var的区别
2、const对象的属性可以修改吗
3、如果new一个箭头函数会怎么样
4、箭头函数和普通函数的区别:
5、扩展运算符的作用及使用场景
1、let、cons、var的区别
1️⃣:块级作用域:块作用域由{}包括,let和const具有块级作用域,var不存在块级作用域。块级作用域解决了ES5中的两个问题:
- 跨级作用域:块作用域由{}包括,let和const具有块级作用域,var不存在块级作用域。块级作用域解决了ES5两个问题:
💫:内层变量可能覆盖外层变量
💫:用来计数的循环变量泄露为全局变量
for (var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}
❗:此时输出的是5,这是因为循环变量 i 被泄漏到了全局作用域中。
解决方案:使用let或者循环函数来解决。
for (let i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}
循环函数:
for (var i = 0; i < 5; i++) {
(function(i) {
setTimeout(function() {
console.log(i);
}, 1000);
})(i);
}
2️⃣:变量提升:var存在变量提升,let和const不存在变量提升,即变量只能在声明之后使用,否则会报错
3️⃣:给全局添加属性:浏览器的全局对象是window,Node的全局对象是gloabl。var声明的变量为全局变量,并且会将改变量添加为全局对象的属性,但是let和const不会
4️⃣:重复声明:var可以重复声明变量,const和let不允许重复声明变量
5️⃣:暂时性死区:let和const命令声明变量之前 ,该变量都是不可用的,称为暂时性死区。var不存在暂时性死区。
6️⃣:初始值设置:在变量声明时,var和let可以不用设置初始值。而const必须设置初始值
7️⃣:指针指向:let和const都是ES6新增的用于创建变量的语法。let创建的变量是可以更改指针指向。但const声明的变量是不允许改变指针的指向。
2、const对象的属性可以修改吗
对象的属性可以修改,但是变量不能修改
原因:
1. 声明的变量在内存中被分配了一个固定的地址,这个地址中存储了变量的值,而const在声明变量赋值之后就会被锁定,不能再修改。
2. 使用 let 声明的变量是允许重新赋值的
3. 对于引用类型的数据来说,变量指向数据的内存地址,保存的只是一个指针,const只能保证这个指针式固定不变的,而指向的数据结构是不能完全控制的。
3、如果new一个箭头函数会怎么样
箭头函数没有prototype,也没有this指向,也不可以使用arguments参数,所以不能new一个箭头函数
arguments参数:是一个类数组对象,不是数组,除了有数组的length属性,没有数组的任何属性。可以通过Array.from()或者扩展运算符将其转化为真正的数组。
4、箭头函数和普通函数的区别:
1️⃣:箭头函数比普通函数更加简洁
- 如果没有参数,可直接写空括号即可
- 如果只有一个参数,可以省去一个空括号即可
- 如果函数体的返回值只有一句,可以省略大括号
- 如果函数体不需要返回值,且只有一句话,则可以在语句前面加一个void关键字。最常见的就是调用一个函数
2️⃣:箭头函数没有自己的this
箭头函数的this指向是在自己的作用域的上一层继承this
3️⃣:call、apply、bind不能改变箭头函数中this的指向
4️⃣:箭头函数不能作为构造函数使用
5️⃣:箭头函数不能用作Generator函数,不能使用yeild关键字
因为Generator函数是由生成器函数返回的,而生成器函数是与生成器函数的实例相绑定的,所以不能使用yeild关键字
5、扩展运算符的作用及使用场景
🔰:对象扩展运算符
对象扩展运算符用于取出参数对象中的所有可遍历属性
使用场景:
1️⃣:自定义属性,常用作动态菜单渲染中,需要添加自定义的属性
let person = {name:'Mike',age:51}
let P1 = {...person,gender:'Male'}
console.log(P1);
2️⃣:redux中的reducer函数中的state对象要求不能直接修改,可以通过扩展运算符把修改的对象复制一遍,然后产生一个新的对象返回。
🔰:数组扩展运算符:
数组扩展运算符可以将一个数组转化为用逗号分隔的数组。
使用场景:
1️⃣:将数组转化为参数序列
function add(x,y) {
return x+y
}
const numbers = [1,2]
add(...numbers)
2️⃣:合并数组
const arr1 = [1,2,3,4,5]
const arr2 = [4,...arr1,5,678]
console.log(arr2);
3️⃣:扩展运算符与解构赋值结合起来,用于生成数组
const arr1 = [1,2,3,4,5]
const [first,...rest] = [1,2,3,4,5]
console.log(rest); 输出2,3,4,5
console.log(first); 输出1
4️⃣:将字符串转化为真正的数组
const strToArr = [...'hello']
console.log(strToArr);
5️⃣:将arguments对象转化为真实数组
function func1(a, b, c) {
console.log([...arguments]); 输出[ 1, 2, 3 ]
}
func1(1, 2, 3);
将arguments转化为真正的数组还可以使用Array.prototype.slice.call(arguments)方法
Array.prototype.slice接收参数返回一个新的数组,然后通过
call()
方法将arguments
作为 Array.prototype.slice() 的执行上下文来使用它的slice()
方法