资源描述
www.coding-www.coding-序言可能是市面上比较好的 Javascript 高级教程,适合有一定 Javascript 基础的同学学习。欢迎来到现代 JavaScript 高级教程!在这本书中,我将与您一起探索 JavaScript 这门令人着迷的编程语言的深度和广度。作为一名曾在腾讯担任高级前端开发工程师的经验分享者,我深知 JavaScript在当今软件开发领域中的重要性和广泛应用。它不仅仅是一门语言,更是连接着互联网世界的纽带。无论是网页应用、移动应用、服务器端开发,还是大规模的跨平台解决方案,JavaScript 都扮演着至关重要的角色。本书旨在帮助那些已经具备一定 JavaScript 基础的开发者,更深入地理解和掌握这门语言的高级特性和技术。我们将探索现代 JavaScript 中的最佳实践、设计模式、性能优化和代码组织等关键领域,以帮助您构建更高质量、可维护和可扩展的应用程序。在本书中,我将为您提供丰富的示例代码、实用的技巧和深入的解释,以确保您能够逐步进阶成为一名真正的 JavaScript 专家。无论您是希望扩展您的职业发展机会,提升您的技能水平,还是简单地享受深入学习 JavaScript 的乐趣,本书都将成为您不可或缺的指南。与此同时,我也希望通过本书激发您的创造力和实践能力。JavaScript 的生态系统不断发展演进,新的库、框架和工具层出不穷。通过学习和掌握现代 JavaScrwww.coding-ipt 的高级概念,您将能够更好地适应行业变化,并运用最新的工具和技术来解决现实世界中的问题。无论您是一名前端开发者、全栈工程师还是对 JavaScript 充满好奇心的初学者,本书都将为您提供清晰的指导和丰富的知识。请准备好迎接一个充满挑战和成长的学习之旅!在本书的旅程中,我将努力提供最新的见解和最佳实践,以帮助您在现代 JavaScript 的海洋中航行。无论您是一名学生、工程师还是教育工作者,我希望本书能够成为您的伙伴,引导您在 JavaScript 的世界中不断前行。让我们一起开始吧。#关于我笔名 linwu,一枚前端开发工程师,曾入职腾讯等多家知名互联网公司,后面我会持续分享精品课程,欢迎持续关注。www.coding-目录页基础.7一、作用域和作用域链.7二、执行上下文与闭包.12三、函数上下文和 this 关键字.22四、JavaScript 数组.26五、JavaScript 对象.35六、Javascript 数据类型和类型转换.41七、原型和原型链.53八、JavaScript 事件流:深入理解事件处理和传播机制.63进阶.70九、前端模块化.70十、JavaScript 引擎的工作原理:代码解析与执行.75十一、JavaScript 引擎的垃圾回收机制.81十二、深入理解 JavaScript 中的 WeakMap 和 WeakSet.86十三、面向对象编程与 Class.91十四、JavaScript 函数式编程.101十五、Iterator 迭代器:简化集合遍历的利器.106十六、深入理解 Proxy.111十七、JavaScript 深拷贝与浅拷贝.115十八、深入理解 JSON.stringify.122www.coding-十九、详解 Cookie,Session,SessionStorage,LocalStorage.129二十、JavaScript 修饰器:简化代码,增强功能.136二十一、前端跨页面通信:实现页面间的数据传递与交互.144二十二、JS Shadow DOM:创建封装的组件和样式隔离.150二十三、Date 类:日期和时间处理.155二十四、正则表达式的常见问题与练习.161二十五、JavaScript Error 类:异常处理与错误管理.166异步.169二十六、JS 中的异步编程与 Promise.170二十七、实现符合 Promise/A+规范的 Promise.175二十八、JavaScript 中的 Generator 函数与其在实现 Async/Await 的应用190二十九、异步的终极解决方案:async/await.193性能.194三十、MutationObserver:监测 DOM 变化的强大工具.196三十一、requestAnimationFrame:优化动画和渲染的利器.202三十二、Performance API:提升网页性能的利器.209三十三、页面生命周期:DOMContentLoaded,load,beforeunload.217一、作用域和作用域链www.coding-7 基础一、作用域和作用域链引言在 JavaScript 中,作用域是指变量在代码中可访问的范围。理解 JavaScript 的作用域和作用域链对于编写高质量的代码至关重要。本文将详细介绍 JavaScript 中的词法作用域、作用域链和闭包的概念,并探讨它们在实际开发中的应用场景。1.词法作用域1)概念词法作用域是 JavaScript 中最常见的作用域类型。它是在代码编写阶段确定的,而不是在代码执行阶段确定的。在词法作用域中,变量的访问权限是由它们在代码中的位置决定的。2)示例function outer()var outerVariable=Hello;function inner()var innerVariable=World;console.log(outerVariable+innerVariable);inner();outer();/输出:Hello World在上面的示例中,函数innerinner内部可以访问外部函数outerouter中定义的变量outerVariabouterVariablele,这是因为它们处于词法作用域中。词法作用域确保了变量在代码编写阶段就能够正一、作用域和作用域链www.coding-8确地被访问。3)词法作用域的应用场景词法作用域在 JavaScript 中有广泛的应用场景,包括:变量访问控制:词法作用域使得我们可以控制变量的可见性和访问权限,避免命名冲突和变量污染。模块化开发:通过使用函数和闭包,可以实现模块化的代码组织,将变量和函数封装在私有作用域中,提供了良好的封装性和代码组织性。函数嵌套:函数嵌套是 JavaScript 中常见的编程模式,词法作用域确保了内部函数可以访问外部函数的变量,实现了信息的隐藏和封装。2.作用域链1)概念作用域链是 JavaScript 中用于查找变量的一种机制。它由当前作用域和所有父级作用域的变量对象组成。当访问一个变量时,JavaScript 引擎会首先在当前作用域的变量对象中查找,如果找不到,则沿着作用域链向上查找,直到找到变量或者到达全局作用域。Global Execution Context|+-Function Execution Context 1|+-Function Execution Context 2|+-Function Execution Context 3|+-Function Execution Context 4一、作用域和作用域链www.coding-92)示例var globalVariable=Global;function outer()var outerVariable=Hello;function inner()var innerVariable=World;console.log(globalVariable+outerVariable+innerVariable);inner();outer();/输出:Global Hello World在上面的示例中,函数innerinner内部可以访问全局作用域中定义的变量globalVariableglobalVariable,以及外部函数outerouter中定义的变量outerVariableouterVariable,这是因为 JavaScript 引擎按照作用域链的顺序查找变量。3)作用域链的应用场景作用域链在 JavaScript 中有多种应用场景,包括:变量查找:作用域链决定了变量的查找顺序,使得 JavaScript 可以正确地找到并访问变量。闭包:通过创建闭包,内部函数可以访问外部函数的变量,实现了信息的保留和共享。模块化开发:作用域链的特性使得我们可以实现模块化的代码组织,将变量和函数封装在私有作用域中,提供了良好的封装性和代码组织性。一、作用域和作用域链www.coding-103.闭包1)概念闭包是指函数和其词法环境的组合。它可以访问其词法作用域中定义的变量,即使在函数外部也可以访问这些变量。闭包在 JavaScript 中常用于创建私有变量和实现模块化开发。2)示例function createCounter()var count=0;return function()count+;console.log(count);var counter=createCounter();counter();/输出:1counter();/输出:2在上面的示例中,函数createCountercreateCounter返回一个内部函数,该内部函数引用了外部函数createCountercreateCounter的变量countcount。即使在外部函数执行完毕后,内部函数依然可以访问并修改变量countcount,这就是闭包的特性。3)闭包的应用场景闭包在 JavaScript 中有多种应用场景,包括:私有变量:闭包提供了一种实现私有变量的机制,可以隐藏变量并提供访问控制。模块化开发:通过创建闭包,可以实现模块化的代码组织,将变量和函数封装在私一、作用域和作用域链www.coding-11有作用域中,提供了良好的封装性和代码组织性。延迟执行:通过使用闭包,可以延迟执行函数,实现异步操作和事件处理。4.总结作用域、作用域链和闭包是 JavaScript 中重要的概念,它们相互关联,共同构建了 JavaScript 的变量访问和代码组织机制。理解这些概念的原理和应用场景对于编写高质量的 JavaScript 代码至关重要。通过词法作用域,我们可以控制变量的可见性和访问权限,实现模块化的代码组织,避免命名冲突和变量污染。作用域链决定了变量的查找顺序,使得 JavaScript 可以正确地找到并访问变量。同时,作用域链的特性也为闭包的创建提供了基础,通过闭包,我们可以创建私有变量,实现模块化的代码组织以及延迟执行函数等。深入理解作用域、作用域链和闭包,能够帮助我们更好地编写可维护、高效的 JavaScript 代码。5.参考资料MDN Web Docs:Closuresopen in new windowMDN Web Docs:Scopes and closuresopen in new windowJavaScript:Understanding Scope,Context,and Closuresopen in new windowJavaScript Closures:A Comprehensive Guide二、执行上下文与闭包www.coding-12二、执行上下文与闭包1.由来JavaScript 中的闭包源于计算机科学中的一种理论概念,称为“演算”(Lambda Calculus)。演算是计算机科学的基础之一,1930 年由 Alonzo Church 提出,它是一种用于描述计算过程的数学抽象模型,也是函数式编程语言的基础。在 JavaScript 中,闭包是函数和声明该函数的词法环境的组合。这个环境包含了闭包创建时所能访问的所有局部变量。理解闭包,需要理解 JavaScript 的特性和工作原理。JavaScript 的函数在创建时,就确定了其操作的上下文环境,即词法作用域。这是因为 JavaScript 采用的是静态作用域,也叫词法作用域,函数的作用域在函数定义的时候就决定了。例如:function outer()var name=JavaScript;function inner()console.log(name);return inner;var innerFunc=outer();innerFunc();/输出 JavaScript在这个例子中,outerouter函数返回了innerinner函数。innerinner函数访问了outerouter函数的局部变量namename,因此形成了一个闭包。即使outerouter函数执行完毕,namename变量的引用仍然被保留,因此innerFuncinnerFunc在执行时仍然能够输出 JavaScript。闭包的概念虽然来自计算机科学的深层理论,但在日常的 JavaScript 编程中,它是一个非常实用且常见的特性,被广泛用于如数据隐藏和封装、模块化编程、回调函数和计时二、执行上下文与闭包www.coding-13器等许多场景中。2.JavaScript 中的闭包在 JavaScript 中,闭包是一个强大而复杂的特性,理解和利用好闭包对于编写高效且安全的代码至关重要。下面就让我们深入地了解一下 JavaScript 的闭包。闭包是指那些能够访问自由变量的函数。什么是自由变量呢?如果一个变量在函数内部被引用,但它既不是函数的参数也不是函数的局部变量,那么就称之为“自由变量”。例如,我们有一个外部函数和一个内部函数:function outerFunction(outerVariable)function innerFunction()console.log(outerVariable);return innerFunction;var inner=outerFunction(Hello Closure);inner();/输出 Hello Closure在这个例子中,outerFunctionouterFunction是一个外部函数,接受一个参数outerVariableouterVariable。它包含一个内部函数innerFunctioninnerFunction,这个内部函数没有自己的参数或局部变量,但却引用了外部函数的变量outerVariableouterVariable。所以,我们说innerFunctioninnerFunction是一个闭包,而outouterVariableerVariable就是它的自由变量。需要注意的是,由于 JavaScript 的垃圾回收机制,如果一个变量离开了它的作用域,那么这个变量就会被回收。但是,由于innerFunctioninnerFunction是一个闭包,它引用了outerVariouterVariableable,所以即使outerFunctionouterFunction执行完毕,outerVariableouterVariable离开了它的作用域,但仍然不会被垃圾回收机制回收。再者,每次调用外部函数,都会为内部的闭包创建一个新的作用域。例如:二、执行上下文与闭包www.coding-14var inner1=outerFunction(Hello Closure 1);var inner2=outerFunction(Hello Closure 2);inner1();/输出 Hello Closure 1inner2();/输出 Hello Closure 2这里,inner1 和 inner2 是两个不同的闭包。他们分别有自己的作用域,储存了不同的outerVariable。3.执行上下文与闭包在 JavaScript 中,执行上下文(execution context)是一个关键概念,与闭包(closure)密切相关。理解执行上下文如何与闭包交互可以帮助我们深入理解闭包的工作原理和行为。执行上下文是 JavaScript 代码执行时的环境。它包含了变量、函数声明、作用域链等信息,用于管理和跟踪代码的执行过程。当一个函数被调用时,就会创建一个新的执行上下文。每个执行上下文都有自己的词法环境(Lexical Environment),用于存储变量和函数的声明。在理解闭包之前,让我们先了解一下执行上下文的创建和销毁过程。当函数被调用时,会创建一个新的执行上下文,并将其推入执行上下文栈(execution context stack)中。当函数执行完毕后,其执行上下文会从栈中弹出并销毁。现在,让我们通过一个例子来更具体地了解执行上下文和闭包之间的关系:function outerFunction(outerVariable)function innerFunction(innerVariable)console.log(outerVariable:,outerVariable);console.log(innerVariable:,innerVariable);return innerFunction;var newFunction=outerFunction(outside);newFunction(inside);/二、执行上下文与闭包www.coding-15输出:outerVariable:outside innerVariable:inside在这个例子中,当调用outerFunctionouterFunction时,会创建一个新的执行上下文,其中包含了o outerVariableuterVariable参数和innerFunctioninnerFunction函数声明。然后,outerFunctionouterFunction返回了innerFuinnerFunctionnction,并将其赋值给变量newFunctionnewFunction。现在让我们来看看闭包是如何形成的。当innerFunctioninnerFunction被返回时,它会携带其词法环境(包含outerVariableouterVariable)一起返回。这意味着innerFunctioninnerFunction保持对outerVariablouterVariable e的引用,即使outerFunctionouterFunction执行完毕并且其执行上下文已经销毁。这就是闭包的力量所在。它允许内部函数(innerFunctioninnerFunction)访问其词法环境中的变量(outerVariableouterVariable),即使这些变量在其创建时的执行上下文已经不存在。在这个例子中,newFunctionnewFunction就是一个闭包。它引用了外部函数outerFunctionouterFunction的词法环境,其中包含了outerVariableouterVariable变量。因此,当我们调用newFunctionnewFunction时,它可以访问并打印出outerVariableouterVariable和innerVariableinnerVariable的值。执行上下文和闭包的关系是密不可分的。闭包是由执行上下文中的变量引用形成的,而这些变量保留在闭包的作用域中。这使得闭包能够在函数执行完成后继续访问这些变量,实现了 JavaScript 中非常重要的特性。理解执行上下文和闭包的交互对于编写复杂的 JavaScript 代码非常重要。它有助于我们更好地理解作用域、变量的生命周期以及如何正确使用闭包来解决问题。同时,它也帮助我们避免一些潜在的问题,如内存泄漏和不必要的资源消耗。4.闭包的应用场景闭包在 JavaScript 中有广泛的应用场景,它是一种强大的编程工具,可以解决许多常见的问题。下面我们来介绍一些常见的闭包应用场景。二、执行上下文与闭包www.coding-161)数据封装和私有性闭包可以用于创建私有变量,将变量隐藏在函数作用域内部,从而实现数据的封装和私有性。通过闭包,我们可以控制变量的访问权限,只暴露需要暴露的接口。这种封装机制可以防止外部代码直接访问和修改内部数据,增加代码的安全性。function createCounter()let count=0;return increment:function()count+;,decrement:function()count-;,getCount:function()return count;const counter=createCounter();counter.increment();counter.increment();console.log(counter.getCount();/输出:2在这个例子中,createCountercreateCounter函数返回一个对象,该对象包含了三个闭包函数,分别用于增加计数、减少计数和获取计数值。通过闭包,我们可以将countcount变量隐藏在函数内部,并通过闭包函数来操作和访问这个变量。2)模块化编程闭包可以用于实现模块化编程,将相关的变量和函数组织在一个闭包内部,形成一个模块。这样可以避免全局命名冲突,提供命名空间,并且允许模块内部的函数相互调用和共享数据。二、执行上下文与闭包www.coding-17var myModule=(function()var privateVariable=私有变量;function privateFunction()console.log(私有函数);return publicMethod:function()console.log(privateVariable);,publicFunction:function()privateFunction();)();myModule.publicMethod();/输出:私有变量myModule.publicFunction();/输出:私有函数在这个例子中,我们使用了立即调用函数表达式(IIFE)来创建一个闭包,形成一个独立的模块。模块内部的变量和函数对外部是不可见的,只有通过公共接口才能访问。3)回调函数和事件处理闭包常常用于处理回调函数和事件处理,特别是在异步编程中。由于闭包的特性,它可以捕获外部函数的上下文,并在内部函数被调用时保留这个上下文,从而实现对异步操作的响应。function fetchData(url,callback)fetch(url).then(function(response)return response.json();).then(function(data)callback(data););二、执行上下文与闭包www.coding-18function processData(data)console.log(data);fetchData(https:/ memoizedFunction()var cache=;return function(arg)if(cachearg)return cachearg;/计算结果var result=/.cachearg=result;return result;var memoized=memoizedFunction();console.log(memoized(value);/第一次计算并缓存结果console.log(memoized(value);/直接从缓存中读取结果在这个例子中,memoizedFunctionmemoizedFunction返回一个闭包函数,用于记忆化计算结果。闭包内部维护了一个缓存对象cachecache,当输入相同的参数时,直接从缓存中读取结果,避免重复计算。二、执行上下文与闭包www.coding-19闭包在 JavaScript 中有许多其他的应用场景,如实现延迟执行、函数柯里化、实现迭代器等。了解闭包的应用场景可以帮助我们写出更加优雅、高效的代码,并利用闭包的强大能力解决问题。5.闭包的优缺点当谈到闭包的缺点时,主要涉及内存消耗、内存泄漏和性能影响。下面是一些代码示例,帮助我们理解这些缺点。1)内存消耗闭包会导致内存占用增加,因为它们会保留对外部变量的引用,即使外部函数执行完毕。这可能会导致内存占用过高。function createHugeArray()var arr=new Array(1000000).fill(Huge Data);return function()console.log(arr.length);var bigDataFunc=createHugeArray();bigDataFunc();/输出:1000000在这个例子中,createHugeArraycreateHugeArray函数返回一个闭包函数,它引用了一个巨大的数组a arr rr。即使createHugeArraycreateHugeArray执行完毕,arrarr仍然被闭包引用,无法被垃圾回收机制回收,从而导致内存占用增加。2)内存泄漏由于闭包会持有对外部变量的引用,如果不正确地处理闭包的使用,可能会导致内存泄漏。如果一个闭包长时间存在,但不再需要,它会一直持有对外部变量的引用,使这些变量无法被垃圾回收。二、执行上下文与闭包www.coding-20function leakMemory()var data=Sensitive Data;var timer=setInterval(function()console.log(data);,1000);leakMemory();在这个例子中,leakMemoryleakMemory函数创建了一个闭包,它引用了一个定时器内部的函数。即使leakMemoryleakMemory执行完毕,定时器仍然在持续执行,因此闭包会一直存在并引用dadatata变量,导致datadata无法被垃圾回收。3)性能影响闭包可能对性能产生一定的影响,特别是在涉及大量变量或复杂词法环境的情况下。闭包的创建和执行可能消耗更多的时间和资源。function calculate()var result=0;for(var i=0;i www.coding-21可以回收闭包相关的资源。避免滥用闭包:只在必要的情况下使用闭包,避免在不必要的场景中使用闭包。优化性能:在闭包的创建和使用过程中,尽量避免不必要的计算或资源消耗,以提高性能。通过合理使用和处理闭包,我们可以最大限度地减少其缺点,同时享受闭包在 JavaScript 中带来的强大功能。三、函数上下文和 this 关键字www.coding-22三、函数上下文和 this 关键字函数是 JavaScript 中最重要的概念之一,理解函数的定义和调用方式涉及到多个知识点,特别是函数的上下文,即函数中的thisthis关键字,是前端面试中必考的知识点。本文将介绍函数上下文、箭头函数以及修正thisthis指向的方法。1.函数作为独立函数调用考虑以下脚本:function printThis()return this;console.log(printThis()=window);输出结果:在严格模式下:falsefalse在非严格模式下:truetrue解析:当函数被作为独立函数调用时,thisthis指向不同,严格模式和非严格模式下有区别。在严格模式下,thisthis指向undefinedundefined;在非严格模式下,thisthis指向全局对象windwindowow。2.函数作为对象方法调用考虑以下脚本:function printThis()return this;const obj=printThis;console.log(obj.printThis()=obj);三、函数上下文和 this 关键字www.coding-23输出结果:truetrue解析:当函数被作为对象的方法调用时,其中的thisthis指向该对象本身。在上述代码中,printThisprintThis函数被作为objobj对象的一个方法调用,所以printThisprintThis中的thisthis指向objobj,而不是全局对象windowwindow。3.构造函数调用考虑以下脚本:function Dog()this.name=Puppy;const dog=new Dog();console.log(dog.name);输出结果:PuppyPuppy解析:在这段代码中,DogDog函数被当作构造函数调用,通过newnew关键字创建实例时,thisthis关键字会指向新创建的对象。因此,this.namethis.name=PuppyPuppy将在新创建的对象上设置namename属性,最后打印出PuppyPuppy。4.构造函数返回对象考虑以下脚本:const puppet=rules:false;function Emperor()this.rules=true;return puppet;const emperor=new Emperor();console.log(emperor.rules);三、函数上下文和 this 关键字www.coding-24输出结果:falsefalse解析:尽管构造函数的thisthis关键字指向通过构造函数构建的实例,但如果构造函数中使用returnreturn语句返回一个对象,则返回的对象将取代通过构造函数创建的实例。在上述代码中,EmperorEmperor构造函数返回了puppetpuppet对象,因此emperoremperor实例实际上就是p puppetuppet对象,其中的rulesrules属性值为falsefalse。5.函数调用时使用 call 或 apply考虑以下脚本:function greet()return Hello,$this.name!;const person=name:Alice;console.log(greet.call(person);/使用 callconsole.log(greet.apply(person);/使用 apply输出结果:使用callcall:Hello,Hello,Alice!Alice!使用applyapply:Hello,Hello,Alice!Alice!解析:通过使用函数的callcall或applyapply方法,可以显式地指定函数执行时的上下文,即t thishis的值。在上述代码中,greet.call(person)greet.call(person)和greet.apply(person)greet.apply(person)中的thisthis都被绑定到了personperson对象,所以打印出的结果都是Hello,Hello,Alice!Alice!。6.箭头函数的上下文三、函数上下文和 this 关键字www.coding-25箭头函数的thisthis绑定与常规函数不同,箭头函数没有自己的 this 值,而是捕获了封闭上下文的thisthis值。考虑以下脚本:const obj=name:Bob,greet:function()const arrowFunc=()=return Hello,$this.name!;return arrowFunc();console.log(obj.greet();输出结果:Hello,Hello,Bob!Bob!解析:在这段代码中,箭头函数arrowFuncarrowFunc没有自己的thisthis值,而是捕获了封闭上下文greetgreet函数中的thisthis值,即objobj对象。所以this.namethis.name实际上指向obj.nameobj.name,打印出Hello,Hello,Bob!Bob!。这就是 JavaScript 函数上下文和 this 关键字的一些重要概念和用法。四、JavaScript 数组www.coding-26四、JavaScript 数组引言在 JavaScript 中,数组(Array)是一种重要且广泛应用的数据结构,用于存储和操作一组有序的数据。JavaScript 提供了丰富的数组方法和属性,使我们能够方便地对数组进行增删改查等操作。本文将详细介绍 JavaScript 数组的方法 API、属性,并探讨如何模拟实现数组的 API。此外,还将介绍数组的应用场景,帮助读者更好地理解和应用数组。1.数组简介数组是一种有序的数据集合,它可以存储多个值,并根据索引访问和操作这些值。在 JavaScript 中,数组是一种动态类型的数据结构,可以容纳任意类型的数据,包括基本类型和对象。JavaScript 数组的特点包括:数组的长度是动态可变的,可以根据需要随时添加或删除元素。数组的索引是从 0 开始的,通过索引可以快速访问和修改数组中的元素。数组可以包含不同类型的元素,甚至可以嵌套包含其他数组。JavaScript 提供了许多方法和属性来操作和处理数组,使得数组成为处理数据的强大工具。2.数组方法 APIJavaScript 数组提供了丰富的方法来操作数组。以下是一些常用的方法 API:添加和删除元素push()push():在数组末尾添加一个或多个元素,并返回新数组的长度。四、JavaScript 数组www.coding-27pop()pop():移除并返回数组的最后一个元素。unshift()unshift():在数组开头添加一个或多个元素,并返回新数组的长度。shift()shift():移除并返回数组的第一个元素。splice()splice():从指定位置添加或删除元素。修改和访问元素slice()slice():返回数组的一部分,不改变原数组。concat()concat():将多个数组合并为一个新数组。join()join():将数组的元素连接成一个字符串。reverse()reverse():颠倒数组中元素的顺序。sort()sort():对数组元素进行排序。数组遍历forEach()forEach():对数组的每个元素执行指定的操作。map()map():创建一个新数组,其中的元素是原始数组经过指定操作后的结果。filter()filter():创建一个新数组,其中的元素是符合指定条件的原始数组元素。reduce()reduce():对数组的元素进行累加或合并操作。数组转换和连接toString()toString():将数组转换为字符串。toLocaleString()toLocaleString():将数组转换为本地化的字符串。join()join():将数组的元素连接成一个字符串。数组排序和搜索四、JavaScript 数组www.coding-28sort()sort():对数组元素进行排序。reverse()reverse():颠倒数组中元素的顺序。indexOf()indexOf():返回指定元素在数组中首次出现的索引。lastIndexOf()lastIndexOf():返回指定元素在数组中最后一次出现的索引。其他常用方法isArray()isArray():检测一个值是否为数组。find()find():返回数组中符合指定条件的第一个元素。findIndex()findIndex():返回数组中符合指定条件的第一个元素的索引。some()some():检测数组中是否至少有一个元素符合指定条件。every()every():检测数组中是否所有元素都符合指定条件。以上仅是 JavaScript 数组方法 API 的部分常用示例,更多详细的方法和用法请参考 MDN Web Docsopen in new window。3.数组属性JavaScript 数组还有一些常用的属性,用于描述和操作数组的特性和状态。length:返回数组的长度。constructor:返回创建数组对象的原型函数。prototype:数组对象的原型对象,用于添加新的方法和属性。这些属性可以帮助我们了解数组的结构和信息,以便更好地处理和操作数组。4.实现数组 API四、JavaScript 数组www.coding-29为了更好地理解数组的方法和实现原理,我们可以尝试自己模拟实现一些数组 API 的方法。以下是一些常用的数组方
展开阅读全文