简介
后面会不断吧内容完善的,实在太多了!呜呜
文档目录
Html 部分
CSS 部分
JavaScript 部分
- js的基本类型有哪些,引用类型有哪些,null和undefined的区别
- 防抖和节流
- js有哪些内置对象
- Object是引用类型嘛,引用类型和基本类型有什么区别,哪个是存在堆哪一个是存在栈上面的
- 如何判断一个变量是Array类型,如何判断一个变量是Number类型
- this有哪些使用场景,跟C,Java中的this有什么区别,如何改变this的值
- call,apply,bind
- 浅拷贝和深拷贝
ES6 部分
计算机网络 部分
浏览器相关 部分
工程化 部分
模块化 部分
框架 部分
数据结构 部分
性能优化 部分
一、Html
HTML5 新特性,语义化
什么是语义化?
Web语义化是指使用恰当语义的html标签、class类名等内容,让页面具有良好的结构与含义,从而让人和机器都能快速理解网页内容。简单说就是,用合理、正确的标签来展示内容,比如h1~h6定义标题。
语义化优点?
- 正确的标签做正确的事情
- 易于用户阅读,样式丢失的时候能让页面呈现清晰的结构。
- 页面内容结构化
- 便于浏览器、搜索引擎解析。 利于爬虫标记、利于SEO,搜索引擎根据标签来确定上下文和各个关键字的权重。
- 方便其他设备解析,如盲人阅读器根据语义渲染网页。
- 有利于开发和维护,语义化更具可读性,代码更好维护。
- 与CSS3关系更和谐。
参考
行内元素和块级元素,及区别
行内元素:inline element
span i b em strong small
- 行内元素不会独占一行,相邻的行内元素会排在同一行。其宽度随内容的变化而变化。
- 行内元素不可以设置宽高
- 行内元素水平方向的margin-left; margin-right; padding-left; padding-right;可以生效。但是竖直方向的margin-bottom; margin-top; padding-top; padding-bottom;却不能生效。
- display:inline; 可以通过修改display属性来切换块级元素和行内元素
块级元素:block element
div p h1-h6 table hr ol ul
- 块级元素会独占一行,默认情况下宽度自动填满其父元素宽度
- 块级元素可以设置宽高
- 块级元素可以设置margin,padding
- display:block; 可以通过修改display属性来切换块级元素和行内元素
行内块元素:inline-block
img input td
(1)不自动换行
(2)能够识别宽高
(3)默认排列方式为从左到右
浏览器的标准模式和怪异模式
现代的浏览器一般都有两种渲染模式:标准模式
和怪异模式
。在标准模式
下,浏览器按照HTML与CSS标准对文档进行解析和渲染;而在怪异模式下,浏览器则按照旧有的非标准的实现方式对文档进行解析和渲染。这样的话,对于旧有的网页,浏览器启动怪异模式
,就能够使得旧网页正常显示;对于新的网页,则可以启动标准模式
,使得新网页能够使用HTML与CSS的标准特性。
DOCTYPE
是”document type”的缩写。它是 HTML 中用来区分标准模式和怪异模式的声明,用来告知浏览器使用标准模式渲染页面。
从中获得的启发:在页面开始处添加<!DOCTYPE html>即可。
参考
xhtml 和 html 的区别
使用 data-的好处
meta 标签
canvas
HTML 废弃的标签
css js 放置位置和原因
什么是渐进式渲染
html 模板语言
meta viewport 原理
二、CSS
盒模型,box-sizing
CSS3 新特性,伪类,伪元素,锚伪类
CSS 实现隐藏页面的方式
如何实现水平 居中和垂直居中
水平居中
垂直居中
1 | /* 1.flex */ |
1 | /* 2.margin: auto */ |
1 | /* 3.transform */ |
1 | /* 4.宽高的一半 */ |
1 | /* 5.伪类 */ |
说说 position,display
请解释*{box-sizing:border-box;}的作用,并说明使用它的好处
浮动元素引起的问题和解决办法?绝对定位和相对定位,元素浮动后的 display 值
link 和@import 引入 css 的区别
解释一下 css3 的 flexbox,以及适用场景
inline 和 inline-block 的区别
哪些是块级元素那些是行级元素,各有什么特点
grid 布局
table 布局的作用
实现两栏布局有哪些方法?
css dpi
你知道 attribute 和 property 的区别么
css 布局问题?css 实现三列布局怎么做?如果中间是自适应又怎么做?
流式布局如何实现,响应式布局如何实现
移动端布局方案
实现三栏布局(圣杯布局,双飞翼布局,flex 布局)
清除浮动的原理
为什么要清除浮动,父元素高度塌陷 解决父元素高度塌陷问题:一个块级元素如果没有设置height,其height是由子元素撑开的。对子元素使用了浮动之后,子元素会脱离标准文档流,也就是说,父级元素中没有内容可以撑开其高度,这样父级元素的height就会被忽略,这就是所谓的高度塌陷。
1 | /* 经益求精写法 */ |
参考
overflow:hidden 有什么缺点?
padding 百分比是相对于父级宽度还是自身的宽度
css3 动画,transition 和 animation 的区别,animation 的属性,加速度,重力的模拟实现
CSS 3 如何实现旋转图片(transform: rotate)
sass less
对移动端开发了解多少?(响应式设计、Zepto;@media、viewport、 JavaScript 正则表达式判断平台。)
什么是 bfc,如何创建 bfc?解决什么问题?
CSS 中的长度单位(px,pt,rem,em,ex,vw,vh,vh,vmin,vmax)
CSS 选择器的优先级是怎样的?
雪碧图
svg
媒体查询的原理是什么?
CSS 的加载是异步的吗?表现在什么地方?
常遇到的浏览器兼容性问题有哪些?常用的 hack 的技巧
外边距合并
解释一下before和after中的双冒号和单冒号的区别
层叠样式表(CSS)的主要目的是给HTML元素添加样式,然而,在一些案例中给文档添加额外的元素是多余的或是不可能的。事实上CSS中有一个特性允许我们添加额外元素而不扰乱文档本身,这就是”伪元素”。
- CSS 伪类用于向某些选择器添加特殊的效果。(:hover :active)
- CSS 伪元素用于将特殊的效果添加到某些选择器。 (::after,::before)
伪类和伪元素的根本区别在于:它们是否创造了新的元素(抽象)。从我们模仿其意义的角度来看,如果需要添加新元素加以标识的,就是伪元素,反之,如果只需要在既有元素上添加类别的,就是伪类。
伪元素和伪类之所以这么容易混淆,是因为他们的效果类似而且写法相仿,但实际上 css3 为了区分两者,已经明确规定了伪类用一个冒号来表示,而伪元素则用两个冒号来表示。
- 单引号是伪类,逻辑上可以视为filter
- 双引号是伪元素,逻辑上可以视为child
1 | :Pseudo-classes |
但因为兼容性的问题,所以现在大部分还是统一的单冒号,但是抛开兼容性的问题,我们在书写时应该尽可能养成好习惯,区分两者。
参考
三、JavaScript
js的基本类型有哪些,引用类型有哪些,null和undefined的区别
基本类型有:undefined , null , boolean , srting , number
引用类型有:object , array , function , date , error
null是一个表示”无”的对象,转为数值时为0;undefined是一个表示”无”的原始值,转为数值时为NaN。 null表示”没有对象”,即该处不应该有值。undefined表示”缺少值”,就是此处应该有一个值,但是还没有定义。
1 | typeof NaN = 'number' |
js中的NaN如何产生的?
怎么区分内存的堆区与栈区。
参考
数据结构中的堆和栈是两种不同的、数据项按序排列的数据结构。
基本类型变量:在内存中分别占有固定大小的空间,他们的值保存在栈空间,通过按值访问、拷贝和比较。(变量的拷贝过程就是拷贝了内存中的一个副本???)
引用类型变量:栈内存中存放的只是该对象的访问地址,在堆内存中为该值分配空间,由于这种值的大小不固定,因此不能把他们保存到栈内存中;但内存地址大小是固定的,因此可以将堆内存地址保存到栈内存中。这样,当查询引用类型的变量时,就先从栈中读取堆内存地址,然后再根据该地址取出对应的值。
很显而易见的一点就是,JavaScript 中所有引用类型创建实例时,都是显式或隐式地 new 出对应类型的实例,实际上就是对应 C 语言的 malloc 分配内存函数。
js 中变量的赋值分为「传值」与「传址」。
js有哪些内置对象
内置对象就是指javascript这个语言自带的一些对象
Array数组对象 , string字符串 , Math对象 , Date日期对象
1 | //数组对象 |
1 | //字符串 |
1 | //Math |
Object是引用类型嘛,引用类型和基本类型有什么区别,哪个是存在堆哪一个是存在栈上面的
基本类型
- 基本类型的值是不可变得
- 基本类型的比较是值的比较
- 基本类型的变量是存放在栈内存中的
- 在从一个变量向另一个变量赋值基本类型时,会在该变量上创建一个新值,然后再把该值复制到为新变量分配的位置上:
引用类型
- 引用类型的值是可变的
- 引用类型的值是同时保存在栈内存和堆内存中的对象
- 引用类型的比较是引用的比较
- 两个变量都保存了同一个对象地址,则这两个变量指向了同一个对象
1 | var person1 = '{}'; |
参考
如何判断一个变量是Array类型,如何判断一个变量是Number类型
typeof 检查基本类型ok,引用类型GG
1 | //判断是Array类型 |
后2种较为准确
1 | //判断是Number类型 |
1 | // isNaN |
防抖和节流
函数节流是指一定时间内js方法只跑一次。比如人的眨眼睛,就是一定时间内眨一次。这是函数节流最形象的解释。
函数防抖是指频繁触发的情况下,只有足够的空闲时间,才执行代码一次。比如生活中的坐公交,就是一定时间内,如果有人陆续刷卡上车,司机就不会开车。只有别人没刷卡了,司机才开车。
JS 常见的 dom 操作 api
解释一下事件冒泡和事件捕获
事件委托(手写例子),事件冒泡和捕获,如何阻止冒泡?如何组织默认事 件?
对闭包的理解?什么时候构成闭包?闭包的实现方法?闭包的优缺点?
先看一个列子
1 | let add=(function(){ |
now 这个变量,并没有随着函数的执行完毕而被回收,而是继续保存在内存里面。
由于 add 里面有函数是依赖于 now 这个变量。所以 now不会被销毁,回收。这就是闭包的用途之一(延续变量周期)。由于 now 在外面访问不到,这就是闭包的另一个用途(创建局部变量,保护局部变量不会被访问和修改)。
《JavaScript权威指南》中的概念
函数对象可以通过作用域链互相关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性在计算机科学中成为闭包
《JavaScript权威指南》中的概念
闭包是指有权访问另一个函数作用域中的变量的函数。
《JavaScript忍者秘籍》中的概念
闭包是一个函数在创建时允许该自身函数访问并操作该自身函数以外的变量时所创建的作用域。
《你不知道的JavaScript》中的概念
闭包是基于词法作用域书写代码时所产生的自然结果。当函数记住并访问所在的词法作用域,闭包就产生了。
闭包就是一个函数,一个可以访问并操作其他函数内部变量的函数。也可以说是一个定义在函数内部的函数。因为JavaScript没有动态作用域,而闭包的本质是静态作用域(静态作用域规则查找一个变量声明时依赖的是源程序中块之间的静态关系),所以函数访问的都是我们定义时候的作用域,也就是词法作用域。所以闭包才会得以实现。
我们常见的闭包形式就是a 函数套 b 函数,然后 a 函数返回 b 函数,这样 b 函数在 a 函数以外的地方执行时,依然能访问 a 函数的作用域。其中”b 函数在 a 函数以外的地方执行时”这一点,才体现了闭包的真正的强大之处。
参考
this有哪些使用场景,跟C,Java中的this有什么区别,如何改变this的值
JavaScript中的js
this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,记住关键的一句话:
哪个对象调用函数,函数里面的this指向哪个对象
1 | //this指向全局对象 |
1 | // this指向o对象(o对象调用了函数) |
1 | //this指向o.b对象 |
1 | //作为构造函数调用 |
作为构造函数调用,可行了解下js中的new()一个对象具体做了什么一个对象具体做了什么)
1 | // apply和call调用 |
此时虽然是 obj2 调用方法,但是使用 了call,动态的把 this 指向到 obj1。相当于这个 obj2.fn 这个执行环境是 obj1 。
this 有哪些使用场景
- 作为对象方法调用(参考上面)
- 作为函数调用
- 作为构造函数调用
- 使用 apply 或 call 调用
参考
call,apply,bind
call和apply
共同点:改变 this 的指向;方法借用
不同点:参数不同而已
call
和 apply
的作用,完全一样,唯一的区别就是在参数上面。call
接收的参数不固定,第一个参数是函数体内 this 的指向,第二个参数以下是依次传入的参数。apply
接收两个参数,第一个参数也是函数体内 this 的指向。第二个参数是一个集合对象(数组或者类数组)
1 | //注意如果call和apply的第一个参数写的是null,那么this指向的是window对象 |
bind()
bind()方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列。
bind()也可以用来改变this的指向,但是有点不同
1 | var a = { |
1 | var a = { |
我们发现代码没有被打印,对,这就是bind和call、apply方法的不同,实际上bind方法返回的是一个修改过后的函数。
显示原型和隐式原型,手绘原型链,原型链是什么?为什么要有原型链
创建对象的多种方式
实现继承的多种方式和优缺点
js中的new()一个对象具体做了什么
参考
手写 Ajax,XMLHttpRequest
变量提升
举例说明一个匿名函数的典型用例
指出 JS 的宿主对象和原生对象的区别,为什么扩展 JS 内置对象不是好的做法?有哪些内置对象和内置函数?
attribute 和 property 的区别
document load 和 document DOMContentLoaded 两个事件的区别
=== 和 == , [] === [], undefined === undefined,[] == [], undefined== undefined
typeof 能够得到哪些值
什么是”use strict”,好处和坏处
函数的作用域是什么?js 的作用域有几种?
JS 如何实现重载和多态
常用的数组 api,字符串 api
原生事件绑定(跨浏览器),dom0 和 dom2 的区别?
给定一个元素获取它相对于视图窗口的坐标
如何实现图片滚动懒加载
js 的字符串类型有哪些方法? 正则表达式的函数怎么使用?
浅拷贝和深拷贝
浅拷贝
浅拷贝只会将对象的各个属性进行依次复制,并不会进行递归复制,也就是说只会赋值目标对象的第一层属性。
对于目标对象第一层为基本数据类型的数据,就是直接赋值,即「传值」; 而对于目标对象第一层为引用数据类型的数据,就是直接赋存于栈内存中的堆内存地址,即「传址」。
深拷贝
深拷贝不同于浅拷贝,它不只拷贝目标对象的第一层属性,而是递归拷贝目标对象的所有属性。
参考