JS数组的前端面试题
- 格式:docx
- 大小:21.21 KB
- 文档页数:5
前端算法面试题在前端开发的职位面试中,算法题常常是必不可少的一部分。
算法题的目的是考察面试者在解决问题和优化代码方面的能力。
本文将介绍一些常见的前端算法面试题,并给出相应的解答。
1. 反转字符串题目描述:给定一个字符串,将其逆序输出。
解答:可以使用数组的reverse()方法来实现字符串的反转。
```javascriptfunction reverseString(str) {return str.split('').reverse().join('');}const input = 'Hello World!';const output = reverseString(input);console.log(output);```2. 查找数组中的重复元素题目描述:给定一个整数数组,找出数组中重复的元素。
解答:可以使用对象来记录每个元素的出现次数,然后遍历对象找出重复的元素。
```javascriptfunction findDuplicates(arr) {const counts = {};const duplicates = [];for (let i = 0; i < arr.length; i++) { if (counts[arr[i]]) {counts[arr[i]]++;} else {counts[arr[i]] = 1;}}for (const num in counts) {if (counts[num] > 1) {duplicates.push(num);}}return duplicates;}const input = [1, 2, 3, 4, 2, 5, 6, 3];const output = findDuplicates(input);console.log(output);```3. 实现快速排序算法题目描述:实现快速排序算法对数组进行排序。
js数组 reduce的面试题
JavaScript 中的 `()` 方法是一个非常有用的工具,它可以将数组中的元素通过一个函数处理,并返回一个单一的输出值。
以下是一些关于 `reduce()` 的面试题:
1. 描述一下 `reduce()` 方法的工作原理。
2. 写一个简单的 `reduce()` 函数实现,例如将数组中的所有数字相加。
3. `reduce()` 方法的回调函数接收哪些参数?
4. `reduce()` 方法和 `map()`、`filter()` 有什么区别?
5. `reduce()` 方法可以处理空数组吗?如果可以,返回什么结果?
6. 如果 `reduce()` 方法的回调函数在任何时候返回 `undefined`,那么会发生什么?
7. 如果 `reduce()` 方法的回调函数在任何时候返回一个非数组对象(例如一个字符串或数字),那么会发生什么?
8. 能否使用 `reduce()` 方法来生成一个新的数组?
9. 能否使用 `reduce()` 方法来更新现有的数组?
10. `reduce()` 方法中初始值参数的作用是什么?如果不提供这个参数,会发生什么?
以上就是一些关于 `reduce()` 的面试题,希望对你有所帮助。
js算法面试经典100题以下是面试中常见的100个经典算法问题,适用于JavaScript:1. 两数之和2. 反转字符串3. 验证回文串4. 整数反转5. 最长公共前缀6. 合并两个有序数组7. 有效的括号8. 删除排序数组中的重复项9. 删除链表中的节点10. 实现 strStr()11. 替换空格12. 二叉树的最大深度13. 对称二叉树14. 二叉树的层次遍历15. 二叉搜索树的最近公共祖先16. 删除链表的倒数第N个节点17. 旋转数组18. 合并两个有序链表19. 链表的中间节点20. 最大子序和21. 阶乘尾部的零22. 爬楼梯23. 二叉树的前序遍历24. 杨辉三角25. 有效的数独26. 反转链表27. 验证二叉搜索树28. 实现Trie29. 最长有效括号30. 合并区间31. 两两交换链表中的节点32. 下一个排列33. 逆波兰表达式求值34. 最大矩形35. 字符串相乘36. 删除链表中的重复元素37. 螺旋矩阵38. 使用队列实现栈39. 最长连续序列40. 交错字符串41. 单词拆分42. 最后一个单词的长度43. 二叉树的右视图44. 跳跃游戏45. 翻转二叉树46. 字母异位词分组47. 复原IP地址48. 最小覆盖子串49. 丑数50. 栈的压入弹出序列51. 二叉树中和为某一值的路径52. 二叉搜索树的后序遍历序列53. 二进制求和54. 分隔链表55. 不同路径56. 最小路径和57. 字符串转换整数58. 搜索二维矩阵59. 环形链表60. 路径总和61. 删除链表的节点62. 最长上升子序列63. 最大子数组乘积64. 排序链表的合并65. 在排序数组中查找元素的第一个和最后一个位置66. 同结构的二叉树67. 乘积最大子数组68. 两个排序数组的中位数69. 合并K个排序链表70. 数组中的逆序对71. 反转链表的前N个节点72. 最大值和最小值的差73. 翻转字符串中的单词74. 前 K 个高频元素75. 分青红蓝球问题76. 回文数77. 括号生成78. 长度最小的子数组79. 根据身高和序号重组队列80. 两数相加81. 数字的英文表示82. 二叉树的锯齿形层次遍历83. 在O(1)时间内删除链表节点84. 用栈实现队列85. 二叉树的层平均值86. 二叉树的右侧视图87. 螺旋矩阵 II88. 颜色分类89. 寻找重复数90. 打家劫舍91. 按序打印92. 找到字符串中所有字母异位词93. 丑数 II94. 外观数列95. 在排序链表中删除重复元素 II96. 两数相除97. 不同的二叉搜索树98. 最长回文子串99. 缺失的第一个正数100. 寻找最大公约数这些问题涵盖了数据结构和算法中的常见题目。
前端面试题目(2)对前端模块化的认识AMD 是RequireJS在推广过程中对模块定义的规范化产出。
CMD 是SeaJS 在推广过程中对模块定义的规范化产出。
AMD是提前执行,CMD是延迟执行。
AMD 推荐的风格通过返回一个对象做为模块对象,CommonJS的风格通过对module.exports或exports的属性赋值来达到暴露模块对象的目的。
CMD模块方式<code class=""> define(<span class=""><span class="">function</span>(<span class="">require, exports, module</span>) </span>{ <span class="">// 模块代码</span> });</code> Javascript垃圾回收方法标记清除(mark and sweep)这是JavaScript最常见的垃圾回收方式,当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”。
垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量以及被环境中变量所引用的变量(闭包),在这些完成之后仍存在标记的就是要删除的变量了。
引用计数(reference counting)在低版本IE中经常会出现内存泄露,很多时候就是因为其采用引用计数方式进行垃圾回收。
引用计数的策略是跟踪记录每个值被使用的次数,当声明了一个变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加1,如果该变量的值变成了另外一个,则这个值得引用次数减1,当这个值的引用次数变为0的时候,说明没有变量在使用,这个值没法被访问了,因此可以将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为0的值占用的空间。
高级前端js面试题一、选择题(每题2分)1. 下面哪个选项是JS的注释语法()(多选) *A、// This is a comment(正确答案)B、<%-- This is a comment --%>C、<!-- this is a comment-->D、/* This is a comment */(正确答案)2. 关于JS代码的书写位置,下面哪一个是错误的( )? [单选题] *A、写到<script>标签中B、写到单独的js文件中C、写到标签的事件属性值中D、直接写到页面中(正确答案)3. <script>标签可以放到页面中的哪个位置( ) [单选题] *A、只能放到<body>标签中B、只能放到<head>标签中C、放到<body>标签和 <head>标签均可(正确答案)D、放到页面中的任何地方4. 下面哪种创建函数的方式是错误的( ) [单选题] *A、function foo(){}B、var foo = function (){}C、var foo = new Function()D、var foo = bar(){}(正确答案)5. 下面哪种创建数组的方式是正确的( ) *A、 var txt = ["George", "John", "Thomas"](正确答案)B、 var txt = ["George" "John" "Thomas"]C、 var txt = new Array("George","John","Thomas")(正确答案)D、 var txt = new Array("George" "John" "Thomas")6. 如何把7.25 四舍五入为最接近的整数( ) [单选题] *A、 Math.sqrt(7.25)B、 Math.ceil(7.25)C、 Math.floor(7.25)D、 Math.round(7.25)(正确答案)7. 下面哪个是Date对象中获取日期的方法的( ) [单选题] *A、getFullYear()B、getMonth()C、getDate()(正确答案)D、getDay()E、getHours()F、getMinutes()G、getSeconds()H、getTime()8. 下面哪个方法可以向数组的末尾添加一个或多个元素( ) [单选题] *A.concat()B.pop()C.push()(正确答案)D.shift()9. 下面哪个方法可以寻找子字符串并返回该子字符串首字符的索引位置( ) [单选题] *A.match()B.indexOf()(正确答案)C.search()D.concat()10. 下面哪个文本框会时刻监听用户的输入,并将输入内容输出到控制台( ) [单选题] *A. <input type="text" onclick="console.log(this.value)">B. <input type="text" onchange="console.log(this.value)">C. <input type="text" oninput="console.log(this.value)">(正确答案)D. <input type="text" onfocus="console.log(this.value)">11. window对象的哪个方法可以显示带有输入框的对话框?( ) [单选题] * A.confirm()B.alert()C.prompt()(正确答案)D.open()12. setInterval("alert('welcome');",1000);这段代码的意思是( ) [单选题] *A、等待1000秒后,弹出一个对话框B、等待1秒钟后,弹出一个对话框C、每隔1秒钟,弹出一个对话框(正确答案)D、语句报错,语法有问题13. setTimeout("alert('welcome');",1000);这段代码的意思是( ) [单选题] *A、等待1000秒后,弹出一个对话框B、等待1秒钟后,弹出一个对话框(正确答案)C、每隔1秒钟,弹出一个对话框D、语句报错,语法有问题14. 下列哪个函数可以将参数转换为浮点数( ) [单选题] *A、isNaN()B、parseInt()C、Number()D、parseFloat()(正确答案)15. 如果要从函数返回值,必须使用哪个关键词( ) [单选题] *A、continueB、breakC、return(正确答案)D、exit16. 下面4个变量声明语句中,正确的是( ) [单选题] *A、var defaultB、var my_house(正确答案)C、var my dogD、var 2cats17. 表达式"123abc"-"123"的计算结果是( ) [单选题] *A、"abc"B、0C、"123abc123"D、NaN(正确答案)18. 下面哪一个不是用来操作DOM元素的方法( ) [单选题] *A、insertBefore()B、insertAfter()(正确答案)C、removeChild()D、appendChild()19. 以下哪个表达式计算之后的结果是true( ) [单选题] *A、(3==3)&&(5<1)B、!(17<=20)C、(3!=3)||(7<2)D、(1==1)||(2<0)(正确答案)20. 若有定义var x=10,则以下哪条语句执行后变量x的值不等于11( ) [单选题] *A、x++;B、x=11;C、x==11;(正确答案)D、x+=1;二、简答题1. Js基本数据类型都有哪些? [填空题]_________________________________2. 注册事件处理程序的有几种方法,请举例说明 [填空题]_________________________________3. e.clientX和e.pageX有什么区别? [填空题]_________________________________4. javaScript有几种作用域,具体指的是哪里? [填空题]_________________________________5. 写出一个求随机数的公式. [填空题]_________________________________6. 有哪些强制类型转换和隐式类型转换,请举例说明 [填空题]_________________________________7. JS中数组的操作方法有哪些,至少写出5种,分别写出每个方法的用法,及参数,返回值,是否改变原数组 [填空题]_________________________________三、分析题(分析每个代码块在控制台打印以后会出现的结果)1.下面这段代码输出的结果是什么,为什么?/*代码段一*/var x;console.log(x === undefined);x = 3;/*代码段二*/bar2();var bar2 = function() {console.log("bar2");}; [填空题] *_________________________________2.下面这段代码输出的结果是什么,为什么?var a = {x: 1};var b = a;a.x = 2;console.log(b.x);a = {x: 3};console.log(b.x);a = {x: 4};console.log(b.x);[填空题] *_________________________________3.下面这段代码输出的结果是什么,为什么?/*代码段一*/var a=1;function test(){console.log(a);var a=1;}test();/*代码段二*/var b = 1;function fun1(){var b = 2;function fun2(){var b = 3;console.log(b);}fun2();}fun1(); [填空题] *_________________________________4.下面这段代码输出的结果是什么,为什么?/*代码段一*/var b=2;function test2(){window.b=3;console.log(b);}test2();/*代码段二*/var c = 5;function test3(){window.c=3;console.log(c);var c;console.log(window.c);}test3(); [填空题] *_________________________________。
前端nodejs面试题前端Node.js面试题Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,用于构建快速可扩展的网络应用程序。
在前端开发领域,Node.js技术的应用越来越广泛。
本文将介绍一些常见的前端Node.js面试题,帮助读者更好地准备面试。
一、Node.js基础知识1. 什么是Node.js?以及它的特点和优势是什么?Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,它允许开发者使用JavaScript编写服务器端代码。
Node.js具有非阻塞I/O和事件驱动的特点,能够处理大量并发请求,因此在构建高性能的网络应用程序时十分有用。
Node.js的特点和优势包括:- 单线程:Node.js使用单线程模型,通过事件循环机制实现并发处理,节省了创建和销毁线程的开销。
- 非阻塞I/O:Node.js采用非阻塞I/O模型,不会等待I/O操作完成再执行下一条指令,而是立即执行下一个任务,提高了系统的吞吐量。
- 轻量高效:Node.js的核心库经过优化,拥有较小的内存占用和快速的启动时间。
2. 请解释Node.js的事件驱动和非阻塞I/O模型。
事件驱动:Node.js采用事件驱动的方式处理请求和响应。
当一个请求到达时,Node.js会将其添加到事件队列中,然后继续处理下一个请求,等到该请求的I/O操作完成后,触发相应的事件,执行对应的回调函数。
非阻塞I/O:在传统的阻塞I/O模型中,当一个I/O操作开始后,程序会一直等待该操作完成才继续执行下一条指令。
而在非阻塞I/O模型中,当一个I/O操作开始后,程序会立即执行下一个任务,不会等待I/O操作完成,当I/O操作完成后,会通过事件触发回调函数执行。
这种方式能够提高系统的吞吐量,增加并发处理能力。
3. 请描述CommonJS规范在Node.js中的应用。
Node.js采用CommonJS规范来组织模块和管理模块之间的依赖关系。
js 面试题及答案JavaScript(简称 JS)是一种基于对象和事件驱动的脚本语言,常用于网页开发。
在进行JS开发时,经常需要面试来选择优秀的候选人。
本文将针对常见的JS面试题提供详细的答案,帮助读者更好地准备面试。
一、变量和数据类型1. 什么是变量?变量是用于存储和表示数据的一个名字。
在JS中,可以使用var、let或const关键字来声明一个变量。
2. 有哪些常见的数据类型?JS中有七种常见的数据类型,分别是:字符串(string)、数字(number)、布尔值(boolean)、对象(object)、数组(array)、Null和Undefined。
3. Null和Undefined有什么区别?Null表示一个空对象指针,也可以用于表示空值;Undefined表示一个未定义的值,即变量声明但未被赋值。
二、运算符和流程控制1. 请解释一下什么是短路求值。
短路求值是指在进行逻辑与(&&)和逻辑或(||)运算时,如果能根据前面的条件判断出最终结果,则停止执行后续的条件判断。
2. 请解释一下什么是深拷贝和浅拷贝。
深拷贝是指创建一个新的对像或数组,将原来对象或数组中的值完全复制到新对象或数组中。
浅拷贝是指将原对象或数组中的引用复制给新对象或数组。
3. 如何判断一个变量的具体数据类型?可以使用typeof运算符来判断一个变量的具体数据类型。
例如,typeof 5将返回"number"。
三、函数和作用域1. 什么是闭包?闭包是指一个函数能够访问和操作在其词法作用域外的变量。
2. 匿名函数和具名函数有什么区别?匿名函数没有名字,通常用于声明立即执行的函数。
具名函数则有名字,能够在定义后被多次调用。
3. 请解释一下什么是作用域链。
作用域链是指在函数执行期间,JS引擎按照函数的嵌套关系,从内层函数到外层函数依次查找变量的过程。
四、面向对象编程1. 什么是原型?原型链又是什么?每个对象都有一个原型对象,在没有定义某个属性或方法时会根据原型链进行查找。
web前端面试题
1.js的中的"=", "==", "===" 的区别
- "=":赋值
- "==": 相等运算符,判断是否相等
- "===": 严格运算符,判断数值及类型是否相等
2.js中数组循环处理的方法有那些,及其区别
方法:
- map(),forEeach()
区别:
map(): 循环遍历数组中的每一项,但返回新的数组forEach(): 循环遍历数组中的每一项,但没有返回值
3.如何解决发布版本,前端缓存的问题
- 了解面试者项目的构建工具的使用
4.最近使用的技术框架及其组件有那些
- 了解面试者使用react的熟练程序
5.前后端分离,你是如何模拟业务数据
- 根据策划稿或原型稿,与后端定义API接口。
- 使用mockjs模拟API接口的输入,输出
6.谈谈你如何定位前端的性能问题,及优化。
定位性能问题:
- 工具:chrome的开发工具等
- 查看请求次数及响应时间
- 查看浏览器渲染页面完成最大时间
优化:
- 资源(css,js,image等)合并与压缩减少请求数
- 缓存策略
- 图片资源懒加载
- gzip压缩
7.你遇到过比较难的技术问题是?你是如何解决的?
- 了解面试者遇到问题的思路及其逻辑
8.当你非常忙碌的时候,你如何继续完成任务?
- 了解面试者为了按时完成任务而用那些帮助自己规划好自己的时间并保持专注的技巧。
web前端js面试题及参考答案面试题在web前端js求职者在面试求职考核中重要的组成部分,以下是店铺为大家整理的:web前端js面试题及参考答案,仅供大家参考!web前端js面试题及参考答案1.WEB标准以及W3C标准是什么?标签闭合、标签小写、不乱嵌套、使用外链css和js、结构行为表现的分离。
1.1div中img怎么水平和垂直居中?Div{width:200px;height:200px;text-align:center;font-size:0;overflow: hidden;line-height:200px;_line-height:178px;/*兼容IE6*/ }Img{ vertical-align:middle;}1.2 HTML中没有单位的属性是?z-index:1; zoom:1; font-weight:200;1.3 form表单中input标签的readonly 和disabled属性有何区别?readonly=“readonly”是只读,不可以修改,disabled=“disabled”是禁用,整个文本框是显示灰色状态form 中method是数据传递的方式,action是与后台数据库提交的2.xhtml和html有什么区别XHTML 元素必须被正确地嵌套,闭合,区分大小写,文档必须拥有根元素。
3.行内元素有哪些?块级元素有哪些?行内元素: a b img em br i span input select块级元素:div p h1-h6 form ul dl ol table4.行内元素和块级元素有什么区别?行内元素不可以设置宽高,不独占一行;块级元素可以设置宽高,独占一行。
5.我想让行内元素跟上面的元素距离10px,加margin-top和padding-top可以吗? margin-top,padding-top无效6.CSS的盒模型由什么组成?内容(width,height),border ,margin,padding6.1 简述div+css布局的优势?(1)符合w3c标准;(2)兼容性好;(3)有利于搜索引擎很友好;(4)样式的调整更加方便;(5)css简洁的代码,能使样式和结构分离;7.说说display属性有哪些?可以做什么?display:block行内元素转换为块级元素display:inline块级元素转换为行内元素display:inline-block转为内联元素display:box(css3新增的弹性布局属性)8.CSS 选择符有哪些?1.id选择器( # myid)2.类选择器(.myclassname)3.标签选择器(div, h1, p)4.相邻选择器(h1 + p)5.子选择器(ul < li)6.后代选择器(li a)7.通配符选择器( * )8.属性选择器(a[rel = "external"])9.伪类选择器(a: hover, li: nth - child)9.哪些css属性可以继承?可继承: font-size font-family color, ul li dl dd dt;(字体属性和列表属性)不可继承:border padding margin width height ;10.css优先级算法如何计算?!important > id > class > 标签!important 比内联优先级高* 优先级就近原则,样式定义最近者为准;* 以最后载入的样式为准;11.text-align:center和line-height有什么区别?text-align是水平对齐,line-height是行间。
1.要动态改变层中内容可以使用的方法有(AB )ﻫa)innerHTMLb)innerTextc)通过设置层的隐藏和显示来实现ﻫd)通过设置层的样式属性的display属性ﻫ2。
在javascript里,下列选项中不属于数组方法的是(B);a)sort()b)length()c)concat()d)reverse()ﻫ3 、varemp= new Array(3);for(var i in emp)ﻫ以下答案中能与for循环代码互换的是: (选择一项)。
(D)ﻫA for(var i=0;i<emp; i++)ﻫB for(var i=0; i〈Array(3);i++)Cfor(vari=0;i〈emp。
length();i++)Dfor(var i =0;i〈emp。
length; i++)ﻫ4 下列声明数组的语句中,错误的选项是(C ).a)Var arry= new Array()ﻫb)Var arry=new Array(3)ﻫc)Var arry[]=newA5. 下列哪一个选项不属于document rray(3)(4)ﻫd)Var arry=newArray(‘3',’4')ﻫﻫﻫ对象的方法?(D)a)focus()b)getElementById()ﻫc)getElementsByName()d)bgColor()ﻫ6。
、display属性值的常用取值不包括(C )a)inlineb)blockﻫc)hiddenﻫd)noneﻫ7.以下有关pixelTop属性与top属性的说法正确的是。
(D )ﻫa)都是Location对象的属性b)使用时返回值都是字符串ﻫc)都是返回以像素为单位的数值ﻫd)以上都不对ﻫ8。
使用open方法打开具有浏览器工具条,地址栏,菜单栏的窗口,下列选项正确的是__D__a)open("x。
html","HI","toolbas=1,scrollbars=1,status=1");ﻫb)open(”HI”,”scrollbars=1,location=1,status=1");c)open("x.html”,"status=yes,menubar=1,location=1”);d)open(”x.html”,”HI","toolbas=yes,menubar=1,location=1");ﻫﻫ9. 、javascript中表达式parseInt(“X8X8")+paseFloat(‘8’)的结果是什么?(C)a)8+8b)88c)16ﻫd)“8"+’8ﻫ10。
关于数组的前端面试题1、如何判断一个变量是否为数组?(1)为什么不用typeof?var list = [1,2,3];typeof list //"object"Array继承与Object,所以typeof 会直接返回object,所以不可以用typeof方法来检测(2)为什么不用instanceof?var list = [1,2,3];list instanceof Array //trueinstanceof 表面上看确实是返回了true,但其实并不可靠。
原因是Array实质是一个引用,用instanceof方法(包括下面的constructor方法)都是利用和引用地址进行比较的方法来确定的,但是在frame嵌套的情况下,每一个Array的引用地址都是不同的,比较起来结果也是不确定的,所以这种方法有其局限性。
(3)为什么不用constructor方法?var list = [1,2,3];list.constructor === Array; //true原因已经解释过了,不再赘述。
可靠的检测数组方式(1)利用Object的toString方法var list = [1,2,3];Object.prototype.toString.call(list); //[object Array](2)利用ES6的Array.isArray()方法var list = [1,2,3];Array.isArray(list); //true2、数组的原生方法有哪些?一是考察面试者平时使用的是否足够平凡;二是观察面试者是否对于日常的知识有所归纳。
可以用MDN中给出的方式来回答:(1)会改变自身的方法Array.prototype.copyWithin() 在数组内部,将一段元素序列拷贝到另一段元素序列上,覆盖原有的值。
Array.prototype.fill() 将数组中指定区间的所有元素的值,都替换成某个固定的值。
Array.prototype.pop()删除数组的最后一个元素,并返回这个元素。
Array.prototype.push()在数组的末尾增加一个或多个元素,并返回数组的新长度。
Array.prototype.reverse()颠倒数组中元素的排列顺序,即原先的第一个变为最后一个,原先的最后一个变为第一个。
Array.prototype.shift()删除数组的第一个元素,并返回这个元素。
Array.prototype.sort()对数组元素进行排序,并返回当前数组。
Array.prototype.splice()在任意的位置给数组添加或删除任意个元素。
Array.prototype.unshift()在数组的开头增加一个或多个元素,并返回数组的新长度。
(2)不会改变自身的方法Array.prototype.concat()返回一个由当前数组和其它若干个数组或者若干个非数组值组合而成的新数组。
Array.prototype.includes() 判断当前数组是否包含某指定的值,如果是返回true,否则返回false。
Array.prototype.join()连接所有数组元素组成一个字符串。
Array.prototype.slice()抽取当前数组中的一段元素组合成一个新数组。
Array.prototype.toSource() 返回一个表示当前数组字面量的字符串。
遮蔽了原型链上的Object.prototype.toSource() 方法。
Array.prototype.toString()返回一个由所有数组元素组合而成的字符串。
遮蔽了原型链上的Object.prototype.toString() 方法。
Array.prototype.toLocaleString()返回一个由所有数组元素组合而成的本地化后的字符串。
遮蔽了原型链上的Object.prototype.toLocaleString() 方法。
Array.prototype.indexOf()返回数组中第一个与指定值相等的元素的索引,如果找不到这样的元素,则返回-1。
stIndexOf()返回数组中最后一个(从右边数第一个)与指定值相等的元素的索引,如果找不到这样的元素,则返回-1。
遍历方法Array.prototype.forEach()为数组中的每个元素执行一次回调函数。
Array.prototype.entries() 返回一个数组迭代器对象,该迭代器会包含所有数组元素的键值对。
Array.prototype.every()如果数组中的每个元素都满足测试函数,则返回true,否则返回false。
Array.prototype.some()如果数组中至少有一个元素满足测试函数,则返回true,否则返回false。
Array.prototype.filter()将所有在过滤函数中返回true 的数组元素放进一个新数组中并返回。
Array.prototype.find() 找到第一个满足测试函数的元素并返回那个元素的值,如果找不到,则返回undefined。
Array.prototype.findIndex() 找到第一个满足测试函数的元素并返回那个元素的索引,如果找不到,则返回-1。
Array.prototype.keys() 返回一个数组迭代器对象,该迭代器会包含所有数组元素的键。
Array.prototype.map()返回一个由回调函数的返回值组成的新数组。
Array.prototype.reduce()从左到右为每个数组元素执行一次回调函数,并把上次回调函数的返回值放在一个暂存器中传给下次回调函数,并返回最后一次回调函数的返回值。
Array.prototype.reduceRight()从右到左为每个数组元素执行一次回调函数,并把上次回调函数的返回值放在一个暂存器中传给下次回调函数,并返回最后一次回调函数的返回值。
Array.prototype.values() 返回一个数组迭代器对象,该迭代器会包含所有数组元素的值。
Array.prototype[@@iterator]() 和上面的values() 方法是同一个函数。
3、如何将类数组的变量转化为数组?是如果是ES6,可以用Array.from()方法;如果不确定环境的话,可以用Array.prototype.slice.call()的方法,将类似数组转换为。
(1)Array.from()的详解:Set类型的转换let s = new Set(['foo', window]);Array.from(s);// ["foo", window]Map类型的转换let m = new Map([[1, 2], [2, 4], [4, 8]]);Array.from(m);// [[1, 2], [2, 4], [4, 8]]类数组的值function f() {return Array.from(arguments);}f(1, 2, 3);// [1, 2, 3]Array.from()的第二个参数mapFn也很有用处,可以对于传入的类数组值进行定制化修改// Using an arrow function as the map function to// manipulate the elementsArray.from([1, 2, 3], x => x + x);// [2, 4, 6]// Generate a sequence of numbers// Since the array is initialized with `undefined` on each position,// the value of `v` below will be `undefined`Array.from({length: 5}, (v, i) => i);// [0, 1, 2, 3, 4]4、说一说ES6对于数组的扩展增加了扩展运算符(spread)...它将一个数组转化为以逗号分隔的一个参数序列。
var list = [1,2,3];console.log(...list); //1 2 3增加了两个方法,Array.from()和Array.of()方法。
增加了一些实例方法,如copyWithin()、entries()、keys()、values()等。
5、数组去重,你能说出多少种方法?(1)利用一个空Object来实现Array.prototype.unique = function(){var tmp = {},res=[];this.forEach(function(i){!tmp[i] && res.push(i) && (tmp[i] = true);})return res;}var list = [0,0,1,2,3,6,6];console.log(list.unique()); //[0,1,2,3,6](2)利用ES6 的Set数据结构console.log([...new Set(list)]); //[0,1,2,3,6]6、你知道Array.prototype的类型是什么吗?很多人都不知道,其实Array.prototype是一个数组,只不过length为0如何“打平”一个嵌套数组,如[1,[2,[3]],4,[5]] => [1,2,3,4,5]?你能说出多少种方法?这个方法很多,如果你的答案是用递归的话,那确实有点low,而且代码会比较复杂。
(1)利用Array.prototype.toString()方法var list = [1,[2,[3]],4,[5]];console.log(list.toString()); //1,2,3,4,5原理:toString 方法返回一个字符串,该字符串由数组中的每个元素的toString() 返回值经调用join() 方法连接(由逗号隔开)组成。
(2)利用Array.prototype.join()方法var list = [1,[2,[3]],4,[5]];console.log(list.join()); //1,2,3,4,5原理:join方法会让所有的数组元素转换成字符串,再用一个分隔符将这些字符串连接起来。
如果元素是undefined 或者null,则会转化成空字符串。
PS:如果你觉得上面输出的不是一个数组,可以稍微加工一下var list = [1,2,3,4,5];JSON.parse(`[${list.toString()}]`); //[1,2,3,4,5]JSON.parse(`[${list.join()}]`); //[1,2,3,4,5]7、如何克隆一个数组?你能说出多少种?(1)借用concat方法var arr1 = [1,2,3];var arr2 = arr1.concat();(2)借用slice方法var arr1 = [1,2,3];var arr2 = arr1.slice(0);原理:数组本质上也是Object,直接赋值的话,只是将引用赋值给另一个变量,最终会导致被复制的变量也会随着原来的数组变化而变化。