前端相关知识点

1.你所知道的前端优化有哪些内容? 

性能优化:

减少dom操作,dom操作会带来repaint和reflow

尽量不要使用table布局,table中某个元素变了,就要reflow

采用更优的API替代消费高的api,转换优化消费高的集合

减少重排

(1)资源压缩与合并:html压缩、css压缩、js压缩

采用nodejs 提供了html-minifier工具,可以压缩html、css和js

nodejs还提供了CleanCss工具,对css代码进行压缩

nodejs提供的uglyfyjs2,对js代码进行压缩

实现文件合并(用gulp)

(2)非核心代码异步加载:异步加载的方式

defer和async的区别:

defer:只适用于外部文件,等到页面其他部分全部渲染完成,然后defer按照文件在页面出现的顺序执行

async:适用于外部文件,渲染完成就执行,谁先渲染完谁先执行,会打乱在页面出现的顺序

动态创建script标签:通过window.onload确保页面加载完毕再将script标签插入dom结构

(3)利用浏览器缓存

强制缓存优先于协商缓存进行,若强制缓存(Expires(http1.0)和Cache-Control(http1.1))生效则直接使用缓存,若不生效则进行协商缓存(Last-Modified / If-Modified-Since和Etag / If-None-Match),协商缓存由服务器决定是否使用缓存,若协商缓存失效,那么代表该请求的缓存失效,重新获取请求结果,再存入浏览器缓存中;生效则返回304,继续使用缓存。

1.地址栏访问,链接跳转是正常用户行为,将会触发浏览器缓存机制;

2.F5刷新,浏览器会设置max-age=0,跳过强缓存判断,会进行协商缓存判断;

3.ctrl+F5刷新,跳过强缓存和协商缓存,直接从服务器拉取资源。

(4)使用CDN

(5)预解析DNS

<link rel="dns-prefetch" href="//example.com">

浏览器会对a标签的href自动启用DNS Prefetching,所以a标签里包含的域名不需要在head中手动设置link。但是在HTTPS下不起作用,需要meta来强制开启功能。

<meta http-equiv="x-dns-prefetch-control" content="on">

(6)懒加载

原理:首先将页面上的图片的 src 属性设为空字符串,而图片的真实路径则设置在data-original属性中,

当页面滚动的时候需要去监听scroll事件,在scroll事件的回调中,判断我们的懒加载的图片是否进入可视区域,如果图片在可视区内将图片的 src 属性设置为data-original 的值,这样就可以实现延迟加载。

(7)预加载

预加载简单来说就是将所有所需的资源提前请求加载到本地,这样后面在需要用到时就直接从缓存取资源。

2.事件

onBlur:当失去输入焦点后产生该事件;

onFocus:当输入获得焦点后,产生该事件;

onchange:当文字值改变时,产生该事件;

onselect:当文字加亮后,产生该事件;

onClick:当组件被点击时产生的事件

一、事件捕获和冒泡是现代浏览器的执行事件的两个不同阶段

二、事件委托是利用冒泡阶段的运行机制来实现的

事件委托(代理):

事件代理就是,本来加在子元素身上的事件,加在了其父级身上。

那就产生了问题:父级那么多子元素,怎么区分事件本应该是哪个子元素的?

答案是:event对象里记录的有“事件源”,它就是发生事件的子元素。

它存在兼容性问题,在老的IE下,事件源是 window.event.srcElement,其他浏览器是 event.target

用事件委托有什么好处呢?

第一个好处是效率高,比如,不用for循环为子元素添加事件了

第二个好处是,js新生成的子元素也不用新为其添加事件了,程序逻辑上比较方便

4. Flash

Flash提供了ExternalInterface接口与JavaScript通信,ExternalInterface有两个方法,call和addCallback,call的作用是让Flash调用js里的方法,addCallback是用来注册flash函数让js调用。

5.边距

上右下左

6.Ajax

Ajax技术核心就是XMLHttpRequest对象。

Ajax技术的工作原理:可以分成3步

(1)创建Ajax对象:var xhr = new XMLHttpRequest();

(2)xhr 发送请求:xhr.open('get','test.html','true');

xhr.send();

(3)xhr获取响应:

xhr.onreadystatechange =function(){

 if(xhr.readystate == 4){//请求的状态码

/*0:请求还没有建立(open执行前)

    1:请求建立了还没发送(执行了open)

     2:请求正式发送(执行了send)

     3:请求已受理,有部分数据可以用,但还没有处理完成

      4:请求完全处理完成*/

       alert(xhr.responseText);//返回的数据

}

可以看到,send()前是open()

7. Angular、jquery区别

Angular大大减少了对DOM的访问;jQuery极大的丰富了DOM操作

8.深拷贝与浅拷贝

如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。

36. text-transform:capitalize是首字母大写

text-transfrom:lowercase是全部字母为小写

text-transfrom:uppercase是全部字母为大写

9.事件执行顺序

事件捕获->事件处理->事件冒泡

以下三个事件都是事件对象的方法:

stopPropagation():阻止事件冒泡,这个事件不会阻止定义在元素上的其他事件。

stopImmediatePropagation():会彻底的阻止事件,在其之后的绑定在元素上的其他监听事件都不会触发。

preventDefault():阻止事件的默认动作。

10.前端使用异步的场景

定时任务:setTimeout,setInterval

网络请求:ajax请求,动态加载

事件绑定

11.substr与substring

substr(2,3),从下标为2开始,截取长度为3的字符串。而substring(2,3),则是从下标为2开始,截取到下标为3的前一位的字符串,也就是截取1位字符。

12、重排(回流)和重绘

重排: 根据渲染树中每个渲染对象的信息,计算出各自渲染对象的几何信息(DOM对象的位置和尺寸大小),并将其安置在界面中的正确位置。

引起重排的原因:

页面首次渲染。

浏览器窗口大小发生改变。

元素尺寸或位置发生改变。

元素内容变化(文字数量或图片大小等等)。

元素字体大小变化。

添加或者删除可见的DOM元素。

激活CSS伪类(例如::hover)。

设置style属性

查询某些属性或调用某些方法。

重绘,就是当页面中元素样式的改变并不影响它在文档流中的位置时,例如更改了字体颜色,浏览器会将新样式赋予给元素并重新绘制的过程。

重排一定会重绘,重绘不一定重排

13.前端模块化

 commonJS  CMD AMD es6区别

commonJS:每个文件就是一个模块,有自己的作用域,在文件中定义的变量、类和函数都是私有的,对其他文件不可见,在服务器端模块的加载是运行时同步加载的,在浏览器端,模块需要提前编译打包处理。

特点:所有代码都运行在模块作用域,不会污染全局作用域。

模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。

模块加载的顺序,按照其在代码中出现的顺序。

暴露模块:module.exports.xx=value;

引入模块:require('')

CommonJS模块的加载机制是,输入的是被输出的值的拷贝。也就是说,一旦输出一个值,模块内部的变化就影响不到这个值

AMD:浏览器端,非同步加载模块,根据需要动态加载模块

定义暴露模块:define(function(){return 模块})//没有依赖

                         define(['module1', 'module2'], function(m1, m2){ return 模块})//有依赖

引入使用模块:require(['module1', 'module2'], function(m1, m2){使用m1/m2})

CMD:浏览器端,异步加载,模块使用时才会加载执行

AMD推崇依赖前置,CMD推崇依赖就近

定义暴露模块:define(function(require, exports, module){exports.xxx = value;module.exports = value})//没有依赖

                        定义有依赖的模块:define(function(require, exports, module){

                      //引入依赖模块(同步)

                                                          var module2 = require('./module2')

                      //引入依赖模块(异步)

                                                            require.async('./module3', function (m3) {

                                                        })

                      //暴露模块

                                                          exports.xxx = value

                                                        })

引入使用模块:define(function (require) {

                                  var m1 = require('./module1')

                                  var m4 = require('./module4')

                                  m1.show()

                                  m4.show()

                          })

ES6模块化

export命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能。

ES6与commonJS的差异

(1)commonJS模块输出的是值的拷贝,ES6模块输出的是值的引用

(2)commonJS是运行时加载,ES6是编译时输出接口

14.异步编程的四种方式

回调函数:容易造成回调地狱

事件监听:异步任务的执行不取决于代码的顺序,而取决于某个事件是否发生

发布/订阅

promise

generator,yield可以暂停,通过next调用下一个

Async/Await

15.new的过程

创建一个空对象 obj;

将新创建的空对象的隐式原型指向其构造函数的显示原型。

使用 call 改变 this 的指向

如果无返回值或者返回一个非对象值,则将 obj 返回作为新对象;如果返回值是一个新对象的话那么直接直接返回该对象。

var a =new myFunction("Li","Cherry");

new myFunction{

var obj = {}; 

 obj.__proto__ = myFunction.prototype;

var result = myFunction.call(obj,"Li","Cherry");

return typeof result ==='obj'? result : obj;

}

16.内存泄露的几种情况

(1)当页面中元素被移除或替换时,若元素绑定的事件仍没被移除,在IE中不会作出恰当处理,此时要先手工移除事件,不然会存在内存泄露。

可以通过在事件刚开始将事件置为空或者通过事件代理(委托)来完成。

(2)在 Internet Explorer 中,如果循环引用中的任何对象是 DOM 节点或者 ActiveX 对象,垃圾收集系统则不会发现它们之间的循环关系与系统中的其他对象是隔离的并释放它们。最终它们将被保留在内存中,直到浏览器关闭。

(3)闭包可以维持函数内局部变量,使其得不到释放。

处理方式:将事件处理函数定义在外部,解除闭包

(4)a = {p: {x: 1}};

         b = a.p;deletea.p;

所以在销毁对象的时候,要遍历属性中属性,依次删除。

17.页面刷新

location.reload(bool)//如果bool为true,跳过缓存,直接重新下载文档,如果bool为false,从缓存获取文档

location.replace('url')//用一个新文档取代当前文档

页面自动刷新<meta http-equiv="refresh" content="5">

18.原生实现apply、call、bind

Function.prototype.myapply=function(obj,arr){

    obj=obj||window;

    let args=[];

    for(let i=0;i<arr.length;i++){

        args.push('arr['+i+']');

    }

    obj.fn=this;

    let result;

    if(!arr){

        result=eval(obj.fn())

    }else{

        result=eval('obj.fn('+args+')');

    }

    delete obj.fn;

    return result;

}

Function.prototype.mycall=function(obj){

    obj=obj||window;

    obj.fn=this;

    let args=[];

    for(let i=1;i<arguments.length;i++){

        args.push('arguments['+i+']');

    }

    let result=eval('obj.fn('+args+')');

    delete obj.fn;

    return result;

}

var value = 2;

var obj = {

    value: 1

}

function bar(name, age) {

    console.log(this.value);

    return {

        value: this.value,

        name: name,

        age: age

    }

}

//bar.mycall(null); // 2

//console.log(bar.mycall(obj, 'kewkin', 18));

console.log(bar.myapply(obj, ['kewkin', 18]));*/

//实现bind

/*Function.prototype.mybind=function(obj){

   if(typeof this!=='function'){

    throw new Error('Not Be Function');

   }

   var self=this;

   var args=Array.prototype.slice.call(arguments,1);

   var fNop=function(){};

   var fBound=function(){

       var argsinside=Array.prototype.slice.call(arguments,0);

        self.apply(this instanceof self?this:obj,args.concat(argsinside));

   };

   //直接修改fBound的prototype也会修改函数的prototype,所以通过一个空函数做中转站

   fNop.prototype=this.prototype;

   fBound.prototype=new fNop();

   return fBound;

}

19自适应布局方式

使用meta<meta name="viewport" content="width=device-width,user-scale=no,initial-scale=1.0,maximum-scale=1.0.minimum-scale=1.0">

使用rem em单位(计算时可以用calc)

使用百分比布局

使用媒体查询 @media only screen and (max-width: 500px) { body {

        background-color: lightblue;    }}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容

  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,179评论 0 3
  • 前端开发面试题 面试题目: 根据你的等级和职位的变化,入门级到专家级,广度和深度都会有所增加。 题目类型: 理论知...
    怡宝丶阅读 2,578评论 0 7
  • JavaScript 介绍js的基本数据类型。 Undefined、Null、Boolean、Number、St...
    cuikangjie阅读 472评论 0 3
  • 请参看我github中的wiki,不定期更新。https://github.com/ivonzhang/Front...
    zhangivon阅读 7,126评论 2 19
  • @转自GitHub 介绍js的基本数据类型。Undefined、Null、Boolean、Number、Strin...
    YT_Zou阅读 1,153评论 0 0