Web大前端面试题-Day1
1. var的变量提升的底层原理是什么?
JS引擎的工作方式是:
1) 先解析代码,获取所有被声明的变量;
2)然后在运行。
也就是说分为预处理和执行两个阶段。
变量提升:
所有变量的声明语句都会被提升到代码头部。
但是变量提升只对var命令声明的变量有效,
如果一个变量不是用var命令声明的,
就不会发生变量提升。
js里的function也可看做变量,
也存在变量提升情况。
2. JS如何计算浏览器的渲染时间?
浏览器的渲染过程主要包括以下几步:
1) 解析HTML生成DOM树。
2) 解析CSS生成CSSOM规则树。
3) 将DOM树与CSSOM规则树合并在一起生成渲染树。
4) 遍历渲染树开始布局,
计算每个节点的位置大小信息。
5) 将渲染树每个节点绘制到屏幕。
优化考虑:
CSS 优先:
引入顺序上,CSS 资源先于 JavaScript 资源。
JS置后:
通常把JS代码放到页面底部,
且JavaScript 应尽量少影响 DOM 的构建。
3. JS的回收机制?
垃圾回收机制是为了以防内存泄漏,
(内存泄漏: 当已经不需要某块内存时这块内存还存在着),
垃圾回收机制就是间歇的不定期的
寻找到不再使用的变量,
并释放掉它们所指向的内存。
JS有两种变量:
全局变量和在函数中产生的局部变量。
局部变量的生命周期在函数执行过后就结束了,
此时便可将它引用的内存释放(即垃圾回收),
但全局变量生命周期会持续到浏览器关闭页面。
JS执行环境中的垃圾回收器有两种方式:
标记清除(mark and sweep)
、引用计数(reference counting)。
标记清除:
垃圾收集器给内存中的所有变量都加上标记,
然后去掉环境中的变量以及被环境中的变量引用的变量的标记。
在此之后再被加上的标记的变量即为需要回收的变量,
因为环境中的变量已经无法访问到这些变量。
引用计数(reference counting):
这种方式常常会引起内存泄漏,
低版本的IE使用这种方式。
机制就是跟踪一个值的引用次数,
当声明一个变量
并将一个引用类型赋值给该变量时该值引用次数加1,
当这个变量指向其他一个时该值的引用次数便减一。
当该值引用次数为0时就会被回收。
4. 垂直水平居中的方式?
方式一: 定位
父元素设置为:position: relative;
子元素设置为:position: absolute;
距上50%,据左50%,
然后减去元素自身宽度的距离就可以实现
width: 100px;
height: 100px;
position: absolute;
left: 50%;
top: 50%;
margin: -50px 0 0 -50px;
方式二: flex布局
display: flex;
//flex布局
justify-content: center;
//使子项目水平居中
align-items: center;
//使子项目垂直居中
方式三: table-cell (不推荐)
display: table-cell;
vertical-align: middle;
//使子元素垂直居中
text-align: center;
//使子元素水平居中
5. 实现一个三栏布局,中间版块自适应方法有哪些?
浮动和定位
浮动方式:
<div class="content">
<div class="left">left</div>
<div class="right">right</div>
<div class="center">center</div></div>
.left{ float: left;
width: 100px;
height: 200px;
}
.right{
float: right;
padding: 0;
width: 100px;
height: 200px;
}
.center{
margin: 0 100px 0 200px;
}
方式二:
将父容器的position设置为relative,
两个边栏的position设置成absolute。
6. 如何判断一个对象是否为数组?
撩课小编:
1) isPrototypeOf()方法,
判定Array是不是在obj的原型链中,
如果是,
则返回true,否则false;
2) obj instanceof Array;
3) Object.prototype.toString.call(obj);
4) Array.isArray(obj); // 不推荐
7. 行内元素和块级元素有哪些? img属于什么元素?
块元素(block element)
* address - 地址
* blockquote - 块引用
* center - 举中对齐块
* dir - 目录列表
* div - 常用块级容易,也是css layout的主要标签
* dl - 定义列表
* fieldset - form控制组
* form - 交互表单
* h1 - 大标题
* h2 - 副标题
* h3 - 3级标题
* h4 - 4级标题
* h5 - 5级标题
* h6 - 6级标题
* hr - 水平分隔线
* isindex - input prompt
* menu - 菜单列表
* noframes - frames可选内容,
(对于不支持frame的浏览器显示此区块内容
* noscript - 可选脚本内容
(对于不支持script的浏览器显示此内容)
* ol - 排序表单
* p - 段落
* pre - 格式化文本
* table - 表格
* ul - 非排序列表
内联元素(inline element)
* a - 锚点
* abbr - 缩写
* acronym - 首字
* b - 粗体(不推荐)
* bdo - bidi override
* big - 大字体
* br - 换行
* cite - 引用
* code - 计算机代码(在引用源码的时候需要)
* dfn - 定义字段
* em - 强调
* font - 字体设定(不推荐)
* i - 斜体
* img - 图片
* input - 输入框
* kbd - 定义键盘文本
* label - 表格标签
* q - 短引用
* s - 中划线(不推荐)
* samp - 定义范例计算机代码
* select - 项目选择
* small - 小字体文本
* span - 常用内联容器,定义文本内区块
* strike - 中划线
* strong - 粗体强调
* sub - 下标
* sup - 上标
* textarea - 多行文本输入框
* tt - 电传文本
* u - 下划线
* var - 定义变量
可变元素
可变元素为根据上下文语境
决定该元素为块元素或者内联元素。
* applet - java applet
* button - 按钮
* del - 删除文本
* iframe - inline frame
* ins - 插入的文本
* map - 图片区块(map)
* object - object对象
* script - 客户端脚本
8. margin坍塌?
撩课小编: 当两个盒子在垂直方向上设置margin值时,会出现塌陷现象。
解决方案:
给父盒子添加border
2.给父盒子添加padding-top
3.给父盒子添加overflow:hidden
4.父盒子:position:fixed
5.父盒子:display:table
6.给子元素的前面添加一个兄弟元素
属性为:content:""; overflow:hidden;
9. 说说BFC原理?
撩课小编:
BFC就是页面上的一个隔离的独立容器,
容器里面的子元素不会影响到外面的元素。
因为BFC内部的元素和外部的元素绝对不会互相影响,因此,
当BFC外部存在浮动时,
它不会影响BFC内部Box的布局,
BFC会通过变窄,
而不与浮动有重叠。
同样的,当BFC内部有浮动时,为了不影响外部元素的布局,
BFC计算高度时会包括浮动的高度。
避免margin重叠也是这样的一个道理。
10. 写一下节点增删改?
// 注意:动态创建元素不会直接显示在页面当中,
// 前面必须是document,不能是其他
(1)document.createElement(标签名);
// 在指定父级子节点最后一个后面追加子元素
(2)父级.appendChild(要追加的元素) ;
// 在父级的指定子元素前面插入一个新元素
//(注意:先判断如果第二个参数的节点是否存在)
(3)父级.insertBefore(新的元素,指定的已有子元素);
// 深克隆
//(负值标签、标签属性、标签里面内容 浅克隆
//(负值标签、标签属性不复制标签里面内容)
(4)元素.cloneNode(true) 或者元素.cloneNode(false)
(5)父级.removeChild(已有子元素);
(6)父级.replaceChild(新的元素节点,原有元素节点);
11. 如何获取元素的父节点和兄弟节点,写一下?
获取父节点:
// 1. parentNode获取父节点
// 获取的是当前元素的直接父元素。
var p = document.getElementById("test").parentNode;
// 2. parentElement获取父节点
// parentElement和parentNode一样,
//只是parentElement是ie的标准。
var p1 =
document.getElementById("test").parentElement;
// 3. offsetParent获取所有父节点
var p2 =
document.getElementById("test").offsetParent;
获取兄弟节点:
// 1. 通过获取父亲节点再获取子节点来获取兄弟节点
var brother1 =
document.getElementById("test").parentNode.children[1];
// 2.获取上一个兄弟节点
//在获取前一个兄弟节点的时候
//可以使用previousSibling和previousElementSibling。
//他们的区别是previousSibling会匹配字符,
//包括换行和空格,而不是节点。
//previousElementSibling则直接匹配节点。
var brother2 =
document.getElementById("test").previousElementSibling;
var brother3 =
document.getElementById("test").previousSibling;
// 3. 获取下一个兄弟节点
var brother4 =
document.getElementById("test").nextElementSibling;
var brother5 =
document.getElementById("test").nextSibling;
12. 给你一个乱序数组,你怎么排序?
sort, 冒泡, 选择, 二分法....
Web大前端面试题-Day1的更多相关文章
- Web大前端面试题-Day12
1.前端需要注意哪些SEO? 合理的title.description.keywords: 搜索对着三项的权重逐个减小, title值强调重点即可, 重要关键词出现不要超过2次, 而且要靠前, 不同页 ...
- Web大前端面试题-Day7
1. 你能描述一下渐进增强和优雅降级之间的不同吗? 定义: 优雅降级(graceful degradation): 一开始就构建站点的完整功能, 然后针对浏览器测试和修复 渐进增强(progressi ...
- Web大前端面试题-Day6
1.请说明ECMAScript, JavaScript, Jscript之间的关系? ECMAScript提供脚本语言必须遵守的规则. 细节和准则,是脚本语言的规范. 比如:ES5,ES6就是具体的一 ...
- Web大前端面试题-Day4
1. 如何实现瀑布流? 瀑布流布局的原理:1) 瀑布流布局要求要进行布置的元素等宽, 然后计算元素的宽度, 与浏览器宽度之比,得到需要布置的列数;2) 创建一个数组,长度为列数, 里面的值 ...
- Web大前端面试题-Day11
86.如何获得高效的数据库逻辑结构? 从关系数据库的表中 删除冗余信息的过程 称为数据规范化, 是得到高效的关系型数据库表的逻辑结构 最好和最容易的方法. 规范化数据时应执行以下操作: 1.将数据库的 ...
- Web大前端面试题-Day10
1. px和em的区别? px和em都是长度单位; 区别是: px的值是固定的,指定是多少就是多少, 计算比较容易. em得值不是固定的,并且em会继承父级元素的字体大小. 浏览器的默认字体高都是16 ...
- Web大前端面试题-Day8
1. 说说你对作用域链的理解? 作用域链的作用是保证执行环境里 有权访问的变量和函数是有序的, 作用域链的变量只能向上访问, 变量访问到window对象即被终止, 作用域链向下访问变量是不被允许的; ...
- Web大前端面试题-Day9
1. 请用至少3中方式实现数组去重? 方法一: indexOfvar arr1=[1,2,3,4,5,4,3,2,1]; function repeat1(arr){ for(var i=0, ...
- Web大前端面试题-Day5
1.写一个深度克隆方法(es5)? /** * 深拷贝 * @param {object}fromObj 拷贝的对象 * @param {object}toObj 目标对象 */ function ...
随机推荐
- Kubernetes Service
目录 基本概念 服务发现与负载均衡 配置Service 创建一个ClusterIP类型的Service 创建一个指定ClusterIP的Service 创建一个headless service 创建一 ...
- vim编辑器基本操作介绍
vim编辑器基本操作介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 可能很多小伙伴都听说过vi编辑器或是vim编辑器.它们是Unix和Linux世界最流行的编辑器之一,他们的特 ...
- Kafka 0.8 副本同步机制理解
Kafka的普及在很大程度上归功于它的设计和操作简单,如何自动调优Kafka副本的工作,挑战之一:如何避免follower进入和退出同步副本列表(即ISR).如果某些topic的部分partition ...
- SQL记录-PLSQL循环
PL/SQL循环 可能有一种情况,当需要执行的代码块的几个多次.在一般情况下,语句顺序执行:一个函数的第一条语句,首先执行,然后是第二个...等等. 编程语言提供了各种控制结构,允许更多复杂的执行 ...
- JavaScript继承详解(一)
面向对象与基于对象 几乎每个开发人员都有面向对象语言(比如C++.C#.Java)的开发经验. 在传统面向对象的语言中,有两个非常重要的概念 - 类和实例. 类定义了一类事物公共的行为和方法:而实例则 ...
- Request.Cookies 和 Response.Cookies 的区别
.NET中提供了读写Cookie的多种方法,Request.Cookies 是客户端通过 Cookie 标头形式由客户端传输到服务器的 Cookie:Response.Cookies 在服务器上创建并 ...
- Asp.net操作Word文档,原来这么简单啊!
引用Word对象库文件 具体做法是打开菜单栏中的项目>添加引用>浏览,在打开的“选择组件”对话框中找到MSWORD.OLB后按确定即可引入此对象库文件,vs.net将会自动将库文件转化为 ...
- ZYNQ. Interrupt(1)Private Timer
Interrupt zynq的中断. The PS is based on ARM architecture, utilizing two Cortex-A9 processors(CPUs) and ...
- Django进阶之session
基于cookie做用户验证时:敏感信息不适合放在cookie中 session依赖cookie session原理 cookie是保存在用户浏览器端的键值对 session是保存在服务器端的键值对 s ...
- WIN10文件无法自动刷新问题解决方法
Window10系统有时候会遇到以下类似的问题 1.文件删除后,图标还在,无法自动刷新屏幕,按F5或右键菜单刷新后才消失 2.文件粘贴后,不显示,刷新后才显示 3.回收站清理后,文件图标仍显示有垃圾 ...