iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >分享JavaScript常见面试题
  • 349
分享到

分享JavaScript常见面试题

2024-04-02 19:04:59 349人浏览 薄情痞子
摘要

这篇文章主要讲解了“分享javascript常见面试题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“分享JavaScript常见面试题”吧!一、请解释 Ja

这篇文章主要讲解了“分享javascript常见面试题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“分享JavaScript常见面试题”吧!

一、请解释 JavaScript 中 this 是如何工作的。

首先:this 永远指向函数运行时所在的对象,而不是函数被创建时所在的对象。匿名函数或不处于任何对象中的函数指向 window 。

1、 方法调用模式

当函数被保存为对象的一个属性时,成该函数为该对象的方法。函数中this的值为该对象。

var foo = {
    name: 'fooname',
    getName: function (){
        return this.name  
    }
}
foo.getName();  // this => foo

2、 函数调用模式

当函数并不是对象的属性。函数中this的值为全局对象
note:某个方法中的内部函数中的this的值也是全局对象,而非外部函数的this

function foo(){
    this.name = 'fooname';  
}
foo();  // this => window

3、构造器调用模式

即使用new调用的函数,则其中this将会被绑定到那个新构造的对象。

function Foo(){
    this.name = 'fooname';
}
var foo = new Foo();  // this => foo

4、使用apply或call调用模式

该模式调用时,函数中this被绑定到apply或call方法调用时接受的第一个参数。

function getName(name){
    this.name = name;
}
var foo = {};
getName.call(foo, name);  // this =>foo

改变this的值主要方法(目前想到的,欢迎评论添加):
apply或call方法调用时强制修改,使this指向第一个参数。
使用Function.bind方法创造新的函数,该新函数的中this指向所提供的第一个参数。

二、请解释原型继承 (prototypal inheritance) 的原理。

JavaScript没有“子类”和“父类”的概念,也没有“类”(class)和“实例”(instance)的区分,全靠“原型链”(prototype chain)模式,来实现继承。

每个函数Sub都有一个属性prototype,prototype指向一个原型对象,原型对象中也有一个指向函数的属性constructor,通过new一个函数Sub可以产生实例instance,调用这个instance的某个属性或方法时,instance会先查找自身是否有这个方法或者属性,没有的话就会去实例的构造函数Sub的原型prototype中查找,即Sub.prototype,如果给原型对象Sub.prototype赋予另一个类型的实例superInstance,则是在superInstance中查找的,这个superInstance中也有属性prototype指向某个原型对象,以此一级级往上最终到Object.prototype,这样就形成了原型继承。

利用此原理可以自己实现一个inherits函数:

function inherits(subType, superType){
    var _prototype = Object.create(superType.prototype);
    _prototype.constructor = subType;
    subType.prototype = _prototype;
}

三、解释为什么接下来这段代码不是 IIFE (立即调用的函数表达式):function foo(){ }(); 要做哪些改动使它变成 IIFE?

(function fn(){..})(),函数被包含在一个括号内,变成为一个表达式,随后跟着一个(),就立即执行这个函数。

IIFE的一些作用:

  1. 创建作用域,内部保存一些大量临时变量的代码防止命名冲突。

  2. 一些库的外层用这种形式包起来防止作用域污染。

  3. 运行一些只执行一次的代码。

四、(function fn(){..})(),函数被包含在一个括号内,变成为一个表达式,随后跟着一个(),就立即执行这个函数。

IIFE的一些作用:

  1. 创建作用域,内部保存一些大量临时变量的代码防止命名冲突。

  2. 一些库的外层用这种形式包起来防止作用域污染。

  3. 运行一些只执行一次的代码。

当某个函数调用时会创建一个执行环境以及作用域链,然后根据arguments和其它命名参数初始化形成活动对象。在外部函数调用结束后,其执行环境与作用域链被销毁,但是其活动对象保存在了闭包之中,最后在闭包函数调用结束后才销毁。简单的说,闭包就是能够读取其他函数内部变量的函数。在js中,闭包是指有权访问另一个函数作用域中的变量的函数。

如何使用:将A函数内部的B函数作为A函数的返回值返回。

为什么要:

1、匿名自执行函数

有的场景下函数只需要执行一次,例如init()之类的函数,其内部变量无需维护,我们可以使用闭包。 我们创建了一个匿名的函数,并立即执行它,由于外部无法引用它内部的变量,因此在函数执行完后会立刻释放资源,而且不污染全局对象。

2、封装

模拟面向对象的代码风格进行封装,使私有属性存在成为可能。

五、.call 和 .apply 的区别是什么?

.call和.apply的共同点是都是用来改变函数体内this对象的值。

