前端面试题

Happy coding.

new的原理

function Foo (name, age) {this.name = name;this.age = age;this.class = 'class-1';// return this // 默认有这一行,new是一种语法糖,// 它帮我们在每个new Foo()中添加了这一句代码
}var f = new Foo('z', 22);
// var f2 = new Foo('x', 21);

new操作符具体干了什么呢?

  • 创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
  • 属性和方法被加入到 this 引用的对象中。
  • 新创建的对象由 this 所引用,并且最后隐式的返回 this 。
var obj  = {};
obj.__proto__ = Base.prototype;
Base.call(obj);

如何去判断一个变量是不是数组

isArray = Array.isArray || function (obj) { return obj instanceof Array; };

什么时候使用=====

jQuery源码中,除了判断一个对象是否为空时使用==,其他任何地方都使用===

if (obj == null) {// 相当于obj === null || obj === undefined
}

XML和JSON的区别

(1).数据体积方面。
JSON相对于XML来讲,数据的体积小,传递的速度更快些。
(2).数据交互方面。
JSON与JavaScript的交互更加方便,更容易解析处理,更好的数据交互。
(3).数据描述方面。
JSON对数据的描述性比XML较差。
(4).传输速度方面。
JSON的速度要远远快于XML。

说说你对作用域链的理解

  • 作用域链的作用是保证执行环境里有权访问的变量和函数是有序的;
  • 作用域链的变量只能向上访问,变量访问到window对象即被终止,作用域链向下访问变量是不被允许的。

渐进增强和优雅降级

  • 渐进增强 :针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。

  • 优雅降级 :一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。

创建ajax过程

  1. 创建XMLHttpRequest对象,也就是创建一个异步调用对象.
  2. 创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息.
  3. 设置响应HTTP请求状态变化的函数.
  4. 发送HTTP请求.
  5. 获取异步调用返回的数据.
  6. 使用JavaScript和DOM实现局部刷新.
var xhr = new XMLHttpRequest()
xhr.open('GET', url, false)
xhr.onreadystatechange = function() {if (xhr.readyState === 4) {if (xhr.status === 200) {alert(xhr.responseText)}}
}
xhr.send(null)

对前端模块化的认识

  • AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。
  • CMD 是 SeaJS 在推广过程中对模块定义的规范化产出。
  • AMD 是提前执行,CMD 是延迟执行。
  • AMD推荐的风格通过返回一个对象做为模块对象,CommonJS的风格通过对module.exportsexports的属性赋值来达到暴露模块对象的目的。
  • CMD模块方式
define(function(require, exports, module) {// 模块代码
});

