Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+!
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 723|回复: 0

[默认分类] 12个常规前端面试题及小结

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-7-10 10:55:15 | 显示全部楼层 |阅读模式

    12个常规前端面试题及小结

      
       https://juejin.im/post/592f8124a0bb9f0058a114d0

       1.简述一下你对HTML语义化的理解?并写出一段语义化的HTML?
      
        语义化是指根据内容的结构化(内容语义化),选择合适的标签(代码语义化),便于开发者阅读和写出更优雅的代码的同时,让浏览器的爬虫和机器很好的解析。
       
       
        用正确的标签做正确的事情
        html语义化让页面的内容结构化,结构更清晰,便于对浏览器、搜索引擎解析
        语义化的HTML在没有CSS的情况下也能呈现较好的内容结构与代码结构
        搜索引擎的爬虫也依赖于HTML标记来确定上下文和各个关键字的权重,利于SEO;
        使阅读源代码的人对网站更容易将网站分块,便于阅读维护理解
        HTML5增加了许多语义化标签如:
    1. header
    复制代码
    1. footer
    复制代码
    1. nav
    复制代码
    1. article
    复制代码
    ……
       
       语义化HTML示例:
      
    1. [code]<!-- 这是开放的 -->
    2. <header>
    3.     <h1>header</h1>
    4. </header>
    5. <section class="main">
    6.   main
    7. </section>
    8. <aside>aside</aside>
    9. <footer>
    10.   footer
    11. </footer>
    复制代码
    [/code]
       2. HTML5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?
      
        HTML5 是定义 HTML 标准的最新的版本。 该术语表示两个不同的概念:
       
         它是一个新版本的HTML语言,具有新的元素,属性和行为,
         它有更大的技术集,允许更多样化和强大的网站和应用程序。这个集合有时称为HTML5和朋友,通常缩写为HTML5。
       
       
       HTML5新特性:
       
        HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加
        绘画 canvas;
        用于媒介回放的 video 和 audio 元素;
        本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失
        sessionStorage 的数据在浏览器关闭后自动删除
        语意化更好的内容元素,比如
    1. article
    复制代码
    、
    1. footer
    复制代码
    、
    1. header
    复制代码
    、
    1. nav
    复制代码
    、
    1. section
    复制代码
        表单控件,
    1. calendar
    复制代码
    、
    1. date
    复制代码
    、
    1. time
    复制代码
    、
    1. email
    复制代码
    、
    1. url
    复制代码
    、
    1. search
    复制代码
        新的技术webworker, websocket, Geolocation
       
       移除元素:
       
        纯表现的元素
    1. basefont
    复制代码
    ,
    1. big
    复制代码
    ,
    1. center
    复制代码
    ,
    1. font
    复制代码
    ,
    1. s
    复制代码
    ,
    1. strike
    复制代码
    ,
    1. tt
    复制代码
    ,
    1. u
    复制代码
        对可用性产生负面影响的元素:
    1. frame
    复制代码
    ,
    1. frameset
    复制代码
    ,
    1. noframes
    复制代码
       
       处理HTML5新标签的浏览器兼容问题:
       
        IE8/IE7/IE6支持通过document.createElement方法产生的标签,可以利用这一特性让这些浏览器支持HTML5新标签,浏览器支持新标签后,还需要添加标签默认的样式。
        可直接使用成熟的框架、比如html5shiv
    1. [code]<!--[if lt IE 9]>
    2. <script src="html5shiv.js"></script>
    3. <![endif]-->
    复制代码
    [/code]
       
       如何区分 HTML 和 HTML5:
       
        DOCTYPE声明
        新增元素
       
       3. 为什么要初始化CSS样式(reset css)?
       
        因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面显示差异
        最简单粗暴的
    1. [code]* {
    2.     margin: 0;
    3.     padding: 0;
    4. }
    复制代码
    [/code]
        更好的选择Normalize.css 相比于传统的CSS reset,Normalize.css是一种现代的、为HTML5准备的优质替代方案
        Reset CSS:只选对的,不选"贵"的,因根据具体项目来做选择权衡,不应该滥用
       
       4. css定义的权重?
      
        页面显示样式的优先级取决于其“特殊性”’,特殊性越高,就显示最高的,当特殊性相等时,显示后者
        特殊性表述为4个部分:0,0,0,0
       
       一个选择器的特殊性如下确定:
       
        对于选择器是
    1. #id
    复制代码
    的属性值,特殊性值为:0,1,0,0
        对于属性选择器,
    1. class
    复制代码
    或伪类,特殊性值为:0,0,1,0
        对于标签选择器或伪元素,特殊性值为:0,0,0,1
        通配符‘*’对特殊性值为:0,0,0,0
        内联样式特殊性值为:1,0,0,0
       
       5. 讲讲
    1. position
    复制代码
    的值
    1. relative
    复制代码
    和
    1. absolute
    复制代码
    的区别?
       
        absolute:生成绝对定位的元素,相对于值不为 static的第一个父元素进行定位
        relative:生成相对定位的元素,相对于其正常位置进行定位​
       
       6. 如何水平垂直居中
    1. div
    复制代码
    ?(至少给出2种解决方法)
       1.absolute + transform:
      
    1. [code]<div class="parent">
    2.   <div class="child">Demo</div>
    3. </div>
    4. <style>
    5. .parent {
    6. position: relative;
    7. }
    8. .child {
    9. position: absolute;
    10. left: 50%;
    11. top: 50%;
    12. transform: translate(-50%, -50%);
    13. }
    14. </style>
    复制代码
    [/code]
       2.inline-block + text-align + table-cell + vertical-align
      
    1. [code]<div class="parent">
    2.   <div class="child">Demo</div>
    3. </div>
    4. <style>
    5. .parent {
    6. text-align: center;
    7. display: table-cell;
    8. vertical-align: middle;
    9. }
    10. .child {
    11. display: inline-block;
    12. }
    13. </style>
    复制代码
    [/code]
       3.flex + justify-content + align-items
      
    1. [code]<div class="parent">
    2.   <div class="child">Demo</div>
    3. </div>
    4. <style>
    5. .parent {
    6. display: flex;
    7. justify-content: center; /* 水平居中 */
    8. align-items: center; /*垂直居中*/
    9. }
    10. </style>
    复制代码
    [/code]
       更多布局示例请移步CSS常见布局解决方案 垂直居中,水平居中,各种布局
       7. 渐进增强 VS 优雅降级,你怎么看?
       渐进增强(Progressive Enhancement):一开始就针对低版本浏览器进行构建页面,完成基本的功能,然后再针对高级浏览器进行效果、交互、追加功能达到更好的体验
       优雅降级(Graceful Degradation):一开始就构建站点的完整功能,然后针对浏览器测试和修复。比如一开始使用 CSS3 的特性构建了一个应用,然后逐步针对各大浏览器进行 hack 使其可以在低版本浏览器上正常浏览
       二者如何抉择: 这是个人观点。。。
       8. javaScript 的数据类型
       javascript有六种基本数据类型:
    1. Undefined
    复制代码
    ,
    1. Null
    复制代码
    ,
    1. Boolean
    复制代码
    ,
    1. Symbol
    复制代码
    (es6),
    1. Number
    复制代码
    和
    1. String
    复制代码
    还有一种复杂数据类型:对象
       9. JavaScript 数组去重?(简述思路即可)
       
        遍历数组法: 这应该是最简单的去重方法(实现思路:新建一新数组,遍历数组,值不在新数组就加入该新数组中)
    1. [code]// 遍历数组去重法
    2. function unique(arr){
    3.   var _arr = []
    4.   //遍历当前数组
    5.   for(var i = 0; i < arr.length; i++){
    6.     //如果当前数组的第i已经保存进了临时数组,那么跳过,
    7.     //否则把当前项push到临时数组里面
    8.     if (_arr.indexOf(arr[i]) == -1) _arr.push(arr[i])
    9.   }
    10.   return _arr
    11. }
    复制代码
    [/code]注意点:indexOf 为 ES5 的方法,注意浏览器兼容,需要自己实现 indexOf
        对象键值对(hash) 法:速度快,高效,占用更大的内存换取更快的时间,用 JavaScript 中的 Object 对象来当做哈希表,hash去重的核心是构建了一个 hash 对象来替代 indexOf
    1. [code]// hash 去重法
    2. function unique(arr){
    3.     var _arr = [],
    4.         hash = {}
    5.     for (var i = 0; i < arr.length; i++) {
    6.         var item = arr[i]
    7.         var key = typeof(item) + item
    8.           // 对象的键值只能是字符串, typeof(item) + item来去分1和"1"的情况
    9.         if(hash[key] !== 1){
    10.             _arr.push(item)
    11.             hash[key] = 1
    12.         }
    13.     }
    14.     return _arr
    15. }
    复制代码
    [/code]
       
       
        炫酷的 es6 Set数据结构: ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值
    1. [code]function unique(arr){
    2.     return Array.from(new Set(arr))
    3.     // Array.from方法用于将两类对象转为真正的数组:
    4.     // 类似数组的对象(array-like object)和可遍历(iterable)的对象
    5. }
    复制代码
    [/code]
       
       关于 JavaScript 数组去重,还有很多很多可以讲,篇幅有限,这里介绍了几种常规的,更多的自己去探索
       10. 看如下 JavaScript 代码,给出代码运行结果?(并简述原因)
      
    1. [code]var a = 2
    2. function foo() {
    3.   console.log(a) // 1.???
    4.   console.log(bar())  // 2.???
    5.   var a = 1
    6.   function bar(){
    7.       return a
    8.   }
    9.   console.log(bar())  // 3.???
    10. }
    11. foo()
    12. console.log(a) // 4. ???
    复制代码
    [/code]
       代码运行结果: 1: undefined,2: undefined,3: 1,4: 2
       这里考察了 JavaScript 的作用域和变量提升。
       在 JavaScript 中,函数、变量的声明都会被提升(hoisting)到该函数或变量所在的 scope 的顶部
       JavaScript 采用词法作用域(lexical scoping),也就是静态作用域,函数作用域在函数定义时就决定了 ,同时在es6 前 JavaScript是没有块级区域(block-level scope),而只有函数域 (function-level scope)。(在es6前我们可过闭包来实现类似块级作用域的效果)所谓函数作用域就是:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的
      
    1. [code]var a = 2
    2. function foo() {
    3.   // var a --> 变量提升
    4.   console.log(a) // 1.???
    5.   // 虽然在函数作用域里,这个 a 还未声明,
    6.   // 实际上由于变量提升此刻的在函数头部已经定义了 a 只是尚未赋值
    7.   // 所以1处的值是undefined
    8.   console.log(bar())  // 2.???
    9.   // 理解了第一个第二个也不难了
    10.   // 结果也为 undefined
    11.   var a = 1
    12.   function bar(){
    13.       return a
    14.   }
    15.   console.log(bar())  // 3.???
    16.   // 此刻a已经被赋值1
    17.   // 结果为 1
    18. }
    19. foo()
    20. console.log(a) // 4. ???
    21. // 函数作用域不会对全局作用域产生影响,
    22. // 结果为2
    复制代码
    [/code]
       11. 使用原生
    1. ajax
    复制代码
    获取 Linus Torvalds 的GitHub信息(API:api.github.com/users/torva…),并将JSON字符串解析为JSON对象,并讲讲对JSON的了解
       这是对 ajax与json的考察
       ajax的全称:Asynchronous Javascript And XML,异步传输+js+xml 现在差不多都用JSON
       
        创建XMLHttpRequest对象,也就是创建一个异步调用对象
        创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息
        设置响应HTTP请求状态变化的函数
        发送HTTP请求
        获取异步调用返回的数据
        数据处理
       
       下面就来贴代码吧:
      
    1. [code]var api = "https://api.github.com/users/torvalds"
    2. var xhr = new XMLHttpRequest() // 创建XMLHttpRequest对象
    3. if(window.XMLHttpRequest){ // 兼容处理
    4.     xhr = new XMLHttpRequest()
    5. }else{
    6.     xhr = new ActiveXObject("Microsoft.XMLHTTP")// 兼容ie6以下下
    7. }
    8. xhr.open("get",api,true)    //设置请求信息
    9. xhr.send()  //提交请求
    10. //等待服务器返回内容
    11. xhr.onreadystatechange = function() {
    12.     if ( xhr.readyState == 4 && xhr.status == 200 ) {
    13.          console.log(JSON.parse(xhr.responseText)) // 使用JSON.parse解析JSON字符串
    14.     }
    15. }
    复制代码
    [/code]
       上面这端代码应该就是最简单的一个完整的AJax,当然了,你可以对它进行各种封装,甚至结合promise,async/await。。。鸟枪换炮
       JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它是基于JavaScript的一个子集。数据格式简单, 易于读写, 占用带宽小 如:{"age":"12", "name":"back"}
      
    1. JSON.parse()
    复制代码
    方法解析一个JSON字符串
      
    1. JSON.stringify()
    复制代码
    方法将一个JavaScript值转换为一个JSON字符串
      
    1. eval
    复制代码
    也能解析JSON字符串,但不推荐
       关于JSON就不多说了,前面写过一篇 JSON入门
       12. 简单谈谈前端性能优化
       
        减少http请求次数:CSS Sprites, JS、CSS源码压缩、图片大小控制合适;网页Gzip,CDN托管,data缓存 ,图片服务器。
        减少DOM操作次数,优化javascript性能。
        少用全局变量、缓存DOM节点查找的结果。减少IO读取操作。
        尽量避免使用CSS Expression(css表达式)又称Dynamic properties(动态属性)。
        图片预加载,将样式表放在顶部,将脚本放在底部。
        ……太多了,一页纸都写不完
       
      
      
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2026-10-16 04:55 , Processed in 0.664773 second(s), 54 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表