//块级作用域 好处,可以去防止变量的污染
//变量提升,此时存在变量提升,就是预编译的过程
var num = 100;
function fn(){
num undefined
console.log(num);
if(false){
//num=10
var num = 10;
}
}
fn()
//let作用1.let只在它所在的区域内有效 2.不存在变量提升
//3.暂时性死区 4.不允许重复声明
//前者出现变量提升,后者是因为let改变了语法行为,它声明的变量一定要在声明后使用。
console.log(foo);
var foo = 2;
console.log(bar);
let bar = 1;
//let,在闭包中产生的问题使用let来解决
var arr = [];
for(var i = 0; i < 10; i++){
(function(j){
arr[j] = function(){
console.log(j);
}
})(i)
}
arr[3]();
//此时i的作用域不同,let i = 0的作用域在外部,arr[i]中的作用域在内部,因而就不会产生闭包问题
for(let i = 0; i < 10; i++){
arr[i] = function(){
console.log(i)
}
}
arr[9]();
//暂时性死区,只要块级元素的作用域存在let,它所声明的变量就会绑定在这个区域内,不会受到外部变量的影响
//总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
if (true) {
// 代码区
tmp = ‘abc’; // ReferenceError
console.log(tmp); // ReferenceError
let tmp; // 暂时性死区的辨别标志
console.log(tmp); // undefined
tmp = 123;
console.log(tmp); // 123
}
//const 声明一个只读常量,一旦声明常量的值就不能改变,使用const变量时,必须要给变量赋值否则就会报错
//const的作用域与let命令相同,只在声明所在的块级作用域内有效
const PI;//错误
const Pi= Math.PI;
console.log(Pi)
//数组的解构赋值
//ES6允许一定模式,从数组和对象中取值,对变量进行赋值,这称为解构赋值
//在ES6中下面的写法是被允许的
let [a, b, c] = [2, 3, 4];
console.log(a, b, c);//此时对应 a:2 b:3 c:4
let [, , third] = [“foo”, “bar”, “fee”];
console.log(third); //此时得third为字符串fee
let [head, …end] = [1, 2, 3, 4, 5];
console.log(head, end);//此时head为1 end为[2,3,4,5]
let [x, y, …z] = [‘a’];
console.log(x,y,z);// x: “a” y undefined z []
如果结构不成功,变量得值就为undefiend
//不完全解构
let [a,[b],c] = [1,[2,3],4];
console.log(a,b,c);//此时得a为1 b为2 c为4
//如果等号得右边不是数组,那么也将会报错,下面的所有例子中都会出现报错的情况
let [foo] = 1;
let [foo] = false;
let [foo] = NaN;
let [foo] = undefined;
let [foo] = null;
let [foo] = {};
//对于Set结构,也可以使用数组的解析赋值,原则上只要某种数据结构具有Iterator接口,都可以采用数组形式的解构赋值
let [x,y,z] = new Set([“a”,“b”,“c”]);
console.log(x,y,z); // x: ‘a’ y: ‘b’ z: ‘c’
//默认值,解析解构允许指定默认值
let [foo = true] = [];//此时的foo = true
let [x ,y = ‘b’] = [‘a’]//此时 x: ‘a’ y: ‘b’
let[x = 1] = [undefined]; //此时的x为1
let[x = 1] = [null]; //此时的x为null
//当默认值是一个表达式是,只有用到默认值时,函数才会执行
function fn(){
console.log(‘you are so cool’);
}
let[a = fn()] = [1];//此时的a值为1
console.log(a);
//默认值也可以引用解构赋值的其他变量
let[x = 1,y = x] = []; // x:1 y:1
let[x = 1,y = x] = [2]; // x:2 y:2
let[x = 1,y = x] = [1,2]; //x:1 y:2
let[x = y, y = 1] = [];//此时会报错,因为y作x的默认值时,还没有被声明
//解构对象,数组的解构是按照数组中元素的位置来决定的,而对象的解构是按照变量名是否相等来解构的
//如果左边的变量名在右边没有与其对应的值,那么解构出来的变量将为undefined
let {bar,foo} = { bar : ‘abc’, foo : ‘efg’}; // 此时bar: ‘abc’ foo: ‘efg’
let {fee} = { ana : ‘aaa’};//fee此时为undefined
console.log(bar,foo,fee);
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
总结一下
面试前要精心做好准备,简历上写的知识点和原理都需要准备好,项目上多想想难点和亮点,这是面试时能和别人不一样的地方。
还有就是表现出自己的谦虚好学,以及对于未来持续进阶的规划,企业招人更偏爱稳定的人。
万事开头难,但是程序员这一条路坚持几年后发展空间还是非常大的,一切重在坚持。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
为了帮助大家更好更高效的准备面试,特别整理了《前端工程师面试手册》电子稿文件。
前端面试题汇总
tps://bbs.csdn.net/topics/618166371)**
为了帮助大家更好更高效的准备面试,特别整理了《前端工程师面试手册》电子稿文件。
前端面试题汇总