区别是第二个参数不一样。apply()的第二个参数是一个类数组对象arguments,参数都是以数组的形式传入,而call(),传递给他的是一系列参数。例如

Math.max.call(null, 1, 2, 3, 4);
//4
Math.max.apply(null, [1, 2, 3, 4]);
//4

六、请解释 Function.prototype.bind?

Function.prototype.bind方法会创建一个新函数,当这个新函数被调用时,它的this值是传递给bind()的第一个参数, 它的参数是bind()的其他参数和其原本的参数.

七、请指出 JavaScript 宿主对象 (host objects) 和原生对象 (native objects) 的区别?

宿主对象是指DOM和BOM。
原生对象是Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、Math等对象。

八、请指出以下代码的区别:function Person(){}、var person = Person()、var person = new Person()?

function Person(){}

声明一个函数Person()。

var person = Person()

将函数Person()的结果返回给变量person,如果没有返回值则person为undefined。

var person = new Person()

new一个Person的实例对象。

九、请尽可能详尽的解释 ajax 的工作原理。以及使用 Ajax 都有哪些优劣?

Ajax是无需刷新页面就能从服务器取得数据的一种方法。

Ajax通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM更新页面。

过程

  1. 创建XMLHttpRequest对象。

  2. 设置响应HTTP请求的回调函数。

  3. 创建一个HTTP请求,指定相应的请求方法、url等。

  4. 发送HTTP请求。

  5. 获取服务器端返回的数据。

  6. 使用JavaScript操作DOM更新页面。

缺点

  1. 对搜索引擎不友好

  2. 要实现Ajax下的前后退功能成本较大

  3. 跨域问题限制

十、请解释变量声明提升 (hoisting)。

变量的声明前置就是把变量的声明提升到当前作用域的最前面。
函数的声明前置就是把整个函数提升到当前作用域的最前面(位于前置的变量声明后面)。

//变量的声明前置
console.log(num);//undefined
var num = 1;
等价于
//变量的声明前置
var num;
console.log(num);//undefined
num = 1;

十一、请描述事件冒泡机制 (event bubbling)。

事件冒泡(event bubbling),事件最开始时由触发的那个元素身上发生,然后沿着DOM树向上传播,直到document对象。如果想阻止事件起泡,可以使用e.stopPropagation()。

十二、什么是 “use strict”; ? 使用它的好处和坏处分别是什么?

优点

消除Javascript语法的一些不严谨之处,减少一些怪异行为;
消除代码运行的一些不安全之处,保证代码运行的安全;
提高编译器效率,增加运行速度;
为未来新版本的Javascript做好铺垫。

缺点

严格模式改变了语义。依赖这些改变可能会导致没有实现严格模式的浏览器中出现问题或者错误。

十三、请解释 JavaScript 的同源策略 (same-origin policy)。

同源策略限制了一个源(origin)中加载文本或脚本与来自其它源(origin)中资源的交互方式。同源指的是协议、域名、端口相同,同源策略是一种安全协议。

十四、请解释 JSONP 的工作原理,以及它为什么不是真正的 Ajax。

JSONP(JSON with Padding)是一种非官方跨域数据交互协议,它允许在服务器端集成< script >标签返回至客户端,通过javascript回调的形式实现跨域访问。

因为同源策略的原因,我们不能使用XMLHttpRequest与外部服务器进行通信,但是< script >可以访问外部资源,所以通过JSON与< script >相结合的办法,可以绕过同源策略从外部服务器直接取得可执行的JavaScript函数。

原理

客户端定义一个函数,比如jsonpCallback,然后创建< script >,src为url + ?jsonp=jsonpCallback这样的形式,之后服务器会生成一个和传递过来jsonpCallback一样名字的参数,并把需要传递的数据当做参数传入,比如jsonpCallback(json),然后返回给客户端,此时客户端就执行了这个服务器端返回的jsonpCallback(json)回调。

通俗的说,就是客户端定义一个函数然后请求,服务器端返回的javascript内容就是调用这个函数,需要的数据都当做参数传入这个函数了。

优点 - 兼容性好,简单易用,支持浏览器与服务器双向通信
缺点 - 只支持GET请求;存在脚本注入以及跨站请求伪造等安全问题

补充一点,JSONP不使用XMLHttpRequest对象加载资源,不属于真正意义上的AJAX。

十五、== 和 === 有什么不同?

通俗的说就是===比==要更为严格,===比较过程中没有任何的类型转换。

十六、什么是三元表达式 (Ternary expression)?“三元 (Ternary)” 表示什么意思?

