JavaScript从入门到精通之入门篇(二)函数和数组,2024年最新web前端笔试面试题

本文提供了一份2024年最新Web前端学习资料,涵盖基础知识到进阶课程,强调自学体系化的重要性,并提到了变量作用域、函数、数组操作、递归和return语句等关键概念,以及如何通过实践和面试准备进行技术提升。
摘要由CSDN通过智能技术生成

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文

  1. 普通函数和变量重名,变量会覆盖普通函数;

例子:

// 1. 普通函数和匿名函数重名

function fn() {

console.log(‘我是普通函数’);

}

var fn = function() {

console.log(‘我是匿名函数’);

}

fn(); // 输出:我是匿名函数

// 2. 普通函数和变量重名

function fn() {

console.log(‘我是普通函数’);

}

var fn = 10;

fn(); // 调用失败,会报fn未定义的错误

匿名函数
  • 定义: var 变量 = function() { 代码块}

  • 将匿名函数赋值给变量,执行变量函数就是执行这个匿名函数,匿名函数不能再定义该函数之前进行调用

var fn = function() {

console.log(‘匿名函数’);

}

fn(); // 只能在定义之后调用匿名函数

  • 不建议使用匿名函数,通常使用addEventListener() 方法替代

// 兼容性极好 ie6+, 但是不建议使用

btn.onclick = function() {

console.log(this);

}

// 通常用下面方式代替,兼容性 ie8+

btn.addEventListener(‘click’, clickHandler);

function clickHandler(e) {

console.log(e);

}

构造函数
  • 定义:var 变量 = new Function(参数字符串, 执行语句代码块字符串)

  • 使用全字符串,参数在最前面,后面的字符串内容是执行代码的语句

  • 缺点:代码会做2次执行,第一次会将函数中的字符串解析为普通代码,第二次执行该代码,因此,效率极低

  • 优点:可以用任何语言传入该js代码并且执行

var fn = new Function(“a”, “console.log(a)”);

fn(10); // 输出 10

自执行函数
  • 定义:(function () { 代码块}) ()

  • 自执行函数只能执行一次,执行完成后再也找不到,变成孤儿对象(但是有引用,不能被回收)

(function () {

console.log(‘自执行函数’);

})();

变量的作用域

全局变量
  • 所谓全局变量就是在script标签中直接使用var定义的变量

  • 当在script中定义了变量,在定义前调用是undefined,这是因为定义变量是在内存中开辟了该变量的存储位置,并在代码解释执行时将值存在栈中,如果提前调用,计算机在内存中找不到对应的存储位置,所以会报undefined

console.log(s); // 报错:s is not defined

var s = 100;

  • 如果在上一个script中调用下一个script中定义的变量,因为没有开辟存储空间,所以永远报错
  • 一旦定义变量完成后,在后面的script中都是可以任意调用的,因为这些变量都是全局变量
局部变量
  • 所谓局部变量就是在函数中使用var定义的变量

  • 函数中的定义的局部变量是有作用域的,他的范围仅限于该函数内部,函数运行完成后,函数内定义的变量将会自动销毁

var s;

function fn() {

var c = 10; // 这是局部变量

c += 3;

console.log©; // 输出:13

// 可以在函数中修改全局变量的值,修改后,全局调用有效

s == 10;

console.log(s) // 输出:10

}

fn();

局部变量和全局变量重名
  • 如果在函数中定义了某个局部变量名,那么在该函数中所有的这个变量都是局部变量,不能通过直接使用变量名的方法调用到外部同名的全局变量

例子:

var s = 10;

function fn() {

var s = 20;

s += 20;

window.s += 10; // 想要在函数内调用与局部变量同名的全局变量,需要加上window前缀

console.log(s); // 输出:40

console.log(window.s); // 输出:20

}

fn();

典型例子

var s = 10;

function fn() {

console.log(s); // 输出:undefined

s += 20;

console.log(s); // 输出:NaN 因为是 undefined += 10

var s = 20; // 函数内一旦定义,在其前后调用都为布局变量

}

fn();

参数

定义

由于js是一种弱类型语言,在使用参数时需要注意以下两点

  • 参数类型:因为参数类型不能固定,如果是对外开放的函数参数,一定需要在代码中判断输入参数的类型

  • 初始化:在ES5中函数的参数不能设置初始化值,所以需要在执行代码时给他自定义一个默认的初始值;而在ES6中是可有初始化参数设置,直接可以使用,比如function(a, b, type='+'),参数type默认是"+"

实参和形参
对象参数

如果参数为对象,传入的是引用对象的地址

function fn(o) {

var obj = {a: 1};

console.log(o === obj); // false

console.log(o === obj3); // true

}

var obj3 = {a: 3};

fn(obj3);

函数参数–回调

参数如果传入的是一个函数名,在当前函数中运行了这个参数,这就是回调

function fn1(o, fn){

o.a += 1;

fn(o); // 执行回调

console.log(o.a); // 输出: 12

}

function fn2(_o){

_o.a += 10;

}

var obj = {a: 1};

fn1(obj, fn2);

函数执行自己–递归

var sum1 = 0;

var i = 0;

function fn() {

if (i === 100){

return; // 跳出函数外

}

sum += i;

i++;

fn(); // 执行回调

}

return

注意事项
  • return语句会终止函数的执行并返回函数的值,return是JavaScript里函数返回值的关键字

  • 一个函数内处理的结果可以使用return返回,这样在调用函数的地方就可以用变量接受返回结果

  • return关键字内任何类型的变量数据或表达式都可以进行返回,甚至什么都不返回也可以

  • return也可以作为阻止后续代码执行的语句被使用

  • function abc() { if (bool) return}这样可以有效的控制语句在一定的条件下执行,不过一定要与break区分,break是用在条件当中,跳出的也仅仅是条件和循环,但是return却可以跳出函数,仅仅是针对函数使用,如果没有函数是不能使用return的

应用场景
  1. 返回一个数据

function createObj(_a) {

return {a: _a}; // 返回一个数据对象

}

console.log(createObj(3) === createObj(3)); // 输出:false

  1. 工厂模式或者单例模式

var box;

function createBox(_a, _b) {

if (!box) {

box = {};

}

box.a = _a;

box.b = _b;

return box;

}

console.log(createBox(3, 5) === createBox(10, 20)); // 输出: true

  1. 通过参数传入的对象

function setObjProper(obj) {

obj = obj || {}; // 宽模式

obj.n = 3;

return obj;

}

var obj = setObjProper({});

var obj1 = setObjProper();

var obj2 = {a: 5};

console.log(obj2 === setObjProper(obj2)); // 输出:true

console.log(obj, obj1); // 输出:{n: 3} {n: 3}

  1. 如果参数一个函数,返回的是回调函数的结果

function fn1(fn) {

var obj = {};

return fn(obj); // 返回回调函数的结果

}

function fn2(obj) {

obj.a = 10;

return obj;

}

console.log(fn1(fn2)); // 输出:{a: 10}

  1. 返回的是一个私密的对象 (闭包)

function fn() {

return function () {

console.log(‘aaa’);

}

}

fn()(); // 输出: aaa

  1. 返回一个数组,返回多个元素

  2. 返回一个对象,返回多个元素

  3. 返回一个函数体

  4. 跳出

2.数组


定义

  • 数据将无序的数据做有序的排列,存储在一个变量中

  • 原生JS中没有数组类型,原生JS中的数据可以存储多个不同类型的数据(弱类型)

  • Array.isArray(arr) 是判断arr是否为数组

  • 数组中,标识元素所在的位置,叫做下标,也叫做索引

  • 数组中,标识元素的内容,arr[0]这个就叫做下标变量

数组的创建

  1. 字面量创建

var arr = [1, 2, 3, 4, 5]

  1. 对象构造函数创建

var arr = new Object([1, 2, 3, 4, 5])

  1. 构造函数创建

var arr = new Array()

注意:

  • 创建数组时,有且仅有一个数值类型的参数,这个参数就是数组的长度

  • 创建数组时,有且仅有一个非数组类型的参数或者有两个或两个以上的参数,这些参数都是数组的元素

数组的长度

  • 数组的长度是可以设置的

  • 将数组的长度设置为0,表示清空数组

  • 如果数组的长度小于原数组长度,意味着将数组从0位截取到指定位置

var arr = [1, 2, 3, 4, 5];

arr[arr.length-1] = 6; // 将数组中最后一个元素5替换为6

arr[arr.length] = 6; // 给数组的尾部添加一个新元素6

数组的遍历

  1. for循环遍历

var arr = [1, 2, 3, 4, 5];

