-
前言
- 0. 前端工具
- 1. html
- 2. CSS
-
3. JavaScript 基础
-
3.1 JS简介
-
3.2 变量
-
3.3 变量的强制类型转换
-
3.4 运算符
-
3.5 流程控制语句:选择结构(if和switch)
-
3.6 流程控制语句:循环结构(for和while)
-
3.7 对象简介和对象的基本操作
-
3.8 基本数据类型vs引用数据类型
-
3.9 函数
-
3.10 作用域
-
3.11 this
-
3.12 对象的创建&构造函数
-
3.13 原型对象
-
3.14 数组简介
-
3.15 数组的四个基本方法&数组的遍历
-
3.16 数组的常见方法
-
3.17 数组的其他方法
-
3.18 内置对象:Date
-
3.19 内置对象(其他)
-
3.20 DOM操作
-
3.21 事件对象Event和冒泡
-
3.22 事件委托
-
3.23 BOM的常见内置方法和内置对象
-
3.24 原型链
-
3.25 常见代码解读
-
3.1 JS简介
- 4. JavaScript进阶
- 5. 前端基本功:CSS、DOM练习和 Javascript 特效
- 6. jQuery
- 7. HTML5和CSS3
- 8. 移动web开发
- 9. Ajax
- 10. Node.js和模块化
- 11. ES6
- 12. Vue基础
- 13. React基础
-
14. 前端面试
-
14.1 准备
-
14.2 页面布局
-
14.3 CSS盒模型及BFC
-
14.4 DOM事件的总结
-
14.5 HTTP协议
-
14.6 创建对象和原型链
-
14.7 面向对象:类的定义和继承的几种方式
-
14.8 跨域通信类
-
14.9 安全问题:CSRF和XSS
-
14.10 算法问题
-
14.11 浏览器渲染机制
-
14.12 js运行机制:异步和单线程
-
14.13 页面性能优化
-
14.14 前端错误监控
-
14.15 JavaScript高级面试:前言
-
14.16 模块化的使用和编译环境
-
14.17 ES6
-
14.18 虚拟DOM
-
14.19 MVVM
-
14.20 面试题整理
-
14.21 网友面经
-
14.22 面试技巧
-
14.23 推荐文章
-
14.24 计算机网络
-
14.25 web安全
-
14.26 其他
-
14.1 准备
- 15. 面试题积累
- 16. 前端进阶
- 17. 前端综合
- 18. 推荐链接
几道面试题
页面布局
如何实现一个三栏布局,要求两边固定宽度、中间自适应。
此题可以考察的知识点:
圣杯布局
双飞翼布局
flex布局(css3)
让元素垂直居中
方式一:如果宽高已知,可以利用绝对定位。
方式二:用 translate 位移来做。(在宽高未知的情况下,也可以这样做)
div {
background-color: red;
position: absolute; 绝对定位的盒子
top: 50%; 首先,让上边线居中
transform: translateY(-50%); 然后,利用translate,往上走自己宽度的一半【推荐写法】
}
copy
方式三:flex 布局
parentElement{
display: flex;/*Flex布局*/
display: -webkit-flex; /* Safari */
align-items: center;/*设置子元素在侧轴方向上的布局*/
}
copy
参考链接:
变量提升
问题:说一下你对JavaScript变量提升的理解。
定义:
在函数体内部,声明变量,会把该变量提升到函数体的最顶端。注意:只提升变量声明,不赋值。
代码1:
fn();
function fn() {
var x = 1;
var y = 2;
}
copy
上方代码中:
(1)给fn创建函数上下文,找到fn中所有用var声明的变量(即x和y);
(2)将这些变量初始化为undefined;
(3)将x赋值为1,将y赋值为2。
代码2:
fn2();
function fn2() {
console.log(2);
}
copy
上方代码中:
(1)创建全局上下文,找到所有用function声明的变量,在环境中“创建”这些变量。
(2)将这些变量初始化,并赋值为 function(){ console.log(2) }
(并不是undefined)
(3)开始执行代码fn2();
代码3:(let的出现)
{
let x = 1
x = 2
}
copy
上方代码中:
(1)找到所有用 let 声明的变量,在环境中「创建」这些变量
(2)开始执行代码(注意现在还没有初始化)
(3)执行 x = 1,将 x 「初始化」为 1(这并不是一次赋值,如果代码是 let x,就将 x 初始化为 undefined)
(4)执行 x = 2,对 x 进行「赋值」
代码4:
let x = 'global'
{
console.log(x) // Uncaught ReferenceError: x is not defined
let x = 1
}
copy
原因有两个:
console.log(x) 中的 x 指的是下面的 x,而不是全局的 x
执行 log 时 x 还没「初始化」,所以不能使用(也就是所谓的暂时死区)
看到这里,你应该明白了 let 到底有没有提升:
let 的「创建」过程被提升了,但是初始化没有提升。
var 的「创建」和「初始化」都被提升了。
function 的「创建」「初始化」和「赋值」都被提升了。
参考链接:
this
问题:下方代码的打印结果是什么?
function A() {
this.name = 'smyhvae';
}
A.prototype.test = function () {
setTimeout(function () {
console.log(this.name);
}, 1)
}
var a = new A();
a.test();
copy
打印结果是window.name,但实际的结果是空的。
这个神奇的特性,被用来解决跨域数据传递。(网上可以查一下iframe相关)
总结1:this永远指向函数运行时所在的对象,而不是函数被创建时所在的对象。即:谁调用,指向谁。
举例:
var name = '全局';
function getName() {
var name = '局部';
return this.name;
};
alert(getName());
copy
上方代码的打印结果是:全局
。
分析:getName()
这个函数其实是window调用的,所以this指向的window,因为外部有name这个变量,所以打印结果为全局
。
总结2:没有明确的当前对象时,this永远指向window。这个在setTimeout里比较常见。
apply、call、bind的区别
链式调用
问题:如何实现类似jQuery的链式调用?
答案:一直return this
就好了。
Yslow和pageSpeed
Yslow和pageSpeed你知道怎么用吗?你记得其中多少规则?
DNS的查询时间
问题:前端怎样拿到DNS的查询时间?
H5中的方法:performance.timing
window.performance这个api可以用来做前端性能监控。其中,timing这个方法。。
参考链接: