以下问题都来自于互联网前端面经分享,回答为笔者通过查阅资料加上自身理解总结,不保证解答的准确性,有兴趣讨论的同学可以留言或者私信讨论。

1.JS的异步机制?

2.闭包如何实现?

3.原型链、继承?

4.实现订阅者发布者模式?

5.数组的方法有哪些?

1.JS的异步机制?

JS使用一个任务队列记录异步任务的回调函数,当异步任务(或者事件被激发,如鼠标点击)完成后,其回调函数会被添加到该任务队列的末尾,JS主线程在将所有的同步任务执行完毕后,会无限循环地去检查任务队列,如果任务队列不为空,则主线程回去执行任务队列中的任务。

关于异步机制的详细解答,可以参考:Javascript异步机制

2.闭包如何实现?

在计算机科学中,闭包是引用了自由变量的函数。在Javascript中,在一个函数中定义一个内部函数,并且内部函数引用了外部函数作用域的变量,然后将这个内部函数作为外部函数的返回值,这样就构成了一个闭包。如下代码:

function wrapper() {
var milk = '特仑苏'
function drink() {
console.log('我喝了' + milk)
}
return drink
}
var result = wrapper()
result() //我喝了特仑苏

关于闭包的详细解答,可以参考:Javascript闭包

3.原型链、继承?

在Javascript中,每当我们定义一个函数,Javascript引擎就会自动为这个函数对象添加一个prototype属性(也被称作原型),每当我们使用这个函数new创建一个对象时,Javascript引擎就会自动为这个对象中添加一个__ proto __ 属性,并让其指向其类的prototype。当我们访问一个对象的属性时,首先回去寻找该对象本身的属性,如果找不到的话回去寻找该对象的 __ proto __ 作用域下的属性,一直到寻找到该属性或者没有__ proto __为止。这种寻找实例属性的方式我们称作原型链。

当我们让子类的prototype指向父类的实例时,便实现了原型链继承。

// 原型链实现继承的关键代码
Son.prototype = new Father()

当然Javascript的继承方式还有 构造函数继承 、 组合继承 、 寄生继承,更详尽的解答,可以参考:对Javascript 类、原型链、继承的理解

4.实现订阅/发布者模式?

var publisher = {}; // 定义发布者
publisher.list = []; // 缓存列表 存放订阅者回调函数
// 增加订阅者
publisher.listen = function(fn) {
publisher.list.push(fn); // 订阅消息添加到缓存列表
}
// 发布消息
publisher.trigger = function(){
for(var i = 0,fn; fn = this.list[i++];) {
var that = this
fn.apply(null, arguments);
}
}

详细答案可以参考:Javascript中理解发布--订阅模式

5.数组的方法有哪些?

这个题属于开放题,答案就比较多了,下面我列举一下比较常用的数组方法:

遍历方法:

包括 map、foreach、filter

let arr = [{
name:"西瓜",
type:"水果"
},{
name:"芒果",
type:"水果"
},{
name:"小龙虾",
type:"夜宵"
}]
arr.forEach((item, index) => {
console.log(item.name)
}) //分别打印 西瓜 芒果 小龙虾
arr.map((item, index) => {
return item.name
}) //返回数组["西瓜", "芒果", "小龙虾"]
arr.filter((item, index) => {
if (item.type == "水果")
return true;
else
return false;
}) //返回数组[{ name: 西瓜, type : 水果 }, { name: 芒果, type : 水果 }]

forEach:用于遍历数组,无返回值;

map:遍历数组之后,对每一项返回一个值,并将这些返回值都推入一个数组,最后返回这个新的数组;

filter:对数据进行过滤,回调函数返回值为false的项将被过滤掉,最后返回过滤后的数组。

操作方法:

包括 concat、push、pop、unshift、shift、splice

let listA = ["西瓜", "芒果"]
let listB = ["小龙虾"]
let listC = listA.concat(listB)
// 返回值:[西瓜, 芒果, 小龙虾] listC.push("鸡腿")
// 返回值:4
// 数组值:[西瓜, 芒果, 小龙虾, 鸡腿] listC.pop()
// 返回值:"鸡腿"
// 数组值:[西瓜, 芒果, 小龙虾] listC.unshift("鸡腿")
// 返回值:4
// 数组值:[鸡腿, 西瓜, 芒果, 小龙虾] listC.shift()
// 返回值:"鸡腿"
// 数组值:[西瓜, 芒果, 小龙虾] listC.splice(1, 1, "冰激凌", "奶茶")
// 返回值:[芒果]
// 数组值:[西瓜, 冰激凌, 奶茶, 小龙虾]

concat:拼接数组,将参数数组拼接到调用数组末尾,并返回这个新数组;值得一提的是,这个方法并不会改变调用数组和参数数组,即上例中的listA、listB);

push:在数组尾部插入新的元素,返回插入元素之后的数组长度;

pop:从数组尾部删除元素,返回删除的元素;

unshift:在数组头部插入新的元素,返回插入元素之后的数组长度;

shift:从数组头部删除元素,返回删除的元素;