for (let i = 0; i < arr.length; i++) {

console.log(i + ‘=====’ + arr[i]);

// 输出: 0=====1

// 1=====2

// 2=====3

// 3=====4

// 4=====5

}

  1. for in 遍历 (能遍历出数组中所有的对象)

var arr = [1, 2, 3, 4, 5];

arr.key = 100;

for (let prop in arr) {

console.log(prop + ‘=====’ + arr[prop]);

// 输出: 0=====1

// 1=====2

// 2=====3

// 3=====4

// 4=====5

// key=====100

}

  1. forEach遍历

forEach遍历当前数组,没有返回值,不会返回新数组

var arr = [1, 2, 3, 4, 5];

arr.forEach(function(t, i, arr)) {// 参数为:元素值,元素下标,数组对象

console.log(t, i, arr)

})

  1. map遍历

map遍历数组,将当前数组中的元素返回给新数组,不适用return时,新数组的长度与原数组相同,但是每个元素都是undefined

var arr = [1, 2, 3, 4, 5];

arr = arr.map(function (t) {

if (t % 2 === 0) { // 数组元素中偶数元素 + 1

return t + 1;

}

return t;

});

console.log(arr); // 输出:[1, 3, 3, 5, 5]

冒泡排序

var arr = [6, 3, 4, 5, 7, 1, 2, 9, 0, 8];

// 要点1: 外层循环从后向前

for (var i = arr.length; i > 0; i–) {

// 要点2:内层循环从前向后

for (var j = 0; j < arr.length; j++) {

// 要点3:只判断内层循环的当前为和下一位的大小,然后互换

if (arr[j] > arr[j+1]) { // 升序: j>j+1 降序:j<j+1

var temp = arr[j];

arr[j] = arr[j+1];

arr[j+1] = temp;

}

}

}

console.log(arr); // 输出:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

选择排序

var arr = [6, 3, 4, 5, 7, 1, 2, 9, 0, 8];

// 要点1:外层循环从头到尾

for (var i = 0; i < arr.length; i++) {

// 要点2:每次初始最小值是当前循环所在的值

var min = i;

// 要点3:从当前所在值的下一项到尾部循环

for (var j = min + 1; j < arr.length; j++) {

// 要点4:比较大小,找出后面元素中最小值所在的下标

if (arr[min] > arr[j]) { // 升序:min>j 降序:min<j

min = j;

}

}

// 要点5:互换当前下标值和最小值的下标值

var temp = arr[i];

arr[i] = arr[min];

arr[min] = temp;

}

console.log(arr) // 输出:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

数组的方法

最后

技术是没有终点的,也是学不完的,最重要的是活着、不秃。零基础入门的时候看书还是看视频,我觉得成年人,何必做选择题呢,两个都要。喜欢看书就看书,喜欢看视频就看视频。最重要的是在自学的过程中,一定不要眼高手低,要实战,把学到的技术投入到项目当中,解决问题,之后进一步锤炼自己的技术。

技术学到手后,就要开始准备面试了,找工作的时候一定要好好准备简历,毕竟简历是找工作的敲门砖,还有就是要多做面试题,复习巩固。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
i++) {

// 要点2:每次初始最小值是当前循环所在的值

var min = i;

// 要点3:从当前所在值的下一项到尾部循环

for (var j = min + 1; j < arr.length; j++) {

// 要点4:比较大小,找出后面元素中最小值所在的下标

if (arr[min] > arr[j]) { // 升序:min>j 降序:min<j

min = j;

}

}

// 要点5:互换当前下标值和最小值的下标值

var temp = arr[i];

arr[i] = arr[min];

arr[min] = temp;

}

console.log(arr) // 输出:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

数组的方法

最后

技术是没有终点的,也是学不完的,最重要的是活着、不秃。零基础入门的时候看书还是看视频,我觉得成年人,何必做选择题呢,两个都要。喜欢看书就看书,喜欢看视频就看视频。最重要的是在自学的过程中,一定不要眼高手低,要实战,把学到的技术投入到项目当中,解决问题,之后进一步锤炼自己的技术。

技术学到手后,就要开始准备面试了,找工作的时候一定要好好准备简历,毕竟简历是找工作的敲门砖,还有就是要多做面试题,复习巩固。

[外链图片转存中…(img-OPLydZRB-1713310544492)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-pRH3FdvA-1713310544492)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值