如名字表示的三元运算符需要三个操作数。
语法是
条件 ? 结果1 : 结果2;
这里你把条件写在问号(?)的前面后面跟着用冒号(:)分隔的结果1和结果2。满足条件时结果1否则结果2。

十七、你怎么看 AMD vs. CommonJS?

浏览器端异步和服务器端同步的模块化编程规范

十八、请举出一个匿名函数的典型用例?

定义回调函数,立即执行函数,作为返回值的函数,使用方法var foo = function() {}定义的函数。

十九、描述以下变量的区别:null,undefined 或 undeclared?该如何检测它们?

未定义的属性、定义未赋值的为undefined,JavaScript访问不会报错;null是一种特殊的object;NaN是一种特殊的number;undeclared 是未声明也未赋值的变量,JavaScript访问会报错。

二十、在什么时候你会使用 document.write()?

DOM方法,可向文档写入 html 表达式或 JavaScript 代码。

二十一、如何实现下列代码:[1,2,3,4,5].duplicator(); // [1,2,3,4,5,1,2,3,4,5]

Array.prototype.duplicator = function(){
  var l = this.length,i;
  for(i=0;i<l;i++){
   this.push(this[i]) 
   }
}

二十二、解释 function foo() {} 与 var foo = function() {} 用法的区别

函数声明的两种方法:

  1. var foo = function () {}
    这种方式是声明了个变量,而这个变量是个方法,变量在js中是可以改变的。
    也:将一个匿名函数赋值给了变量。

  2. function foo() {}
    这种方式是声明了个方法,foo这个名字无法改变

二十三、请解释可变 (mutable) 和不变 (immutable) 对象的区别。

在 JavaScript 中,对象是引用类型的数据,其优点在于频繁的修改对象时都是在原对象的基础上修改,并不需要重新创建,这样可以有效的利用内存,不会造成内存空间的浪费,对象的这种特性可以称之为 Mutable,中文的字面意思是「可变」。

Immutable 从字面上翻译成中文是「不可变」。每次修改一个 Immutable 对象时都会创建一个新的不可变的对象,在新对象上操作并不会影响到原对象的数据。

二十四、使用 Promises 而非回调 (callbacks) 优缺点是什么?

Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,es6将其写进了语言标准,统一了用法,原生提供了Promise对象。

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息。Promise提供统一的api,各种异步操作都可以用同样的方法进行处理。

有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,使得控制异步操作更加容易。

Promise也有一些缺点。

首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。
其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。
第三,当处于Pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。

二十五、请解释同步 (synchronous) 和异步 (asynchronous) 函数的区别。

同步调用,在发起一个函数或方法调用时,没有得到结果之前,该调用就不返回,直到返回结果;

异步调用的概念和同步相对,在一个异步调用发起后,被调用者立即返回给调用者,但调用者不能立刻得到结果,被调用者在实际处理这个调用的请求完成后,通过状态、通知或回调等方式来通知调用者请求处理的结果。

简单地说,同步就是发出一个请求后什么事都不做,一直等待请求返回后才会继续做事;异步就是发出请求后继续去做其他事,这个请求处理完成后会通知你,这时候就可以处理这个回应了。

二十六、你使用哪些工具和技术来调试 JavaScript 代码?

1.javascript的debugger语句
需要调试js的时候,我们可以给需要调试的地方通过debugger打断点,代码执行到断点就会暂定,这时候通过单步调试等方式就可以调试js代码

if (waldo) {
    debugger;
}

这时候打开console面板,就可以调试了

2.DOM断点
DOM断点是一个Firebug和chrome DevTools提供的功能,当js需要操作打了断点的DOM时,会自动暂停,类似debugger调试。
使用DOM断点步骤:
选择你要打断点的DOM节点
右键选择Break on..
选择断点类型

另外的调试方法例如alert, console.log,查看元素等就不再赘述了。

二十七、你会使用怎样的语言结构来遍历对象属性 (object properties) 和数组内容?

for in 语句
一般for循环
数组forEach方法

感谢各位的阅读,以上就是“分享JavaScript常见面试题”的内容了,经过本文的学习后,相信大家对分享JavaScript常见面试题这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 分享JavaScript常见面试题