splice:删除元素并插入元素,第一个参数为操作位置X,第二个参数为需要从操作位置X删除元素数量,后面的参数为需要从操作位置X插入的元素,返回删除的元素组成的数组。

前端高频面试题 JavaScript篇的更多相关文章

  1. BAT及各大互联网公司2014前端笔试面试题--JavaScript篇

    很多面试题是我自己面试BAT亲身经历碰到的.整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习js更是大有裨益. 而更多的题目是我一路以来收集的,也有往年的,答案不确保一定正确, ...

  2. BAT及各大互联网公司2014前端笔试面试题--JavaScript篇(昨天某个群友表示写的简单了点,然后我无情的把他的抄了一遍)

    (某个群友)http://www.cnblogs.com/coco1s/ 很多面试题是我自己面试BAT亲身经历碰到的.整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习js更是大 ...

  3. 前端高频面试题 CSS篇

    通过从网上看到的面经,总结的一些高频的前端CSS面试题,有很多不会,于是找资料,并通过代码实现,自己提供了一些参考答案. 目录 1.怎样会产生浮动? 2.如何清除浮动? 3.盒子模型,以及IE和其他浏 ...

  4. 各大互联网公司2014前端笔试面试题–JavaScript篇

    很多面试题是我自己面试BAT亲身经历碰到的.整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习js更是大有裨益. 而更多的题目是我一路以来收集的,也有往年的,答案不确保一定正确, ...

  5. 【前端】互联网公司2014前端笔试面试题JavaScript篇(待续)

    // 网上找的题目,自己做了下 /**************************** *1. 用js实现随机选取10–100之间的10个数字,存入一个数组,并排序 *************** ...

  6. 前端性能优化(JavaScript篇)

    正巧看到在送书,于是乎找了找自己博客上记录过的一些东西来及其无耻的蹭书了~~~ 小广告:更多内容可以看我的博客 优化循环 如果现在有个一个data[]数组,需要对其进行遍历,应当怎么做?最简单的代码是 ...

  7. 前端开发面试题-JavaScript(转载)

    本文由 本文的原作者markyun 收集总结. 介绍js的基本数据类型. Undefined.Null.Boolean.Number.String. ECMAScript 2015 新增:Symbol ...

  8. 前端开发面试题 — html篇

    正值跳槽的金三银四月,在四月的中旬之际,博主为大家整理了几篇前端面试题,希望不会太迟 1.Doctype作用?标准模式与兼容模式各有什么区别? (1)<!DOCTYPE> 声明位于HTML ...

  9. 前端知识杂烩(Javascript篇)

    1. JavaScript是一门什么样的语言,它有什么特点?2.JavaScript的数据类型都有什么?3.请描述一下 cookies,sessionStorage 和 localStorage 的区 ...

随机推荐

  1. MySql压缩版安装及避免1055错误和msvcp120.dll丢失

    MySql压缩版安装及避免1055错误和msvcp120.dll丢失 MySQL压缩版的安装快速方便,5.7及最新的8版本安装方式大致相同. 在使用group by分组时,可能会遇到1055错误. 另 ...

  2. centos配置本地yum源和光盘挂载

    说明:以centos6.5为例创建本地yun源,centos7的创建方法和centos6的是一样的. 创建挂载目录: mkdir /dvd 开机自动挂载光盘 echo /dev/cdrom   /dv ...

  3. vue-music:歌词的其他功能

    由于歌词的播放需要歌曲播放,切换歌曲,歌曲的播放模式等等有关联,因此,需要在这几处处理相关问题 1.循环播放回不到开始位置 loop() { this.$refs.audio.currentTime ...

  4. 如何快速获取当前链接?后面的内容,location.search、页面滚动

    function request() { var urlStr = location.search; ) { theRequest={}; return; } urlStr = urlStr.subs ...

  5. Django 连接mysql数据库

    首先在settings.py文件里将 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.pat ...

  6. Luogu 2569 [SCOI2010]股票交易 (朴素动规转移 + 单调队列优化)

    题意: 已知未来 N 天的股票走势,第 i 天最多买进 as [ i ] 股每股 ap [ i ] 元,最多卖出 bs [ i ] 股每股 bp [ i ] 元,且每天最多拥有 Mp 股,且每两次交易 ...

  7. Linux下平滑升级nginx

    一.升级前准备 1.对nginx的配置文件nginx.conf做备份: 2.新建目录/root/nginx,将安装包和脚本上传到该目录下: 二.平滑升级nginx 1.开始编译新版本的nginx cd ...

  8. luogu1879 [USACO06NOV]玉米田Corn Fields

    学习位运算 #include <iostream> #include <cstdio> using namespace std; int n, m, dp[15][4105], ...

  9. centos 7 smplayer vlc播放器

    centos7安装多媒体播放器SMPlayer 2017-03-13 21:37:14 分类: LINUX 转自:https://wiki.centos.org/TipsAndTricks/Multi ...

  10. lvs+keepalive主从和主主架构

    下面配置主从 1)关闭SELinux和防火墙 vi /etc/sysconfig/selinux SELINUX=disabled setenforce 临时关闭SELinux,文件配置后,重启生效 ...