谈谈性能优化问题

  • 代码层面:避免使用css表达式,避免使用高级选择器(#),通配选择器(*)。
  • 缓存利用:缓存Ajax,使用CDN,使用外部js和css文件以便缓存,添加Expires- 头,服务端配置Etag,减少DNS查找等
  • 请求数量:合并样式和脚本,使用css图片精灵,初始首屏之外的图片资源按需加载,静态资源延迟加载。
  • 请求带宽:压缩文件,开启GZIP,

代码层面的优化

  • hash-table来优化查找
  • 少用全局变量
  • innerHTML代替DOM操作,减少DOM操作次数,优化javascript性能
  • setTimeout来避免页面失去响应
  • 缓存DOM节点查找的结果
  • 避免使用CSS Expression
  • 避免全局查询
  • 避免使用with(with会创建自己的作用域,会增加作用域链长度)
  • 多个变量声明合并
  • 避免图片和iFrame等的空Src。空Src会重新加载当前页面,影响速度和效率
  • 尽量避免写在HTML标签中写Style属性

移动端性能优化

  • 尽量使用css3动画,开启硬件加速。
  • 适当使用touch事件代替click事件。
  • 避免使用css3渐变阴影效果。
  • 可以用transform: translateZ(0)来开启硬件加速。
  • 不滥用Float。Float在渲染时计算量比较大,尽量减少使用
  • 不滥用Web字体。Web字体需要下载,解析,重绘当前页面,尽量减少使用。
  • 合理使用requestAnimationFrame动画代替setTimeout
  • CSS中的属性(CSS3 transitions、CSS3 3D transforms、Opacity、Canvas、WebGL、Video)会触发GPU渲染,请合理使用。过渡使用会引发手机过耗电增加
  • PC端的在移动端同样适用

ES6的了解

  • 新增模板字符串(为JavaScript提供了简单的字符串插值功能)、
  • 箭头函数(操作符左边为输入的参数,而右边则是进行的操作以及返回的值Inputs=>outputs。)、
  • for-of(用来遍历数据—例如数组中的值。)
  • arguments对象可被不定参数和默认参数完美代替。
  • ES6promise对象纳入规范,提供了原生的Promise对象。
  • 增加了letconst命令,用来声明变量;增加了块级作用域;let命令实际上就增加了块级作用域。
  • ES6规定,var命令和function命令声明的全局变量,属于全局对象的属性;let命令、const命令、class命令声明的全局变量,不属于全局对象的属性。还有就是引入module模块的概念

Doctype作用? 严格模式与混杂模式如何区分?它们有何意义?

  1. <!DOCTYPE> 声明位于文档中的最前面,处于 <html> 标签之前。告知浏览器以何种模式来渲染文档。
  2. 严格模式的排版和 JS 运作模式是 以该浏览器支持的最高标准运行。
  3. 在混杂模式中,页面以宽松的向后兼容的方式显示。模拟老式浏览器的行为以防止站点无法工作。
  4. DOCTYPE不存在或格式不正确会导致文档以混杂模式呈现。

一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?

  • 分为4个步骤:

    1. 当发送一个URL请求时,不管这个URL是Web页面的URL还是Web页面上每个资源的URL,浏览器都会开启一个线程来处理这个请求,同时在远程DNS服务器上启动一个DNS查询。这能使浏览器获得请求对应的IP地址。
    2. 浏览器与远程Web服务器通过TCP三次握手协商来建立一个TCP/IP连接。该握手包括一个同步报文,一个同步-应答报文和一个应答报文,这三个报文在 浏览器和服务器之间传递。该握手首先由客户端尝试建立起通信,而后服务器应答并接受客户端的请求,最后由客户端发出该请求已经被接受的报文。
    3. 一旦TCP/IP连接建立,浏览器会通过该连接向远程服务器发送HTTPGET请求。远程服务器找到资源并使用HTTP响应返回该资源,值为200的HTTP响应状态表示一个正确的响应。
    4. 此时,Web服务器提供资源服务,客户端开始下载资源。
  • 请求返回后,便进入了我们关注的前端模块

    1. 简单来说,浏览器会解析HTML生成DOM Tree
    2. 其次会根据CSS生成CSS Rule Tree,
    3. javascript又可以根据DOM API操作DOM

GET和POST的区别,何时使用POST?

  • GET:一般用于信息获取,使用URL传递参数,对所发送信息的数量也有限制,一般在2000个字符
  • POST:一般用于修改服务器上的资源,对所发送的信息没有限制。
  • GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值,
  • 也就是说Get是通过地址栏来传值,而Post是通过提交表单来传值。
  • 然而,在以下情况中,请使用 POST 请求:
    1. 无法使用缓存文件(更新服务器上的文件或数据库)
    2. 向服务器发送大量数据(POST 没有数据量限制)
    3. 发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠

实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制

Object.prototype.clone = function(){var o = this.constructor === Array ? [] : {};for(var e in this){o[e] = typeof this[e] === "object" ? this[e].clone() : this[e];}return o;
}

说说严格模式的限制

  • 严格模式主要有以下限制:

    1. 变量必须声明后再使用
    2. 函数的参数不能有同名属性,否则报错
    3. 不能使用with语句
    4. 不能对只读属性赋值,否则报错
    5. 不能使用前缀0表示八进制数,否则报错
    6. 不能删除不可删除的属性,否则报错
    7. 不能删除变量delete prop,会报错,只能删除属性delete global[prop]
    8. eval不会在它的外层作用域引入变量
    9. eval和arguments不能被重新赋值
    10. arguments不会自动反映函数参数的变化
    11. 不能使用arguments.callee
    12. 不能使用arguments.caller
    13. 禁止this指向全局对象
    14. 不能使用fn.caller和fn.arguments获取函数调用的堆栈
    15. 增加了保留字(比如protected、static和interface)
  • 设立”严格模式”的目的,主要有以下几个:

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

注:经过测试IE6,7,8,9均不支持严格模式。

说说你对AMD和Commonjs的理解

  • CommonJS是服务器端模块的规范,Node.js采用了这个规范。CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作。AMD规范则是非同步加载模块,允许指定回调函数。
  • AMD推荐的风格通过返回一个对象做为模块对象,CommonJS的风格通过对module.exportsexports的属性赋值来达到暴露模块对象的目的。

说说你对MVC和MVVM的理解

  • MVC

    1. View 传送指令到 Controller
    2. Controller 完成业务逻辑后,要求 Model 改变状态
    3. Model 将新的数据发送到 View,用户得到反馈
    4. 所有通信都是单向的。
  • Angular它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。

    1. 组成部分Model、View、ViewModel
    2. View:UI界面
    3. ViewModel:它是View的抽象,负责View与Model之间信息转换,将View的
      Command传送到Model;
    4. Model:数据访问层

cookiesessionStorage localStorage的区别

  • 容量

    前者的最大内存为4KB,后者的最大内存为5MB

  • 是否会携带到ajax

    前者会被携带到每次请求中,后者不会

  • API易用性

    前者本质是字符串,可以直接从document.cookie获取;

    后者可以通过localStorage.getItem(key)localStorage.setItem(key, value)存取数据。

    注:localStorage.getItem(key),在IOS Safari的隐藏模式下会报错;因此,推荐在使用时,用try {} catch (e) {}捕获错误。

前端一些常见的面试题相关推荐

  1. 前端一面常见vue面试题汇总

    说说你对 proxy 的理解,Proxy 相比于 defineProperty 的优势 Object.defineProperty() 的问题主要有三个: 不能监听数组的变化 :无法监控到数组下标的变 ...

  2. 前端不常见25k+面试题(持续更新)

    这一套面试题可能和网上看到的都不太一样,如果你都能答出来,那你就是25k+的水平了 1.苹果手机字体的锯齿怎么实现平滑 -webkit-font-smoothing: subpixel-antiali ...

  3. 2021最前端最常见的面试题

    假如给你一个复杂的功能让你实现,有什么思路写好这个功能? 解决问题之前需要理解问题,找出问题的主干 要求解的是什么? 需要实现的复杂功能是什么? 已知什么? 这个功能的实现逻辑什么是什么? 要满足哪些 ...

  4. 前端最常见的面试题整理

    自我简介 你好,面试官,我叫XX,有两年的开发经验,来应聘前端开发工程师这一岗位,上一家公司是XXX时代科技有限公司,期间主要负责pc端网站的开发,还有微信小程序和app的维护,开发的技术栈主要就是v ...

  5. 前端的常见的面试试题

    Javascript有哪些打开一个页面的方式? 1.超链接<a href="http://www.100sucai.com/" title="100素材网" ...

  6. Web前端人员如何面试?常见vue面试题有哪些?

    Web前端人员如何面试?常见vue面试题有哪些?vue是一套用于构建用户界面的渐进式JavaScript框架,也是初创项目的首选前端框架.很多企业在招聘前端工程师时都会考察其对vue的了解,接下来小编 ...

  7. 前端—每天5道面试题(十)

    前端-每天5道面试题(十) 每天进步1% 不多 就1% 一.用 div+css 布局的好处? 表现和内容相分离 将设计部分剥离出来放在一个独立样式文件中,HTML 文件中只存放文本信息. 提高搜索引擎 ...

  8. 前端—每天5道面试题(九)

    前端-每天5道面试题(九) 每天进步1% 不多 就1% 一.overflow 有哪些属性值? Visible:默认值,内容不会被修剪,会呈现在元素框之外. Hidden:内容会被修剪,并且其余内容是不 ...

  9. 前端—每天5道面试题(7)

    前端-每天5道面试题(7) 每天背5道前端面试题,你会越来越优秀 1.webpack 中 loader 和 plugin 的区别是什么? loader:loader 是一个转换器,将 A 文件进行编译 ...

最新文章

  1. shell脚本编程学习笔记(四)shell操作数据库
  2. java的rsa作用_java 中RSA的方式实现非对称加密的实例
  3. shell中使用echo命令改变输出显示样式
  4. linux启用ipmi服务,使用 ipmitool 实现 Linux 系统下对服务器的 ipmi 管理
  5. 利用云数据库 MongoDB ,为你的业务创建单节点实例
  6. 安卓加java完成登录_从零学习安卓自动化(java+appium方向):完成登录操作+一个主流程(四)...
  7. tp5微信公众号获取用户openid_tp5+微信公众号获取用户基本信息
  8. 工大瑞普 NP-OSPF综合实验
  9. php 实现公众号模板消息url 跳转
  10. setPositiveButton和setNegativeButton
  11. vue-awesome-swiper滑动失效的问题解决方案
  12. zhang 快速并行细化方法_Zhang快速并行细化算法.docx
  13. SpringSecurity实现自定义登录界面
  14. 微信小程序-番外 可视化助手的使用
  15. 边缘计算与深度学习综述
  16. AFN的简单介绍及使用
  17. 英特尔oneAPI---跨架构实现高效率
  18. 初中数学503个必考知识点_初中数学:21个必考知识点+重难点!打印背熟,3年不下130+!...
  19. java while详解_Java while循环-Java while-嗨客网
  20. 【2021-07-23】JS逆向之某乎x_zes_96

热门文章

  1. Python Day13 面向对象基础【初级】
  2. QQ影音的播放画面旋转
  3. 说他是人像拍照大师,可有意见?
  4. Lua配置表存储优化方案
  5. 硬质聚氨酯(PUR)和聚异氰脲酯(PIR)泡沫产品保温材料英国UKCA认证- EN 14318-1
  6. phpcm——域名转换问题
  7. Abaqus 二次开发 基本概念
  8. Python学习项目——类【流浪图书馆】案例
  9. [zz]sysfader:iexplore.exe-应用程序错误的解决方法
  10. 【原创】分享一个小游戏