本文链接: https://www.lsjlt.com/news/85647.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 分享JavaScript常见面试题
    这篇文章主要讲解了“分享JavaScript常见面试题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“分享JavaScript常见面试题”吧!一、请解释 Ja...
    99+
    2024-04-02
  • 常见的JavaScript面试题有哪些
    这篇文章主要介绍常见的JavaScript面试题有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!JavaScript可以做什么1.可以使网页具有交互性,例如响应用户点击,给用户提供更好的体验。2.可以处理表单,检...
    99+
    2023-06-14
  • 有哪些常见的JavaScript面试题
    今天就跟大家聊聊有关有哪些常见的JavaScript面试题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.this指向1.谁调用指向谁例:  function&...
    99+
    2023-06-15
  • RocketMq常见面试题
    目录 1、RocketMQ Broker中的消息被消费后会立即删除吗?2、RocketMQ消费模式有几种?3、消费消息是push还是pull?4、broker如何处理拉取请求的? ----??...
    99+
    2023-09-03
    java-rocketmq rocketmq java
  • PHP常见面试题
    一. 基本知识点 1.1 HTTP协议中几个状态码的含义:503 500 401 403 404 200 301 302。。。 200 : 请求成功,请求的数据随之返回。 301 : 永久性重定向。 302 : 暂时行重定向。 401 : ...
    99+
    2023-09-04
    php 服务器 开发语言
  • Vue.js 常见面试题
    什么是SPA?SAP意思是 单页面应用 。SPA 是一种应用程序,它提前下载好布局,并让页面在不同布局之间切换进而无需刷新就可以渲染整个页面。与此特点相对的,它将会从服务器中获取必要信息并替换页面中对应的内容。什么是 Vue 指令Vue 指...
    99+
    2024-04-02
  • 分享面试官常用16个c/c++面试题
    目录1. C中static有什么作用2.C++中const有什么用?3. C与C++各自是如何定义常量的?有什么不同?4. 既然C++中有更好的const为什么还要使用宏?5. C+...
    99+
    2024-04-02
  • 常见angular面试题实例分析
    本篇内容主要讲解“常见angular面试题实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“常见angular面试题实例分析”吧!1、angular 的数据...
    99+
    2024-04-02
  • 【整理分享】一些常见Vue面试题(附答案解析)
    本次给大家分享一些关于Vue的常见面试题,带你梳理基础知识,增强Vue知识储备,值得收藏,快来看看吧!Vue 常见面试题总结MVVM模型?MVVM,是Model-View-ViewModel的简写,其本质是MVC模型的升级版。其中 Mode...
    99+
    2023-05-14
    面试 Vue.js
  • Java常见的面试题
      1)Java 中能创建 volatile 数组吗  能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组。我的意思是,如果改变引用指向的数组,将会受到 volatile 的保护,但是如果多个线...
    99+
    2023-06-03
  • 常见的PHP面试题
    这篇文章将为大家详细讲解有关常见的PHP面试题,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。通过哪一个函数,可以把错误转换为异常处理?A:set_error_handlerB:error_r...
    99+
    2023-06-15
  • JavaScript异步编程常见面试题汇总
    目录并发(concurrency)和并行(parallelism)的区别回调函数(callback)GeneratorPromiseasync 及 await常用定时器在上一节中我们...
    99+
    2023-02-08
    JavaScript异步编程面试题 JavaScript异步编程 JavaScript面试题
  • 好程序员Java教程分享:Java工程师常见面试题
      好程序员Java教程分享:Java工程师常见面试题  一:BigInteger  (1)针对大整数的运算:可以让超过Integer范围内的数据进行运算。  (2)构造方法  A:BigInteger(String s)  (3)成员方法...
    99+
    2023-06-02
  • Java常见面试题:java面试笔记
    基本数据类型有哪些?基本数据类型包括byte、int、char、long、float、double、boolean和short。 java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空...
    99+
    2023-06-02
  • java常见面试题(160道)
    1. JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。JRE:Java Runtime Environment 的简称,Java 运行...
    99+
    2023-09-12
    java 开发语言 面试
  • Golang协程常见面试题代码分析
    这篇文章主要介绍“Golang协程常见面试题代码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang协程常见面试题代码分析”文章能帮助大家解决问题。交替打印奇数和偶数使用两个gorouti...
    99+
    2023-07-05
  • JavaScript数据结构常见面试问题整理
    目录1.JS有哪些数据类型有什么区别2.数据类型检测的方式3.判断是否是数组的方法4.null和undefined的区别5.手写instanceof方法6.为什么0.1+0.2 !=...
    99+
    2022-11-13
    JavaScript 数据结构 JavaScript 数据结构面试问题
  • 常见的Java面试问题
    JVMJava虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。什么是字节码采用字节码的好处是什么在 Java 中,J...
    99+
    2023-06-03
  • 常见的java string面试题
    常见的java string面试题?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、...
    99+
    2023-06-14
  • java面试常见问题---ConcurrentHashMap
    1、请你描述一下ConcurrentHashMap存储数据结构是什么样子呢? ConcurrentHashMap 内部的 map 结构和 HashMap 是一致的,都是由:...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作