整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          JavaScript Charts更新至v3.17.

          JavaScript Charts更新至v3.17.0

          avaScript Charts兼容性好的JavaScript、HTML5圖表開發(fā)工具,能滿足大部分的開發(fā)需求,包括序列圖表(列型圖,條形圖,線型圖,面積圖,步驟折線圖,平滑折線圖,蠟燭圖,ohlc圖),餅圖/環(huán)形圖,雷 達(dá)圖/極區(qū)圖以及xy圖/散點圖/氣泡圖。

          最新發(fā)布的v3.17.0版本做出了如下更新:
          • CategoryAxis新增widthField屬性。你可以使用此字段指定列相對寬度,并且可使用這個新功能產(chǎn)生Mekko圖。
          • 你不僅可以通過JSON配置給圖表添加監(jiān)聽器,現(xiàn)在可通過listeners屬性直接在圖表對象上添加,如:chart.listeners=[{event:”dataUpdated”, method:handleDataUpdate}]
          • 修復(fù):如果Gantt圖的類多余chart.colors矩陣的顏色,那么將為每一個區(qū)段隨機(jī)分配顏色而不是每個類別。
          • 修復(fù):不能動態(tài)更改圖形的顏色。

          本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯

          • xtjs
          • ext4英文api
          • ext4中文api
          1. EasyUI
          • jquery easyui 未壓縮源代碼
          1. J-UI
          • J-UI
          1. Other
          • MUI-最接近原生APP體驗的高性能前端框架
          • Amaze UI | 中國首個開源 HTML5 跨屏前端框架
          • 淘寶 HTML5 前端框架
          • KISSY - 阿里前端JavaScript庫
          • 網(wǎng)易Nej - Nice Easy Javascript
          • Kendo UI MVVM Demo
          • Bootstrap
          • Smart UI
          • 雅虎UI - CSS UI

          7. 頁面 社會化 分享功能

          • 百度分享 pc端
          • JiaThis pc端
          • 社會化分享組件 移動端
          • ShareSDK 輕松實現(xiàn)社會化功能 移動端
          • 友盟分享 移動端

          8. 富文本編輯器

          • 百度 ueditor
          • 經(jīng)典的ckeditor
          • 經(jīng)典的kindeditor
          • wysiwyg
          • 一個有情懷的編輯器。Bach's Editor
          • tower用的編輯器
          • summernote 編輯器
          • html5編輯器
          • XEditor
          • wangEditor

          9. 日歷

          1. PC
          • 經(jīng)典my97
          • 強(qiáng)大的獨立日期選擇器
          • fullcalendar
          • fullcalendar日歷控件知識點集合
          • 中文api
          • 農(nóng)歷日歷
          • 超酷的仿百度帶節(jié)日日歷老黃歷控件
          • 日期格式化
          • 大牛日歷控件
          • 我群某管理作品
          • input按位替換-官網(wǎng)
          • input按位替換-github
          • bootstrap-daterangepicker
          • 國外30個插件集合
          • JavaScript datepicker
          • Datepair.js
          • 一個風(fēng)格多樣的日歷
          • 彈出層式的全日歷
          • jquery雙日歷
          1. 移動
          • 大氣實用jQuery手機(jī)移動端日歷日期選擇插件
          • jQuery Mobile 移動開發(fā)中的日期插件Mobiscroll
          1. Date library
          • Datejs
          • sugarjs

          10. 綜合效果搜索平臺

          • 效果網(wǎng)
          • 17素材
          • 常用的JavaScript代碼片段

          11. 前端工程化

          1. 概述
          • 前端工具大全
          • 什么是前端工程化
          1. Gulp
          • Gulp官網(wǎng)
          • Gulp中文網(wǎng)
          • gulp資料收集
          • Gulp:任務(wù)自動管理工具 - ruanyifeng
          • Gulp插件
          • Gulp不完全入門教程
          • 為什么使用gulp?
          • Gulp安裝及配合組件構(gòu)建前端開發(fā)一體化
          • Gulp 入門指南
          • Gulp 入門指南 - nimojs
          • Gulp入門教程
          • Gulp in Action
          • Gulp開發(fā)教程(翻譯)
          • 前端構(gòu)建工具gulpjs的使用介紹及技巧
          1. Grunt
          • gruntjs
          • Grunt中文網(wǎng)
          1. Fis
          • fis 官網(wǎng)
          • fis

          12. 輪播圖

          1. pc圖輪
          • 單屏輪播sochange
          • 左右按鈕多圖切換
          • fullpage全屏輪播
          1. 移動端

          - [無縫切換](http://www.swipejs.com/)

          - [滑屏效果](http://www.idangero.us/swiper/)

          - [全屏fullpage](https://github.com/peunzhang/fullpage)

          - [單個圖片切換](https://github.com/qiqiboy/touchslider)

          - [單個全屏切換](https://github.com/peunzhang/slip.js)

          - [百度的切換庫](http://touch.code.baidu.com/examples.html?qq-pf-to=pcqq.group)

          - [單個全屏切換](https://github.com/peunzhang/iSlider)

          - [滑屏效果](https://github.com/saw/touch-interfaces)

          - [旋轉(zhuǎn)拖動設(shè)置](http://baijs.com/tinycircleslider/)

          - [類似于swipe切換](http://touchslider.com/)

          - [支持多種形式的觸摸滑動](http://www.swiper.com.cn/demo/index.html)

          - [滑屏效果](https://github.com/joker-ye/main/blob/master/wap/index.html)

          - [大話主席pc移動圖片輪換](http://www.superslide2.com/)

          - [滑屏效果](https://github.com/hahnzhu/parallax.js)

          - [基于zepto的fullpage](https://github.com/yanhaijing/zepto.fullpage)

          - [ - 定寬網(wǎng)頁設(shè)計下,固定寬度布局開發(fā)WebApp并實現(xiàn)多終端下WebApp布局自適應(yīng)](http://www.cnblogs.com/plums/archive/2013/01/10/WebApp-fixed-width-layout-of-multi-terminal-adapter-since.html][WebApp)

          - [判斷微信客戶端的那些坑](http://loo2k.com/blog/detecting-wechat-client/)

          - [可以通過javascript直接調(diào)用原生分享的工具](https://github.com/JefferyWang/nativeShare.js)

          - [JiaThis 分享到微信代碼](http://www.jiathis.com/help/html/weixin-share-code)

          - [聊聊移動端跨平臺開發(fā)的各種技術(shù)](http://fex.baidu.com/blog/2015/05/cross-mobile/)

          - [前端自動化測試](http://www.zhihu.com/question/29922082)

          - [多種輪換圖片](http://ajccom.github.io/niceslider/)

          - [滑動側(cè)邊欄](https://mango.github.io/slideout/)

          13. 文件上傳

          • 百度上傳組件
          • 上傳
          • flash 頭像上傳
          • 圖片上傳預(yù)覽
          • 圖片裁剪
          • 圖片裁剪-shearphoto
          • jQuery圖片處理

          14. 模擬select

          • 糖餅 select
          • flexselect
          • 雙select
          • select2

          15. 取色插件

          • 類似 Photoshop 的界面取色插件
          • jquery color
          • 取色插件集合
          • farbtastic 圓環(huán)+正方形

          16. 城市聯(lián)動

          • jquery.cityselect.js基于jQuery+JSON的省市或自定義聯(lián)動效果

          17. 剪貼板

          • 剪貼板
          • clipboard 最新的剪切方案
          • 不是Flash的剪貼板

          18. 簡繁轉(zhuǎn)換

          • 簡繁轉(zhuǎn)換

          19. 表格 Grid

          • facebook表格
          • 類似于Excel編輯表格-handsontable
          • bootstrap-table插件
          • datatables

          20. 在線演示

          • js 在線編輯 - runjs
          • js 在線編輯 - jsbin
          • js 在線編輯 - codepen
          • js 在線編輯 - jsfiddle
          • java 在線編輯 - runjs
          • js 在線編輯 - hcharts
          • js 在線編輯 - jsdm
          • sql 在線編輯 - sqlfiddle
          • mozilla 在線編輯器

          21. 播放器

          • Html5 VideoPlayer

          22. 粒子動畫

          • Proton 煙花

          九. Nodejs

          • nodejs 篇幅比較巨大
          • Node.js 包教不包會
          • 篇幅比較少
          • node express 入門教程
          • nodejs定時任務(wù)
          • 一個nodejs博客
          • 【NodeJS 學(xué)習(xí)筆記04】新聞發(fā)布系統(tǒng)
          • 過年7天樂,學(xué)nodejs 也快樂
          • 七天學(xué)會NodeJS
          • Nodejs學(xué)習(xí)筆記(二)--- 事件模塊
          • nodejs入門
          • angularjs nodejs
          • 從零開始nodejs系列文章
          • 理解nodejs
          • nodejs事件輪詢
          • node入門
          • nodejs cms
          • Node初學(xué)者入門,一本全面的NodeJS教程
          • NodeJS的代碼調(diào)試和性能調(diào)優(yōu)

          十. 性能優(yōu)化

          1. 常規(guī)優(yōu)化

          - [Javascript高性能動畫與頁面渲染](http://www.infoq.com/cn/articles/javascript-high-performance-animation-and-page-rendering)

          - [移動H5前端性能優(yōu)化指南](http://isux.tencent.com/h5-performance.html)

          - [5173首頁前端性能優(yōu)化實踐](http://ued.5173.com/?p=1731)

          - [給網(wǎng)頁設(shè)計師和前端開發(fā)者看的前端性能優(yōu)化](http://www.uisdc.com/front-end-performance-for-web-designers-and-front-end-developers)

          - [復(fù)雜應(yīng)用的 CSS 性能分析和優(yōu)化建議](http://www.orzpoint.com/profiling-css-and-optimization-notes/)

          - [張鑫旭——前端性能](http://www.zhangxinxu.com/wordpress/tag/%E5%89%8D%E7%AB%AF%E6%80%A7%E8%83%BD/)

          - [前端性能監(jiān)控總結(jié)](http://www.xiaoqiang.org/javascript/font-end-performance-monitor.html)

          - [ 網(wǎng)站性能優(yōu)化之CSS無圖片技術(shù)](http://udc.weibo.com/2013/05/%E7%BD%91%E7%AB%99%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E4%B9%8Bcss%E6%97%A0%E5%9B%BE%E7%89%87%E6%8A%80%E6%9C%AF/)

          - [web前端性能優(yōu)化進(jìn)階路](http://www.aliued.cn/2013/01/20/web%E5%89%8D%E7%AB%AF%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E8%BF%9B%E9%98%B6%E8%B7%AF.html)

          - [前端技術(shù):網(wǎng)站性能優(yōu)化之CSS無圖片技術(shù)](http://my.eoe.cn/tuwandou/archive/4544.html)

          - [瀏覽器的加載與頁面性能優(yōu)化](http://www.baiduux.com/blog/2011/02/15/browser-loading/)

          - [頁面加載中的圖片性能優(yōu)化](http://www.w3ctech.com/p/1503)

          - [Hey——前端性能](http://www.feelcss.com/tag/%E5%89%8D%E7%AB%AF%E6%80%A7%E8%83%BD)

          - [html優(yōu)化](http://www.baiduux.com/blog/2010/03/15/html%E4%BC%98%E5%8C%96-2/)

          - [99css——性能](http://www.99css.com/tag/%e6%80%a7%e8%83%bd)

          - [Yslow——性能優(yōu)化](http://www.yslow.net/category.php?cid=20)

          - [YSLOW中文介紹](http://www.cnblogs.com/yslow/)

          - [轉(zhuǎn)一篇Yahoo關(guān)于網(wǎng)站性能優(yōu)化的文章,兼談本站要做的優(yōu)化](http://www.360ito.com/article/40.html)

          - [Yahoo!團(tuán)隊實踐分享:網(wǎng)站性能](http://www.360doc.com/content/10/0928/09/2588264_56971287.shtml)

          - [網(wǎng)站性能優(yōu)化指南:什么使我們的網(wǎng)站變慢?](http://blog.jiasule.com/i/153)

          - [網(wǎng)站性能優(yōu)化實踐,減少加載時間,提高用戶體驗](http://www.powereasy.net/helpyou/knowledge/ecommerce/9593.html)

          - [淺談網(wǎng)站性能優(yōu)化 前端篇](http://www.umtry.com/archives/747.html)

          - [前端重構(gòu)實踐之如何對網(wǎng)站性能優(yōu)化?](http://www.adinnet.cn/blog/designview/2012-7-12/678.html)

          - [前端性能優(yōu)化:使用媒體查詢加載指定大小的背景圖片](http://www.gbin1.com/technology/javascript/20130708-front-end-performance-optimization-9/)

          - [網(wǎng)站性能系列博文](http://www.mykuer.com/post/factors-that-affect-the-speed-of-web-site-open.html)

          - [加載,不只是少一點點](http://tgideas.qq.com/webplat/info/news_version3/804/808/811/m579/201109/41355.shtml)

          - [前端性能的測試與優(yōu)化](http://mzhou.me/article/95310/)

          - [分享網(wǎng)頁加載速度優(yōu)化的一些技巧?](http://www.gbin1.com/technology/html/20130217-tips-for-speed-up-page-loading/)

          - [頁面加載中的圖片性能優(yōu)化](http://www.f2es.com/images-bytes-opt/)

          - [web前端優(yōu)化(基于Yslow)](http://www.tcreator.info/webSchool/website/Front-end-Opt-Yslow.html)

          - [網(wǎng)站性能優(yōu)化工具大全](https://www.qianduan.net/website-performance-optimization-tool.html)

          - [【高性能前端1】高性能HTML](http://www.alloyteam.com/2012/10/high-performance-html/)

          - [【高性能前端2】高性能CSS](http://www.alloyteam.com/2012/10/high-performance-css/)

          - [由12306談?wù)劸W(wǎng)站前端性能和后端性能優(yōu)化](http://coolshell.cn/articles/6470.html)

          - [AlloyTeam——前端優(yōu)化](http://www.alloyteam.com/webfrontend/%E5%89%8D%E7%AB%AF%E4%BC%98%E5%8C%96/)

          - [毫秒必爭,前端網(wǎng)頁性能最佳實踐](http://www.cnblogs.com/developersupport/p/3248695.html)

          - [網(wǎng)站性能工具Yslow的使用方法](http://blog.sina.com.cn/s/blog_6e9d2e0701017kvu.html)

          - [前端工程與性能優(yōu)化(上):靜態(tài)資源版本更新與緩存](http://www.infoq.com/cn/articles/front-end-engineering-and-performance-optimization-part1)

          - [前端工程與性能優(yōu)化(下):靜態(tài)資源管理與模板框架](http://www.infoq.com/cn/articles/front-end-engineering-and-performance-optimization-part2)

          - [HTTPS連接的前幾毫秒發(fā)生了什么](http://blog.jobbole.com/48369/)

          - [Yslow](http://uicss.cn/yslow/#more-12319)

          - [Essential Web Performance Metrics — A Primer, Part 1](http://blog.smartbear.com/web-performance/essential-web-performance-metrics-a-primer-part-1/)

          - [Essential Web Performance Metrics — Part 2](http://blog.smartbear.com/performance/essential-web-performance-metrics-part-2/)

          - [YUISlide,針對移動設(shè)備的動畫性能優(yōu)化](http://jayli.github.io/blog/data/2011/12/23/yuislide.html)

          - [Improving Site Performance](http://joelglovier.com/improving-site-performance/)

          - [讓網(wǎng)站提速的最佳前端實踐](http://segmentfault.com/a/1190000000367899)

          - [Why Website Speed is Important](http://sixrevisions.com/web-development/why-website-speed-is-important/)

          - [Need for Speed – How to Improve your Website Performance](https://www.devbridge.com/articles/need-for-speed-how-to-improve-your-website-performance/)

          - [阿里無線前端性能優(yōu)化指南 (Pt.1 加載期優(yōu)化)](https://github.com/amfe/article/issues/1)

          1. 優(yōu)化工具
          • JavaScript 性能分析新工具 OneProfile
          • JavaScript 堆內(nèi)存分析新工具 OneHeap
          1. 在線工具
          • google在線工具
          • 阿里測
          • 阿里-免費測試服務(wù)
          • 阿里-F2etest多瀏覽器兼容性測試解決方案
          • js性能測試

          十一. 前端架構(gòu)

          • 技術(shù)架構(gòu)
          • 前端架構(gòu)
          • 如何成為前端架構(gòu)師
          • 關(guān)于前端架構(gòu)-張克軍
          • 百度騰訊offer比較(騰訊游戲VS百度基礎(chǔ)架構(gòu))

          十二. 個人作品

          1. 推薦作品

          • winter代碼片段需要翻墻
          • fgm
          • 岑安作品集
          • 當(dāng)耐特demo集合
          • 米空格 js作品
          • myFocus
          • SeaJS組件庫
          • 顏海鏡作品
          • 腳兒網(wǎng)作品
          • javascript個人作品
          • 妙味的雷東升游戲作品
          • javascript作品集
          • 云五筆,灰度產(chǎn)生生成工具
          • 項目主頁
          • 個性的作品主頁
          • 播放器
          • ucren js demos 集
          • 智能社
          • 實例陳列架
          • zoye demo
          • 王員外
          • 平凡
          • jyg 游戲案例
          • 很多jquery插件
          • 不羈蟲 - soJs 作品系列
          • frozenui
          • 黑白棋
          • fromone

          2. 群員作品

          • MDialog - [合肥-M.J]
          • 輪播圖 - [上海-冷靜]
          • [廣州—堅殼]
          • [成都 - 無痕] 感恩節(jié)專題
          • [球霸天]
          • [北京-小數(shù)]
          • [ptf] Magix 工具
          • [杭州-Pft] Magix 基于 MVC 結(jié)構(gòu)和 Hash 驅(qū)動的 OPOA(One Page One Application)應(yīng)用
          • [上海-劇中人]-實驗室
          • [上海-豪情 ] 作品集合
          • [成都-feeling]
          • [上海-angela]
          • [海南-hank]作品
          • [上海-張力]博客
          • [上海-zenki]作品
          • 移動端圖案解鎖
          • [合肥-M.J] - MPreview 移動端圖片預(yù)覽組
          • [合肥-M.J] - Mexam 移動端在線做題組
          • [北京-蘇瑞] - dancer小人
          • [上海-玄沐]- 個人網(wǎng)站
          • [廈門-二哲]- 個人博客

          3. 國外大牛精品

          • pazguille

          十三. 簡歷模板

          • 不錯的個人簡歷
          • 簡歷
          • 張倫
          • 簡歷
          • 翁天信
          • 動畫方式的簡歷
          • 組件豐富簡歷
          • 簡歷池
          • haorooms博客
          • Justin Young

          十四. 面試題

          • 那幾個月在找工作(百度,網(wǎng)易游戲)
          • 2014最新面試題
          • 阿里前端面試題
          • 2016校招內(nèi)推 -- 阿里巴巴前端 -- 三面面試經(jīng)歷
          • 騰訊面試題
          • 年后跳槽那點事:樂視+金山+360面試之行
          • 阿里前端面試題上線
          • 拉勾網(wǎng)js面試題
          • 前端面試
          • Web開發(fā)筆試面試題 大全
          • 前端開發(fā)面試題
          • 2014最新前端面試題
          • 百度面試
          • 面試題
          • 前端工作面試問題
          • 前端開發(fā)面試題
          • 5個經(jīng)典的前端面試問題
          • 最全前端面試問題及答案總結(jié)
          • 如何面試一名前端開發(fā)工程師?
          • 史上最全 前端開發(fā)面試問題及答案整理
          • 前端實習(xí)生面試總結(jié)
          • 史上最全 前端開發(fā)面試問題及答案整理
          • BAT及各大互聯(lián)網(wǎng)公司2014前端筆試面試題:JavaScript篇
          • 前端開發(fā)面試題大收集
          • 收集的前端面試題和答案
          • 如何面試前端工程師
          • 前端開發(fā)面試題
          • 牛客網(wǎng)-筆試面經(jīng)

          十五. iconfont

          • 中文字體
          • 淘寶字庫
          • 字體
          • 制作教程
          • zhangxinxu-icommon
          • icommon
          • 用字體在網(wǎng)頁中畫ICON圖標(biāo)(推薦教程)
          • 字體壓縮工具 感謝初級群 [深圳-小魚] 的推薦

          十六. 開發(fā)工具類

          1. 前端開發(fā)工具
          • IntelliJ IDEA 簡體中文專題教程
          • Webstorm,InterllIdea,Phpstorm
          • SublimeText
          • Atom
          • visual studio code
          1. Chrome, Firebug, Filddle 調(diào)試
          2. Fiddler
          • Fiddler調(diào)式使用知多少(一)深入研究
          • 微信fiddle
          • 微信fiddle
          1. Chrome
          • Google Chrome 官方
          • Chrome - 基礎(chǔ)
          • Chrome - 進(jìn)階
          • Chrome - 性能
          • Chrome - 性能進(jìn)階
          • Chrome - 移動
          • Chrome - 使用技巧
          • Chrome - Console控制臺不完全指南
          • Chrome - Workspace使瀏覽器變成IDE
          • network面板
          • chrome開發(fā)工具快捷鍵
          • chrome調(diào)試工具常用功能整理
          • Chrome 開發(fā)工具 Workspace 使用
          • Chrome神器Vimium快捷鍵學(xué)習(xí)記錄
          • sass調(diào)試-w3cplus
          • 如何更專業(yè)的使用Chrome開發(fā)者工具-w3cplus
          • chrome調(diào)試canvas
          • chrome profiles1
          • chrome profiles2
          • chrome profiles3
          • chrome移動版調(diào)試
          • chrome調(diào)試
          • chrome的調(diào)試
          • chrome console 命令詳解
          • 查看事件綁定1
          • 查看事件綁定2
          • 神器——Chrome開發(fā)者工具(一)
          • 奇趣百科性能優(yōu)化(Chrome DevTools 中的 Timeline Profils 等工具使用介紹)
          • chrome 開發(fā)者工具的 15 個小技巧
          • Chrome開發(fā)者工具不完全指南
          • Chrome 開發(fā)者工具使用技巧
          1. Firebug
          • firebug視頻教程
          • firefox 模擬器
          • console.log 命令詳解
          • Firebug入門指南
          • Firebug控制臺詳解
          1. 移動,微信調(diào)試
          • 瀏覽器端調(diào)試安卓
          • 移動端前端開發(fā)調(diào)試
          • 使用 Chrome 遠(yuǎn)程調(diào)試 Android 設(shè)備
          • mac移動端調(diào)試
          • mac移動端調(diào)試
          • 無線調(diào)試攻略
          • 無線調(diào)試攻略
          • 屌爆了,完美調(diào)試 微信webview(x5)
          • 微信調(diào)試的那些事
          • 遠(yuǎn)程console
          • 微信調(diào)試工具
          • 各種真機(jī)遠(yuǎn)程調(diào)試方法匯總
          1. iOS Simulator
          • Simulator
          • Xcode中的iOS模擬器(iOS Simulator)的介紹和使用心得
          1. img
          • loading img
          • 智圖-圖片優(yōu)化平臺
          • 在線png優(yōu)化
          1. 生成二維碼
          • 生成二維碼
          1. 瀏覽器同步
          • puer
          • liveReload
          • f5
          • File Watchers
          1. 在線PPT制作
          • nodePPT
          • PPT
          • reveal
          • slippy

          十七. 前端導(dǎo)航網(wǎng)站

          • 界面清爽的前端導(dǎo)航
          • 前端導(dǎo)航
          • 前端網(wǎng)址導(dǎo)航
          • 前端名錄
          • 前端導(dǎo)航
          • 前端開發(fā)資源
          • 網(wǎng)址導(dǎo)航
          • 前端開發(fā)倉庫 - 眾多效果的收集地
          • 前端資源導(dǎo)航
          • F2E 前端導(dǎo)航

          十八. 常用CDN

          • 新浪CDN
          • 百度靜態(tài)資源公共庫
          • 360網(wǎng)站衛(wèi)士常用前端公共庫CDN服務(wù)
          • Bootstrap中文網(wǎng)開源項目免費 CDN 服務(wù)
          • 開放靜態(tài)文件 CDN - 七牛
          • CDN加速 - jq22
          • jQuery CDN
          • Google jQuery CDN
          • 微軟CDN

          十九. Git,SVN,Github

          1. Git
          • git-scm
          • 廖雪峰-Git教程
          • git-for-windows
          • GitHub 添加 SSH keys
          • gogithub
          • git常規(guī)命令練習(xí)
          • git的資料整理
          • 我所記錄的git命令(非常實用)
          • 企業(yè)開發(fā)git工作流模式探索部分休整
          • GitHub 漫游指南
          • GitHub秘籍
          • 使用git和github進(jìn)行協(xié)同開發(fā)流程
          • 動畫方式練習(xí)git

          這些技術(shù)如何學(xué)習(xí),有沒有免費資料?

          對前端的技術(shù),架構(gòu)技術(shù)感興趣的同學(xué)關(guān)注我的頭條號,并在后臺私信發(fā)送關(guān)鍵字:“前端”即可獲取免費的架構(gòu)師學(xué)習(xí)資料

          • 知識體系已整理好,歡迎免費領(lǐng)取。還有面試視頻分享可以免費獲取。關(guān)注我,可以獲得沒有的架構(gòu)經(jīng)驗哦!!

          源|https://segmentfault.com/a/1190000015288700

          本篇文章整理總結(jié)了一些前端面試題,涵蓋面很廣,并且面的都是知名大廠,所以這些題還是很有代表性的,都掌握以后一面基礎(chǔ)面應(yīng)該沒什么問題,二面也能應(yīng)付大半,奉上:

          css相關(guān)

          1. 萬能居中

          1.margin: 0 auto;水平
          2.text-align: center;水平
          3.行高,垂直
          4.表格,center,middle;水平垂直
          5.display:table-cell;模擬表格,all
          6.絕對定位,50%減自身寬高
          7.絕對定位,上下左右全0,margin:auto
          8.絕對定位加相對定位。不需要知道寬高
          9.IE6,IE7:給父元素設(shè)一個font-size:高度/1.14,vertical-align:middle

          2. BFC優(yōu)化

          塊格式化上下文, 特性:

          • 詩 BFC 內(nèi)部浮動元素不會到處亂跑;
          • 和浮動元素產(chǎn)生邊界。

          3. 和模型哪兩種模式?什么區(qū)別?如何設(shè)置

          • 標(biāo)準(zhǔn)模式: box-sizing: content-box; 寬高不包括內(nèi)邊距和邊框
          • 怪異模式: box-sizing: border-box

          4. 常用清除浮動的方法,如不清除浮動會怎樣?

          當(dāng)父元素不給高度的時候,內(nèi)部元素不浮動時會撐開, 而浮動的時候,父元素變成一條線, 造成塌陷.

          • 額外標(biāo)簽法(在最后一個浮動標(biāo)簽后,新加一個標(biāo)簽,給其設(shè)置clear:both;)(不推薦)
          • 父元素添加overflow:hidden; (觸發(fā)BFC)
          • 使用after偽元素清除浮動(推薦使用)
          • 使用before和after雙偽元素清除浮動

          5. 柵格化的原理

          比如antd的row和col, 將一行等分為24份, col是幾就占幾份, 底層按百分比實現(xiàn); 結(jié)合媒體查詢, 可以實現(xiàn)響應(yīng)式

          6. 純css實現(xiàn)三角形

          // 通過設(shè)置border
          .box
                  {
                      width:0px;
                      height:0px;
          
                      border-top:50px solid rgba(0,0,0,0);
                      border-right:50px solid  rgba(0,0,0,0);
                      border-bottom:50px solid green;
                      border-left:50px solid  rgba(0,0,0,0);
                      }

          7. 高度不定,寬100%,內(nèi)一p高不確定,如何實現(xiàn)垂直居中?

          • verticle-align: middle;
          • 絕對定位50%加translateY(-50%)
          • 絕對定位,上下左右全0,margin:auto

          8. 至少兩種方式實現(xiàn)自適應(yīng)搜索

          • rem, em
          • 百分比
          • 媒體查詢
          • bs, antd等的柵格布局

          9. 設(shè)置一段文字的大小為6px

          • 谷歌最小12px, 其他瀏覽器可以更小
          • 通過transform: scale實現(xiàn)

          10. css菊花圖

          四個小圓點一直旋轉(zhuǎn)

          // 父標(biāo)簽
          animation: antRotate 1.2s infinite linear;
          // 子標(biāo)簽
          animation: antSpin 1s infinite linear;
          @keyframe antSpin {
            to {
              opacity: 1
            }
          }
          @keyframe antRotate {
            to {
              transform: rotate(405)
            }
          }
          // animation-delay: 逐個延遲0.4s

          11. 關(guān)于em

          <p style="font-size: 20px">
                123
                <p style="font-size: 2em;width: 2em">456</p>
           </p>
          // 此時子元素的font-size為40px, 寬度為80px(還要乘以子元素font-size的系數(shù))

          12. 關(guān)于vh, vw

          vw:viewpoint width,視窗寬度,1vw等于視窗寬度的1%。
          vh:viewpoint height,視窗高度,1vh等于視窗高度的1%。
          vmin:vw和vh中較小的那個。
          vmax:vw和vh中較大的那個。

          13. Flex布局

          • flex-direction控制主副軸
          • flex-wrap控制換行(默認(rèn)不換行)
          • flex-flow是上兩個的結(jié)合
          • justify-content主軸對齊方式
          • align-items交叉軸對齊方式

          14. overflow原理

          • overflow: hidden能清除塊內(nèi)子元素的浮動影響. 因為該屬性進(jìn)行超出隱藏時需要計算盒子內(nèi)所有元素的高度, 所以會隱式清除浮動
          • 創(chuàng)建BFC條件(滿足一個):
            • float的值不為none;
            • overflow的值不為visible;
            • position的值為fixed / absolute;
            • display的值為table-cell / table-caption / inline-block / flex / inline-flex。

          15. 實現(xiàn)自適應(yīng)的正方形:

          • 使用vw, vh
          • width百分比, height: 0, padding-top(bottom): 50%

          16. 標(biāo)準(zhǔn)模式和怪異模式

          • document.compatMode屬性可以判斷是否是標(biāo)準(zhǔn)模式,當(dāng) document.compatMode為“CSS1Compat”,是標(biāo)準(zhǔn)模式,“BackCompat”是怪異模式。
          • 怪異模式是為了兼容舊版本的瀏覽器, 因為IE低版本document.documentElement.clientWidth獲取不到
          • 怪異模式和模型: box-sizing: border-box; 標(biāo)準(zhǔn)模式: box-sizing: content-box

          17. CSS3實現(xiàn)環(huán)形進(jìn)度條

          兩個對半矩形遮罩, 使用rotate以及overflow: hidden進(jìn)行旋轉(zhuǎn)

          18. css優(yōu)先級

          選擇器的特殊性值表述為4個部分,用0,0,0,0表示。

          • ID選擇器的特殊性值,加0,1,0,0。
          • 類選擇器、屬性選擇器或偽類,加0,0,1,0。
          • 元素和偽元素,加0,0,0,1。
          • 通配選擇器*對特殊性沒有貢獻(xiàn),即0,0,0,0。
          • 最后比較特殊的一個標(biāo)志!important(權(quán)重),它沒有特殊性值,但它的優(yōu)先級是最高的,為了方便記憶,可以認(rèn)為它的特殊性值為1,0,0,0,0。

          JS相關(guān)

          1. ES5和ES6繼承方式區(qū)別

          • ES5定義類以函數(shù)形式, 以prototype來實現(xiàn)繼承
          • ES6以class形式定義類, 以extend形式繼承

          2. Generator了解

          ES6 提供的一種異步編程解決方案, Generator 函數(shù)是一個狀態(tài)機(jī),封裝了多個內(nèi)部狀態(tài)。

          // 通過設(shè)置border.box        {            width:0px;            height:0px;            border-top:50px solid rgba(0,0,0,0);            border-right:50px solid  rgba(0,0,0,0);            border-bottom:50px solid green;            border-left:50px solid  rgba(0,0,0,0);            }

          調(diào)用后返回指向內(nèi)部狀態(tài)的指針, 調(diào)用next()才會移向下一個狀態(tài), 參數(shù):

          hw.next()
          // { value: 'hello', done: false }
          hw.next()
          // { value: 'world', done: false }
          hw.next()
          // { value: 'ending', done: true }
          hw.next()
          // { value: undefined, done: true }

          3. 手寫Promise實現(xiàn)

          var myPromise=new Promise((resolve, reject)=> {
            // 需要執(zhí)行的代碼
            ...
            if (/* 異步執(zhí)行成功 */) {
              resolve(value)
            } else if (/* 異步執(zhí)行失敗 */) {
              reject(error)
            }
          })
          
          myPromise.then((value)=> {
            // 成功后調(diào)用, 使用value值
          }, (error)=> {
            // 失敗后調(diào)用, 獲取錯誤信息error
          })

          4. Promise優(yōu)缺點

          • 優(yōu)點: 解決回調(diào)地獄, 對異步任務(wù)寫法更標(biāo)準(zhǔn)化與簡潔化
          • 缺點: 首先,無法取消Promise,一旦新建它就會立即執(zhí)行,無法中途取消; 其次,如果不設(shè)置回調(diào)函數(shù),Promise內(nèi)部拋出的錯誤,不會反應(yīng)到外部; 第三,當(dāng)處于pending狀態(tài)時,無法得知目前進(jìn)展到哪一個階段(剛剛開始還是即將完成).
            極簡版promise封裝:
          function promise () {
            this.msg='' // 存放value和error
            this.status='pending'
            var that=this
            var process=arguments[0]
          
            process (function () {
              that.status='fulfilled'
              that.msg=arguments[0]
            }, function () {
              that.status='rejected'
              that.msg=arguments[0]
            })
            return this
          }
          
          promise.prototype.then=function () {
            if (this.status==='fulfilled') {
              arguments[0](this.msg)
            } else if (this.status==='rejected' && arguments[1]) {
              arguments[1](this.msg)
            }
          }

          5. 觀察者模式

          又稱發(fā)布-訂閱模式, 舉例子說明.
          實現(xiàn): 發(fā)布者管理訂閱者隊列, 并有新消息推送功能. 訂閱者僅關(guān)注更新就行

          6. 手寫實現(xiàn)bind

          Function.prototype.bind=function () {
             // 保存原函數(shù)
            var self=this
            // 取出第一個參數(shù)作為上下文, 相當(dāng)于[].shift.call(arguments)
            var context=Array.prototype.shift.call(arguments)
            // 取剩余的參數(shù)作為arg; 因為arguments是偽數(shù)組, 所以要轉(zhuǎn)化為數(shù)組才能使用數(shù)組方法
            var arg=Array.prototype.slice.call(arguments)
            // 返回一個新函數(shù)
            return function () {
              // 綁定上下文并傳參
              self.apply(context, Array.prototype.concat.call(arg, Array.prototype.slice.call(arguments)))
            }
          }

          7. 手寫實現(xiàn)4種繼承

           <p style="font-size: 20px">      123      <p style="font-size: 2em;width: 2em">456</p> </p>// 此時子元素的font-size為40px, 寬度為80px(還要乘以子元素font-size的系數(shù))

          8. css菊花圖

          四個小圓點一直旋轉(zhuǎn)

          // 父標(biāo)簽
          animation: antRotate 1.2s infinite linear;
          // 子標(biāo)簽
          animation: antSpin 1s infinite linear;
          @keyframe antSpin {
            to {
              opacity: 1
            }
          }
          @keyframe antRotate {
            to {
              transform: rotate(405)
            }
          }
          // animation-delay: 逐個延遲0.4s

          9. http狀態(tài)碼

          • 1**: 服務(wù)器收到請求, 需請求者進(jìn)一步操作
          • 2**: 請求成功
          • 3**: 重定向, 資源被轉(zhuǎn)移到其他URL了
          • 4**: 客戶端錯誤, 請求語法錯誤或沒有找到相應(yīng)資源
          • 5**: 服務(wù)端錯誤, server error
          • 304: Not Modified. 指定日期后未修改, 不返回資源

          10. Object.create實現(xiàn)(原型式繼承,特點:實例的proto指向構(gòu)造函數(shù)本身)

          11. async和await:

          • Generator函數(shù)的語法糖,將*改成async,將yield換成await。
          • 是對Generator函數(shù)的改進(jìn), 返回promise。
          • 異步寫法同步化,遇到await先返回,執(zhí)行完異步再執(zhí)行接下來的.
          • 內(nèi)置執(zhí)行器, 無需next()

          12. 算法和數(shù)據(jù)結(jié)構(gòu):

          • 算法:
            解決具體問題所需要的解決方法。執(zhí)行效率最快的最優(yōu)算法。時間復(fù)雜度。輸入,輸出,有窮性,確定性,可行性。冒泡排序,二叉樹遍歷,最長回文,二分查找,指針,鏈表等,堆棧,隊列等。力扣,codewar,算法導(dǎo)論。
          • 數(shù)據(jù)結(jié)構(gòu):
            邏輯結(jié)構(gòu):集合、線性、樹形、圖形結(jié)構(gòu)
            物理結(jié)構(gòu):順序、鏈?zhǔn)酱鎯Y(jié)構(gòu)

          13. 封裝JSONP

          function jsonp ({url, param, callback}) {
            return new Promise((resolve, reject)=> {
              var script=document.createElement('script')
              window.callback=function (data) {
                resolve(data)
                document.body.removeChild('script')
              }
              var param={...param, callback}
              var arr=[]
              for (let key in param) {
                arr.push(`${key}=${param[key]}`)
              }
              script.src=`${url}?${arr.join('&')}`
              document.body.appendChild(script)
            })
          }

          14. 手動實現(xiàn)map(forEach以及filter也類似)

          // for循環(huán)實現(xiàn)
          Array.prototype.myMap=function () {
            var arr=this
            var [fn, thisValue]=Array.prototype.slice.call(arguments)
            var result=[]
            for (var i=0; i < arr.length; i++) {
              result.push(fn.call(thisValue, arr[i], i, arr))
            }
            return result
          }
          var arr0=[1, 2, 3]
          console.log(arr0.myMap(v=> v + 1))
          
          // forEach實現(xiàn)(reduce類似)
          Array.prototype.myMap=function (fn, thisValue) {
            var result=[]
            this.forEach((v, i, arr)=> {
              result.push(fn.call(thisValue, v, i, arr))
            })
            return result
          }
          var arr0=[1, 2, 3]
          console.log(arr0.myMap(v=> v + 1))

          15. js實現(xiàn)checkbox全選以及反選

          <body>
              <button id="other">反選</button>
              <input type="checkbox" id="all" />全選
              <input type="checkbox" class="check" />1
              <input type="checkbox" class="check" />2
              <input type="checkbox" class="check" />3
              <script>
                var checkbox=document.getElementsByClassName('check')
                var checkAll=document.getElementById('all')
                var checkOther=document.getElementById('other')
                checkAll.onclick=function() {
                  var flag=true
                  for (var i=0; i < checkbox.length; i++) {
                    if (!checkbox[i].checked) flag=false
                  }
                  if (flag) {
                    for (var i=0; i < checkbox.length; i++) {
                      checkbox[i].checked=false
                    }
                  } else {
                    for (var i=0; i < checkbox.length; i++) {
                      checkbox[i].checked=true
                    }
                  }
                }
                checkOther.onclick=function() {
                  for (var i=0; i < checkbox.length; i++) {
                    checkbox[i].checked=!checkbox[i].checked
                  }
                }
          </script>
            </body>

          16. 對原型鏈的理解?prototype上都有哪些屬性

          • 在js里,繼承機(jī)制是原型繼承。繼承的起點是 對象的原型(Object prototype)。
          • 一切皆為對象,只要是對象,就會有 proto 屬性,該屬性存儲了指向其構(gòu)造的指針。
          • Object prototype也是對象,其 proto 指向null。
          • 對象分為兩種:函數(shù)對象和普通對象,只有函數(shù)對象擁有『原型』對象(prototype)。
          • prototype的本質(zhì)是普通對象。
          • Function prototype比較特殊,是沒有prototype的函數(shù)對象。
          • new操作得到的對象是普通對象。
          • 當(dāng)調(diào)取一個對象的屬性時,會先在本身查找,若無,就根據(jù) proto 找到構(gòu)造原型,若無,繼續(xù)往上找。最后會到達(dá)頂層Object prototype,它的 proto 指向null,均無結(jié)果則返回undefined,結(jié)束。
          • 由 proto 串起的路徑就是『原型鏈』。
          • 通過prototype可以給所有子類共享屬性

          17. 為什么使用繼承

          通常在一般的項目里不需要,因為應(yīng)用簡單,但你要用純js做一些復(fù)雜的工具或框架系統(tǒng)就要用到了,比如webgis、或者js框架如jquery、ext什么的,不然一個幾千行代碼的框架不用繼承得寫幾萬行,甚至還無法維護(hù)。

          18. setTimeout時間延遲為何不準(zhǔn)

          單線程, 先執(zhí)行同步主線程, 再執(zhí)行異步任務(wù)隊列

          19. 事件循環(huán)述,宏任務(wù)和微任務(wù)有什么區(qū)別?

          • 先主線程后異步任務(wù)隊列
          • 先微任務(wù)再宏任務(wù)

          20. let const var作用域

          塊級作用域, 暫時性死區(qū)

          21. 節(jié)流和防抖

          • 函數(shù)節(jié)流是指一定時間內(nèi)js方法只跑一次。比如人的眨眼睛,就是一定時間內(nèi)眨一次。這是函數(shù)節(jié)流最形象的解釋。
          // 函數(shù)節(jié)流   滾動條滾動
          var canRun=true;
          document.getElementById("throttle").onscroll=function(){
              if(!canRun){
                  // 判斷是否已空閑,如果在執(zhí)行中,則直接return
                  return;
              }
          
              canRun=false;
              setTimeout(function(){
                  console.log("函數(shù)節(jié)流");
                  canRun=true;
              }, 300);
          };
          • 函數(shù)防抖是指頻繁觸發(fā)的情況下,只有足夠的空閑時間,才執(zhí)行代碼一次。比如生活中的坐公交,就是一定時間內(nèi),如果有人陸續(xù)刷卡上車,司機(jī)就不會開車。只有別人沒刷卡了,司機(jī)才開車。
          // 函數(shù)防抖
          var timer=false;
          document.getElementById("debounce").onscroll=function(){
              clearTimeout(timer); // 清除未執(zhí)行的代碼,重置回初始化狀態(tài)
          
              timer=setTimeout(function(){
                  console.log("函數(shù)防抖");
              }, 300);
          };

          22. 實現(xiàn)一個sleep函數(shù)

          // 這種實現(xiàn)方式是利用一個偽死循環(huán)阻塞主線程。因為JS是單線程的。所以通過這種方式可以實現(xiàn)真正意義上的sleep()。
          function sleep(delay) {
            var start=(new Date()).getTime();
            while ((new Date()).getTime() - start < delay) {
              continue;
            }
          }
          
          function test() {
            console.log('111');
            sleep(2000);
            console.log('222');
          }
          
          test()

          23. 閉包

          • 概念: 內(nèi)層函數(shù)能夠訪問外層函數(shù)作用域的變量
          • 缺點: 引起內(nèi)存泄漏(釋放內(nèi)存)
          • 作用:
            • 使用閉包修正打印值
            • 實現(xiàn)柯里化
            • 實現(xiàn)node commonJs 模塊化, 實現(xiàn)私有變量
            • 保持變量與函數(shù)活性, 可延遲回收和執(zhí)行

          24. Immutable.js

          Facebook出品, 倡導(dǎo)數(shù)據(jù)的不可變性, 用的最多就是List和Map.

          25. js實現(xiàn)instanceof

          // 檢測l的原型鏈(__proto__)上是否有r.prototype,若有返回true,否則false
          function myInstanceof (l, r) {
            var R=r.prototype
            while (l.__proto__) {
              if (l.__proto__===R) return true
            }
            return false
          }

          27. ES6的模塊引入和CommonJs區(qū)別

          28. 嚴(yán)格模式

          // 嚴(yán)格模式下, 隱式綁定丟失后this不會指向window, 而是指向undefined
                'use strict'
                var a=2
                var obj={
                  a: 1,
                  b: function() {
                    // console.log(this.a)
                    console.log(this)
                  }
                }
                var c=obj.b
                c() // undefined

          29. fetch, axios區(qū)別

          30. typescript缺點

          • 并不是嚴(yán)格意義的js的超集, 與js不完全兼容, 會報錯
          • 更多的限制, 是一種桎梏
          • 有些js第三方庫沒有dts, 有問題

          31. 構(gòu)造函數(shù)實現(xiàn)原理

          • 構(gòu)造函數(shù)中沒有顯示的創(chuàng)建Object對象, 實際上后臺自動創(chuàng)建了
          • 直接給this對象賦值屬性和方法, this即指向創(chuàng)建的對象
          • 沒有return返回值, 后臺自動返回了該對象
          // 模擬構(gòu)造函數(shù)實現(xiàn)
          var Book=function(name) {
                    this.name=name;
                  };
          
                  //正常用法
                  var java=new Book(‘Master Java’);
          
                  //使用代碼模擬,在非IE瀏覽器中測試,IE瀏覽器不支持
                  var python={};
                  python.__proto__=Book.prototype;
                  Book.call(python, 'Master Python');

          32. for in 和 for of區(qū)別

          • for in遍歷數(shù)組會遍歷到數(shù)組原型上的屬性和方法, 更適合遍歷對象
          • forEach不支持break, continue, return等
          • 使用for of可以成功遍歷數(shù)組的值, 而不是索引, 不會遍歷原型
          • for in 可以遍歷到myObject的原型方法method,如果不想遍歷原型方法和屬性的話,可以在循環(huán)內(nèi)部判斷一下,hasOwnPropery方法可以判斷某屬性是否是該對象的實例屬性

          33. JS實現(xiàn)并發(fā)控制:

          使用消息隊列以及setInterval或promise進(jìn)行入隊和出隊

          34. ajax和axios、fetch的區(qū)別

          35. promise.finally實現(xiàn)

          Promise.prototype.finally=function (callback) {
            let P=this.constructor;
            return this.then(
              value=> P.resolve(callback()).then(()=> value),
              reason=> P.resolve(callback()).then(()=> { throw reason })
            );
          };

          瀏覽器網(wǎng)絡(luò)相關(guān)

          1. reflow(回流)和repaint(重繪)優(yōu)化

          • 瀏覽器渲染過程: DOM tree, CSS tree --> Render tree --> Paint
          • DOM tree根節(jié)點為html
          • 渲染從瀏覽器左上角到右下角
          • 第一次打開頁面至少觸發(fā)一次重繪和回流, 結(jié)構(gòu)如寬高位置變化時, 觸發(fā)reflow回流;非結(jié)構(gòu)如背景色變化時, 觸發(fā)repaint重繪. 二者都會造成體驗不佳
          • 如何減少重繪和回流?
            • 通過classname或cssText一次性修改樣式, 而非一個一個改
            • 離線模式: 克隆要操作的結(jié)點, 操作后再與原始結(jié)點交換, 類似于虛擬DOM
            • 避免頻繁直接訪問計算后的樣式, 而是先將信息保存下來
            • 絕對布局的DOM, 不會造成大量reflow
            • p不要嵌套太深, 不要超過六層

          2.一個頁面從輸入 URL 到頁面加載顯示完成,這個過程中都發(fā)生了什么?

          • 瀏覽器根據(jù)請求的URL交給DNS域名解析,找到真實IP,向服務(wù)器發(fā)起請求;
          • 服務(wù)器交給后臺處理完成后返回數(shù)據(jù),瀏覽器接收文件(HTML、JS、CSS、圖象等);
          • 瀏覽器對加載到的資源(HTML、JS、CSS等)進(jìn)行語法解析,建立相應(yīng)的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(如HTML的DOM Tree);
          • 載入解析到的資源文件,渲染頁面,完成。

          3.localStorage 與 sessionStorage 與cookie的區(qū)別總結(jié)

          • 共同點: 都保存在瀏覽器端, 且同源
          • localStorage 與 sessionStorage 統(tǒng)稱webStorage,保存在瀏覽器,不參與服務(wù)器通信,大小為5M
          • 生命周期不同: localStorage永久保存, sessionStorage當(dāng)前會話, 都可手動清除
          • 作用域不同: 不同瀏覽器不共享local和session, 不同會話不共享session
          • Cookie: 設(shè)置的過期時間前一直有效, 大小4K.有個數(shù)限制, 各瀏覽器不同, 一般為20個.攜帶在HTTP頭中, 過多會有性能問題.可自己封裝, 也可用原生

          4.瀏覽器如何阻止事件傳播,阻止默認(rèn)行為

          • 阻止事件傳播(冒泡): e.stopPropagation()
          • 阻止默認(rèn)行為: e.preventDefault()

          5.虛擬DOM方案相對原生DOM操作有什么優(yōu)點,實現(xiàn)上是什么原理?

          虛擬DOM可提升性能, 無須整體重新渲染, 而是局部刷新.
          JS對象, diff算法

          6.瀏覽器事件機(jī)制中事件觸發(fā)三個階段

          • 事件捕獲階段: 從dom樹節(jié)點往下找到目標(biāo)節(jié)點, 不會觸發(fā)函數(shù)
          • 事件目標(biāo)處理函數(shù): 到達(dá)目標(biāo)節(jié)點
          • 事件冒泡: 最后從目標(biāo)節(jié)點往頂層元素傳遞, 通常函數(shù)在此階段執(zhí)行.
            addEventListener第三個參數(shù)默認(rèn)false(冒泡階段執(zhí)行),true(捕獲階段執(zhí)行).
            阻止冒泡見以上方法


          7.什么是跨域?為什么瀏覽器要使用同源策略?你有幾種方式可以解決跨域問題?了解預(yù)檢請求嗎?

          • 跨域是指一個域下的文檔或腳本試圖去請求另一個域下的資源
          • 防止XSS、CSFR等攻擊, 協(xié)議+域名+端口不同
          • jsonp; 跨域資源共享(CORS)(Access control); 服務(wù)器正向代理等

          • 預(yù)檢請求: 需預(yù)檢的請求要求必須首先使用 OPTIONS 方法發(fā)起一個預(yù)檢請求到服務(wù)器,以獲知服務(wù)器是否允許該實際請求。"預(yù)檢請求“的使用,可以避免跨域請求對服務(wù)器的用戶數(shù)據(jù)產(chǎn)生未預(yù)期的影響

          8.了解瀏覽器緩存機(jī)制嗎?

          • 瀏覽器緩存就是把一個已經(jīng)請求過的資源拷貝一份存儲起來,當(dāng)下次需要該資源時,瀏覽器會根據(jù)緩存機(jī)制決定直接使用緩存資源還是再次向服務(wù)器發(fā)送請求.
          • from memory cache ; from disk cache
          • 作用: 減少網(wǎng)絡(luò)傳輸?shù)膿p耗以及降低服務(wù)器壓力。
          • 優(yōu)先級: 強(qiáng)制緩存 > 協(xié)商緩存; cache-control > Expires > Etag > Last-modified

          9.為什么操作 DOM 慢?

          DOM本身是一個js對象, 操作這個對象本身不慢, 但是操作后觸發(fā)了瀏覽器的行為, 如repaint和reflow等瀏覽器行為, 使其變慢

          10.什么情況會阻塞渲染?

          • js腳本同步執(zhí)行
          • css和圖片雖然是異步加載, 但js文件執(zhí)行需依賴css, 所以css也會阻塞渲染

          11.如何判斷js運行在瀏覽器中還是node中?

          判斷有無全局對象global和window

          12.關(guān)于web以及瀏覽器處理預(yù)加載有哪些思考?

          圖片等靜態(tài)資源在使用之前就提前請求
          資源使用到的時候能從緩存中加載, 提升用戶體驗
          頁面展示的依賴關(guān)系維護(hù)

          13.http多路復(fù)用

          • Keep-Alive: Keep-Alive解決的核心問題:一定時間內(nèi),同一域名多次請求數(shù)據(jù),只建立一次HTTP請求,其他請求可復(fù)用每一次建立的連接通道,以達(dá)到提高請求效率的問題。這里面所說的一定時間是可以配置的,不管你用的是Apache還是nginx。
          • 解決兩個問題: 串行文件傳輸(采用二進(jìn)制數(shù)據(jù)幀); 連接數(shù)過多(采用流, 并行傳輸)

          14. http和https:

          • http: 最廣泛網(wǎng)絡(luò)協(xié)議,BS模型,瀏覽器高效。
          • https: 安全版,通過SSL加密,加密傳輸,身份認(rèn)證,密鑰
          1. https相對于http加入了ssl層, 加密傳輸, 身份認(rèn)證;
          2. 需要到ca申請收費的證書;
          3. 安全但是耗時多,緩存不是很好;
          4. 注意兼容http和https;
          5. 連接方式不同, 端口號也不同, http是80, https是443

          15. CSRF和XSS區(qū)別及防御

          16. cookie可設(shè)置哪些屬性?httponly?

          chrome控制臺的application下可查看:

          • name  字段為一個cookie的名稱。
          • value  字段為一個cookie的值。
          • domain  字段為可以訪問此cookie的域名。
          • path  字段為可以訪問此cookie的頁面路徑。比如domain是abc.com,path是/test,那么只有/test路徑下的頁面可以讀取此cookie。
          • expires/Max-Age   字段為此cookie超時時間。若設(shè)置其值為一個時間,那么當(dāng)?shù)竭_(dá)此時間后,此cookie失效。不設(shè)置的話默認(rèn)值是Session,意思是cookie會和session一起失效。當(dāng)瀏覽器關(guān)閉(不是瀏覽器標(biāo)簽頁,而是整個瀏覽器) 后,此cookie失效。
          • Size  字段 此cookie大小。
          • http  字段 cookie的httponly屬性。若此屬性為true,則只有在http請求頭中會帶有此cookie的信息,而不能通過document.cookie來訪問此cookie。
          • secure   字段 設(shè)置是否只能通過https來傳遞此條cookie

          17. 登錄后,前端做了哪些工作,如何得知已登錄

          • 前端存放服務(wù)端下發(fā)的cookie, 簡單說就是寫一個字段在cookie中表明已登錄, 并設(shè)置失效日期
          • 或使用后端返回的token, 每次ajax請求將token攜帶在請求頭中, 這也是防范csrf的手段之一

          18. http狀態(tài)碼

          • 1**: 服務(wù)器收到請求, 需請求者進(jìn)一步操作
          • 2**: 請求成功
          • 3**: 重定向, 資源被轉(zhuǎn)移到其他URL了
          • 4**: 客戶端錯誤, 請求語法錯誤或沒有找到相應(yīng)資源
          • 5**: 服務(wù)端錯誤, server error
          • 301: 資源(網(wǎng)頁等)被永久轉(zhuǎn)移到其他URL, 返回值中包含新的URL, 瀏覽器會自動定向到新URL
          • 302: 臨時轉(zhuǎn)移. 客戶端應(yīng)訪問原有URL
          • 304: Not Modified. 指定日期后未修改, 不返回資源
          • 403: 服務(wù)器拒絕執(zhí)行請求
          • 404: 請求的資源(網(wǎng)頁等)不存在
          • 500: 內(nèi)部服務(wù)器錯誤

          19. # Http請求頭緩存設(shè)置方法

          Cache-control, expire, last-modify

          20. 實現(xiàn)頁面回退刷新

          • 舊: window.history.back() + window.location.href=document.referrer;
          • 新: HTML5的新API擴(kuò)展了window.history,使歷史記錄點更加開放了。可以存儲當(dāng)前歷史記錄點、替換當(dāng)前歷史記錄點、監(jiān)聽歷史記錄點onpopstate, replaceState

          21. 正向代理和反向代理

          • 正向代理:

          (1)訪問原來無法訪問的資源,如google
          (2) 可以做緩存,加速訪問資源
          (3)對客戶端訪問授權(quán),上網(wǎng)進(jìn)行認(rèn)證
          (4)代理可以記錄用戶訪問記錄(上網(wǎng)行為管理),對外隱藏用戶信息

          • 反向代理:

          (1)保證內(nèi)網(wǎng)的安全,可以使用反向代理提供WAF功能,阻止web攻擊大型網(wǎng)站,通常將反向代理作為公網(wǎng)訪問地址,Web服務(wù)器是內(nèi)網(wǎng)。

          (2)負(fù)載均衡,通過反向代理服務(wù)器來優(yōu)化網(wǎng)站的負(fù)載


          22. 關(guān)于預(yù)檢請求

          在非簡單請求且跨域的情況下,瀏覽器會自動發(fā)起options預(yù)檢請求。

          23. 三次握手四次揮手

          • 開啟連接用三次握手, 關(guān)閉用四次揮手

          24. TCP和UDP協(xié)議

          • TCP(Transmission Control Protocol:傳輸控制協(xié)議;面向連接,可靠傳輸
          • UDP(User Datagram Protocol):用戶數(shù)據(jù)報協(xié)議;面向無連接,不可靠傳輸

          25. 進(jìn)程和線程的區(qū)別

          • 進(jìn)程:是并發(fā)執(zhí)行的程序在執(zhí)行過程中分配和管理資源的基本單位,是一個動態(tài)概念,競爭計算機(jī)系統(tǒng)資源的基本單位。
          • 線程:是進(jìn)程的一個執(zhí)行單元,是進(jìn)程內(nèi)科調(diào)度實體。比進(jìn)程更小的獨立運行的基本單位。線程也被稱為輕量級進(jìn)程。
          • 一個程序至少一個進(jìn)程,一個進(jìn)程至少一個線程。

          vue相關(guān)

          1. 生命周期

          2 .雙向數(shù)據(jù)綁定v-model。這個最好也是自己實現(xiàn)一下 理解更深

          通過v-model
          VUE實現(xiàn)雙向數(shù)據(jù)綁定的原理就是利用了 Object.defineProperty() 這個方法重新定義了對象獲取屬性值(get)和設(shè)置屬性值(set)的操作來實現(xiàn)的。

          function* helloWorldGenerator() {  yield 'hello';  yield 'world';  return 'ending';}var hw=helloWorldGenerator();

          3.vue父子組件傳遞參數(shù)

          • 父 -->子: 通過props
          • 子 -->父: 通過 $$refs 或 $emit

          4.vue傳遞參數(shù)方法

          • 父子組件傳參如上, v-bind : v-on @
          • 兄弟組件傳參:(通過EventBus事件總線實現(xiàn))
          hw.next()// { value: 'hello', done: false }hw.next()// { value: 'world', done: false }hw.next()// { value: 'ending', done: true }hw.next()// { value: undefined, done: true }

          5.vue自定義組件

          可以使用獨立可復(fù)用的自定義組件來構(gòu)成大型應(yīng)用, 采用帕斯卡命名法或橫線連接, 通過以上方式進(jìn)行組件間通信. 每一個組件都是Vue實例, 可以使用生命周期鉤子.

          6. vue自定義指令

          • 除核心指令之外的指令, 使用directive進(jìn)行注冊.
          • 指令自定義鉤子函數(shù): bind, inserted, update, componentUpdated, unbind

          7.vuex組成和原理

          • 組成: 組件間通信, 通過store實現(xiàn)全局存取
          • 修改: 唯一途徑, 通過commit一個mutations(同步)或dispatch一個actions(異步)
          • 簡寫: 引入mapState、mapGetters、mapActions

          8.vue-router的原理,例如hashhistory和History interface這些東西要弄明白。其實看一下源碼就好了,看不懂可以直接看解析的相關(guān)技術(shù)博客。

          • vue-router用法:
            在router.js或者某一個路由分發(fā)頁面配置path, name, component對應(yīng)關(guān)系
            • 每個按鈕一個value, 在watch功能中使用this.$router.push實現(xiàn)對應(yīng)跳轉(zhuǎn), 類似react的this.history.push
            • 或直接用router-link to去跳轉(zhuǎn), 類似react的link to
          • vue-router原理: 通過hash和History interface兩種方式實現(xiàn)前端路由
            • HashHistory: 利用URL中的hash(“#”);replace()方法與push()方法不同之處在于,它并不是將新路由添加到瀏覽器訪問歷史的棧頂,而是替換掉當(dāng)前的路由
            • History interface: 是瀏覽器歷史記錄棧提供的接口,通過back(), forward(), go()等方法,我們可以讀取瀏覽器歷史記錄棧的信息,進(jìn)行各種跳轉(zhuǎn)操作. pushState(), replaceState() 這下不僅是讀取了,還可以對瀏覽器歷史記錄棧進(jìn)行修改

          9.vue的seo問題

          seo關(guān)系到網(wǎng)站排名, vue搭建spa做前后端分離不好做seo, 可通過其他方法解決:

          • SSR服務(wù)端渲染: 將同一個組件渲染為服務(wù)器端的 HTML 字符串.利于seo且更快.
          • vue-meta-info, nuxt, prerender-spa-plugin頁面預(yù)渲染等

          10.預(yù)渲染和ssr
          以上

          11.生命周期內(nèi)create和mounted的區(qū)別

          • created: 在模板渲染成html前調(diào)用,即通常初始化某些數(shù)據(jù),然后再渲染成視圖。
          • mounted: 在模板渲染成html后調(diào)用,通常是初始化頁面完成后,再對html的dom節(jié)點進(jìn)行一些需要的操作和方法。

          12.監(jiān)聽watch

          對應(yīng)一個對象,鍵是觀察表達(dá)式,值是對應(yīng)回調(diào)。值也可以是methods的方法名,或者是對象,包含選項。在實例化時為每個鍵調(diào)用 $watch()

          13.登錄驗證攔截(通過router)

          • 先設(shè)置requireAuth:
          var myPromise=new Promise((resolve, reject)=> {  // 需要執(zhí)行的代碼  ...  if (/* 異步執(zhí)行成功 */) {    resolve(value)  } else if (/* 異步執(zhí)行失敗 */) {    reject(error)  }})myPromise.then((value)=> {  // 成功后調(diào)用, 使用value值}, (error)=> {  // 失敗后調(diào)用, 獲取錯誤信息error})
          • 再配置router.beforeEach:
          router.beforeEach((from, to, next)=> {
              if (to.meta.requireAuth) { // 判斷跳轉(zhuǎn)的路由是否需要登錄
                  if (store.state.token) { // vuex.state判斷token是否存在
                      next() // 已登錄
                  } else {
                      next({
                          path: '/login',
                          query: {redirect: to.fullPath} // 將跳轉(zhuǎn)的路由path作為參數(shù),登錄成功后跳轉(zhuǎn)到該路由
                      })
                  }
              } else {
                 next()
              }
          })

          14. v-for key值

          不寫key值會報warning, 和react的array渲染類似. 根據(jù)diff算法, 修改數(shù)組后, 寫key值會復(fù)用, 不寫會重新生成, 造成性能浪費或某些不必要的錯誤

          15. vue3.0的更新和defineProperty優(yōu)化

          • 放棄 Object.defineProperty ,使用更快的原生 Proxy (訪問對象攔截器, 也成代理器)
          • 提速, 降低內(nèi)存使用, Tree-shaking更友好
          • 支持IE11等
          • 使用Typescript

          15. vue使用this獲取變量

          正常要通過vm.[圖片上傳失敗...(image-6d2f4e-1570591304185)]

          root傳參取值

          16. jQuery的優(yōu)缺點,與vue的不同,vue的優(yōu)缺點?

          • jq優(yōu)點: 比原生js更易書寫, 封裝了很多api, 有豐富的插件庫; 缺點: 每次升級與之前版本不兼容, 只能手動開發(fā), 操作DOM很慢, 不方便, 變量名污染, 作用域混淆等。
          • vue優(yōu)缺點: 雙向綁定, 虛擬DOM, diff算法, MVVM, 組件化, 通信方便, 路由分發(fā)等

          17. vue解除雙向綁定

          function promise () {  this.msg='' // 存放value和error  this.status='pending'  var that=this  var process=arguments[0]  process (function () {    that.status='fulfilled'    that.msg=arguments[0]  }, function () {    that.status='rejected'    that.msg=arguments[0]  })  return this}promise.prototype.then=function () {  if (this.status==='fulfilled') {    arguments[0](this.msg)  } else if (this.status==='rejected' && arguments[1]) {    arguments[1](this.msg)  }}

          18. vue異步組件

          為了簡化,Vue 允許你以一個工廠函數(shù)的方式定義你的組件,這個工廠函數(shù)會異步解析你的組件定義。Vue 只有在這個組件需要被渲染的時候才會觸發(fā)該工廠函數(shù),且會把結(jié)果緩存起來供未來重渲染

          Vue.component(
            'async-webpack-example',
            // 這個 `import` 函數(shù)會返回一個 `Promise` 對象。
            ()=> import('./my-async-component')
          )

          19. MVC與MVVM

          • model-數(shù)據(jù)層 view-視圖層 controller-控制層
          • MVC的目的是實現(xiàn)M和V的分離,單向通信,必須通過C來承上啟下
          • MVVM中通過VM(vue中的實例化對象)的發(fā)布者-訂閱者模式實現(xiàn)雙向綁定,數(shù)據(jù)綁定,dom事件監(jiān)聽
          • 區(qū)別:MVC和MVVM的區(qū)別并不是VM完全取代了C,ViewModel存在目的在于抽離Controller中展示的業(yè)務(wù)邏輯,而不是替代Controller,其它視圖操作業(yè)務(wù)等還是應(yīng)該放在Controller中實現(xiàn)。也就是說MVVM實現(xiàn)的是業(yè)務(wù)邏輯組件的重用

          20. vue漸進(jìn)式

          小到可以只使用核心功能,比如單文件組件作為一部分嵌入;大到使用整個工程,vue init webpack my-project來構(gòu)建項目;VUE的核心庫及其生態(tài)系統(tǒng)也可以滿足你的各式需求(core+vuex+vue-route)

          react相關(guān)

          1. 新舊生命周期

          • 舊: will, did; mount, update...
          • 新: 16版本之后:
            • getDerivedStateFromProps: 虛擬dom之后,實際dom掛載之前, 每次獲取新的props或state之后, 返回新的state, 配合didUpdate可以替代willReceiveProps
            • getSnapshotBeforeUpdate: update發(fā)生的時候,組件更新前觸發(fā), 在render之后,在組件dom渲染之前;返回一個值,作為componentDidUpdate的第三個參數(shù);配合componentDidUpdate, 可以覆蓋componentWillUpdate的所有用法
            • componentDidCatch: 錯誤處理
          • 對比: 棄用了三個will, 新增兩個get來代替will, 不能混用, 17版本會徹底刪除. 新增錯誤處理

          2. react核心

          • 虛擬DOM, Diff算法, 遍歷key值
          • react-dom: 提供了針對DOM的方法,比如:把創(chuàng)建的虛擬DOM,渲染到頁面上 或 配合ref來操作DOM
          • react-router

          3. fiber核心(react 16)

          • 舊: 瀏覽器渲染引擎單線程, 計算DOM樹時鎖住整個線程, 所有行為同步發(fā)生, 有效率問題, 期間react會一直占用瀏覽器主線程,如果組件層級比較深,相應(yīng)的堆棧也會很深,長時間占用瀏覽器主線程, 任何其他的操作(包括用戶的點擊,鼠標(biāo)移動等操作)都無法執(zhí)行。
          • 新: 重寫底層算法邏輯, 引入fiber時間片, 異步渲染, react會在渲染一部分樹后檢查是否有更高優(yōu)先級的任務(wù)需要處理(如用戶操作或繪圖), 處理完后再繼續(xù)渲染, 并可以更新優(yōu)先級, 以此管理渲染任務(wù). 加入fiber的react將組件更新分為兩個時期(phase 1 && phase 2),render前的生命周期為phase1,render后的生命周期為phase2, 1可以打斷, 2不能打斷一次性更新. 三個will生命周期可能會重復(fù)執(zhí)行, 盡量避免使用。

          4. 渲染一個react

          • 分為首次渲染和更新渲染
          • 生命周期, 建立虛擬DOM, 進(jìn)行diff算法
          • 對比新舊DOM, 節(jié)點對比, 將算法復(fù)雜度從O(n^3)降低到O(n)
          • key值優(yōu)化, 避免用index作為key值, 兄弟節(jié)點中唯一就行

          5. 高階組件

          高階組件就是一個函數(shù),且該函數(shù)(wrapper)接受一個組件作為參數(shù),并返回一個新的組件。
          高階組件并不關(guān)心數(shù)據(jù)使用的方式和原因,而被包裹的組件也不關(guān)心數(shù)據(jù)來自何處.

          • react-dnd: 根組件, source, target等export default DragSource(type, spec, collect)(MyComponent)
          • 重構(gòu)代碼庫使用HOC提升開發(fā)效率

          6. hook(v16.7測試)

          在無狀態(tài)組件(如函數(shù)式組件)中也能操作state以及其他react特性, 通過useState

          7. redux和vuex以及dva:

          • redux: 通過store存儲,通過action唯一更改,reducer描述如何更改。dispatch一個action
          • dva: 基于redux,結(jié)合redux-saga等中間件進(jìn)行封裝
          • vuex:類似dva,集成化。action異步,mutation非異步

          8. react和vue的區(qū)別

          • 數(shù)據(jù)是否可變: react整體是函數(shù)式的思想,把組件設(shè)計成純組件,狀態(tài)和邏輯通過參數(shù)傳入,所以在react中,是單向數(shù)據(jù)流,推崇結(jié)合immutable來實現(xiàn)數(shù)據(jù)不可變; vue的思想是響應(yīng)式的,也就是基于是數(shù)據(jù)可變的,通過對每一個屬性建立Watcher來監(jiān)聽,當(dāng)屬性變化的時候,響應(yīng)式的更新對應(yīng)的虛擬dom。總之,react的性能優(yōu)化需要手動去做,而vue的性能優(yōu)化是自動的,但是vue的響應(yīng)式機(jī)制也有問題,就是當(dāng)state特別多的時候,Watcher也會很多,會導(dǎo)致卡頓,所以大型應(yīng)用(狀態(tài)特別多的)一般用react,更加可控。
          • 通過js來操作一切,還是用各自的處理方式: react的思路是all in js,通過js來生成html,所以設(shè)計了jsx,還有通過js來操作css,社區(qū)的styled-component、jss等; vue是把html,css,js組合到一起,用各自的處理方式,vue有單文件組件,可以把html、css、js寫到一個文件中,html提供了模板引擎來處理。
          • 類式的組件寫法,還是聲明式的寫法: react是類式的寫法,api很少; 而vue是聲明式的寫法,通過傳入各種options,api和參數(shù)都很多。所以react結(jié)合typescript更容易一起寫,vue稍微復(fù)雜。
          • 擴(kuò)展不同: react可以通過高階組件(Higher Order Components--HOC)來擴(kuò)展,而vue需要通過mixins來擴(kuò)展。
          • 什么功能內(nèi)置,什么交給社區(qū)去做: react做的事情很少,很多都交給社區(qū)去做,vue很多東西都是內(nèi)置的,寫起來確實方便一些,
            比如 redux的combineReducer就對應(yīng)vuex的modules,
            比如reselect就對應(yīng)vuex的getter和vue組件的computed,
            vuex的mutation是直接改變的原始數(shù)據(jù),而redux的reducer是返回一個全新的state,所以redux結(jié)合immutable來優(yōu)化性能,vue不需要。

          9. react單向數(shù)據(jù)流怎么理解

          React是單向數(shù)據(jù)流,數(shù)據(jù)主要從父節(jié)點傳遞到子節(jié)點(通過props)。如果頂層(父級)的某個props改變了,React會重渲染所有的子節(jié)點。

          10. React算法復(fù)雜度優(yōu)化

          react樹對比是按照層級去對比的, 他會給樹編號0,1,2,3,4.... 然后相同的編號進(jìn)行比較。所以復(fù)雜度是n,這個好理解。

          關(guān)鍵是傳統(tǒng)diff的復(fù)雜度是怎么算的?傳統(tǒng)的diff需要出了上面的比較之外,還需要跨級比較。他會將兩個樹的節(jié)點,兩兩比較,這就有n^2的復(fù)雜度了。然后還需要編輯樹,編輯的樹可能發(fā)生在任何節(jié)點,需要對樹進(jìn)行再一次遍歷操作,因此復(fù)雜度為n。加起來就是n^3了。

          11. React優(yōu)點

          聲明式, 組件化, 一次學(xué)習(xí), 隨處編寫. 靈活, 豐富, 輕巧, 高效

          移動端相關(guān)

          1. 移動端兼容適配

          • <meta name="viewport" content="width=device-width, initial-scale=1.0">
          • rem, em, 百分比
          • 框架的柵格布局
          • media query媒體查詢
          • 手淘團(tuán)隊的一套flexible.js, 自動判斷dpr進(jìn)行整個布局視口的放縮

          2. flexible如何實現(xiàn)自動判斷dpr

          判斷機(jī)型, 找出樣本機(jī)型去適配. 比如iphone以6為樣本, 寬度375px, dpr是2

          3. 為什么以iPhone6為標(biāo)準(zhǔn)的設(shè)計稿的尺寸是以750px寬度來設(shè)計的呢?

          iPhone6的滿屏寬度是375px,而iPhone6采用的視網(wǎng)膜屏的物理像素是滿屏寬度的2倍,也就是dpr(設(shè)備像素比)為2, 并且設(shè)計師所用的PS設(shè)計軟件分辨率和像素關(guān)系是1:1。所以為了做出的清晰的頁面,設(shè)計師一般給出750px的設(shè)計圖,我們再根據(jù)需求對元素的尺寸設(shè)計和壓縮。

          4. 如何處理異形屏iphone X

          • safe area: 默認(rèn)放置在安全區(qū)域以避免遮擋, 但會壓縮
          • 在meta中添加viewport-fit=cover: 告訴瀏覽器要講整個頁面渲染到瀏覽器中,不管設(shè)備是圓角與否,這個時候會造成頁面的元素被圓角遮擋
          • padding: constant(env): 解決遮擋問題

          5. 移動端首屏優(yōu)化

          • 采用服務(wù)器渲染ssr
          • 按需加載配合webpack分塊打包, 通過entry和commonChunkPlugin
          • 很有必要將script標(biāo)簽?異步
          • 有輪播圖 最好給個默認(rèn) 另外要處理圖片懶加載
          • 打包線上也要注意去掉map 文件
          • 組件, 路由懶加載
          • webpack的一切配置 肯定是必須的
          • 壓縮圖片 tinypng.com/
          • 建議還是用webpack的圖片壓縮插件
          • 骨架屏
          • Loading頁面

          6. PWA全稱Progressive Web App,即漸進(jìn)式WEB應(yīng)用

          一個 PWA 應(yīng)用首先是一個網(wǎng)頁, 可以通過 Web 技術(shù)編寫出一個網(wǎng)頁應(yīng)用. 隨后添加上 App Manifest 和 Service Worker 來實現(xiàn) PWA 的安裝和離線等功能
          解決了哪些問題?

          • 可以添加至主屏幕,點擊主屏幕圖標(biāo)可以實現(xiàn)啟動動畫以及隱藏地址欄
          • 實現(xiàn)離線緩存功能,即使用戶手機(jī)沒有網(wǎng)絡(luò),依然可以使用一些離線功能
          • 實現(xiàn)了消息推送
            它解決了上述提到的問題,這些特性將使得 Web 應(yīng)用漸進(jìn)式接近原生 App。

          7. 離線包方案

          現(xiàn)在 web 頁面在移動端的地位越來越高,大部分主流 App 采用 native + webview 的 hybrid 模式,加載遠(yuǎn)程頁面受限于網(wǎng)絡(luò),本地 webview 引擎,經(jīng)常會出現(xiàn)渲染慢導(dǎo)致的白屏現(xiàn)象,體驗很差,于是離線包方案應(yīng)運而生。動態(tài)下載的離線包可以使得我們不需要走完整的 App 審核發(fā)布流程就完成了版本的更新

          8. 自適應(yīng)和響應(yīng)式布局的區(qū)別

          1. 自適應(yīng)布局通過檢測視口分辨率,來判斷當(dāng)前訪問的設(shè)備是:pc端、平板、手機(jī),從而請求服務(wù)層,返回不同的頁面;響應(yīng)式布局通過檢測視口分辨率,針對不同客戶端在客戶端做代碼處理,來展現(xiàn)不同的布局和內(nèi)容。
          2. 自適應(yīng)布局需要開發(fā)多套界面,而響應(yīng)式布局只需要開發(fā)一套界面就可以了。
          3. 自適應(yīng)對頁面做的屏幕適配是在一定范圍:比如pc端一般要大于1024像素,手機(jī)端要小于768像素。而響應(yīng)式布局是一套頁面全部適應(yīng)。
          4. 自適應(yīng)布局如果屏幕太小會發(fā)生內(nèi)容過于擁擠。而響應(yīng)式布局正是為了解決這個問題而衍生出的概念,它可以自動識別屏幕寬度并做出相應(yīng)調(diào)整的網(wǎng)頁設(shè)計。

          插件及工具相關(guān)

          1. babel和polyfill

          • Babel: Babel 是一個廣泛使用的 ES6 轉(zhuǎn)碼器,可以將 ES6 代碼轉(zhuǎn)為 ES5 代碼。注意:Babel 默認(rèn)只轉(zhuǎn)換新的 JavaScript 句法(syntax),而不轉(zhuǎn)換新的 API
          • Polyfill: Polyfill的準(zhǔn)確意思為,用于實現(xiàn)瀏覽器并不支持的原生API的代碼。

          2. jpg, jpeg和png區(qū)別

          • jpg是jpeg的縮寫, 二者一致
          • PNG就是為取代GIF而生的, 無損壓縮, 占用內(nèi)存多
          • jpg犧牲圖片質(zhì)量, 有損, 占用內(nèi)存小
          • PNG格式可編輯。如圖片中有字體等,可利用PS再做更改。JPG格式不可編輯

          3. git rebase和merge區(qū)別

          前端性能優(yōu)化

          1. 減少HTTP請求(合并css、js,雪碧圖/base64圖片)
          2. 壓縮(css、js、圖片皆可壓縮,使用webpack uglify和 svg)
          3. 樣式表放頭部,腳本放底部
          4. 使用CDN(這部分,不少前端都不用考慮,負(fù)責(zé)發(fā)布的兄弟可能會負(fù)責(zé)搞好)
          5. http緩存
          6. bosify圖片壓縮: 根據(jù)具體情況修改圖片后綴或格式 后端根據(jù)格式來判斷存儲原圖還是縮略圖
          7. 懶加載, 預(yù)加載
          8. 替代方案: 骨架屏, SSR
          9. webpack優(yōu)化

          原生通信

          1.JSBridge通信原理, 有哪幾種實現(xiàn)的方式?

          JsBridge給JavaScript提供了調(diào)用Native功能,Native也能夠操控JavaScript。這樣前端部分就可以方便使用地理位置、攝像頭以及登錄支付等Native能力啦。JSBridge構(gòu)建 Native和非Native間消息通信的通道,而且是 雙向通信的通道。

          • JS 向 Native 發(fā)送消息 : 調(diào)用相關(guān)功能、通知 Native 當(dāng)前 JS 的相關(guān)狀態(tài)等。
          • Native 向 JS 發(fā)送消息 : 回溯調(diào)用結(jié)果、消息推送、通知 JS 當(dāng)前 Native 的狀態(tài)等。

          2.實現(xiàn)一個簡單的 JSBridge,設(shè)計思路?

          算法相關(guān)

          1. 二分查找和冒泡排序

          • 二分查找: 遞歸(分左右, 傳遞start,end參數(shù))和非遞歸(使用while(l < h))
          • 冒泡排序: 兩個for循環(huán)

          2. 快速排序

          Function.prototype.bind=function () {   // 保存原函數(shù)  var self=this  // 取出第一個參數(shù)作為上下文, 相當(dāng)于[].shift.call(arguments)  var context=Array.prototype.shift.call(arguments)  // 取剩余的參數(shù)作為arg; 因為arguments是偽數(shù)組, 所以要轉(zhuǎn)化為數(shù)組才能使用數(shù)組方法  var arg=Array.prototype.slice.call(arguments)  // 返回一個新函數(shù)  return function () {    // 綁定上下文并傳參    self.apply(context, Array.prototype.concat.call(arg, Array.prototype.slice.call(arguments)))  }}

          3. 最長公共子串

          function Father () {}function Child () {}// 1\. 原型繼承Child.prototype=new Father()// 2\. 構(gòu)造繼承function Child (name) {  Father.call(this, name)}// 3\. 組合繼承function Child (name) {  Father.call(this, name)}Child.prototype=new Father()// 4\. 寄生繼承function cloneObj (o) {  var clone=object.create(o)  clone.sayName=...  return clone}// 5\. 寄生組合繼承// 6\. ES6 class extend繼承

          4. 最長公共子序列(LCS動態(tài)規(guī)劃)

          另一篇

          // 父標(biāo)簽animation: antRotate 1.2s infinite linear;// 子標(biāo)簽animation: antSpin 1s infinite linear;@keyframe antSpin {  to {    opacity: 1  }}@keyframe antRotate {  to {    transform: rotate(405)  }}// animation-delay: 逐個延遲0.4s

          5. 數(shù)組去重,多種方法

          • 雙for循環(huán), splice剔除并i--回退
          • indexOf等于index
          • filter indexOf===index
          • 新數(shù)組indexOf===index
          • 使用空對象等

          6. 實現(xiàn)一個函數(shù)功能:sum(1,2,3,4..n)轉(zhuǎn)化為 sum(1)(2)(3)(4)…(n)

          // 使用柯里化 + 遞歸
          function curry ( fn ) {
            var c=(...arg)=> (fn.length===arg.length) ?
                    fn (...arg) : (...arg1)=> c(...arg, ...arg1)
            return c
          }

          7. 反轉(zhuǎn)二叉樹

          var invertTree=function (root) {
            if (root !==null) {
              [root.left, root.right]=[root.right, root.left]
              invertTree(root.left)
              invertTree(root.right)
            }
            return root
          }

          8. 貪心算法解決背包問題

          var items=['A','B','C','D']
          var values=[50,220,60,60]
          var weights=[5,20,10,12]
          var capacity=32 //背包容積
          
          greedy(values, weights, capacity) // 320
          
          function greedy(values, weights, capacity) {
                  var result=0
                  var rest=capacity
                  var sortArray=[]
                  var num=0
                  values.forEach((v, i)=> {
                    sortArray.push({
                      value: v,
                      weight: weights[i],
                      ratio: v / weights[i]
                    })
                  })
                  sortArray.sort((a, b)=> b.ratio - a.ratio)
                  sortArray.forEach((v, i)=> {
                    num=parseInt(rest / v.weight)
                    rest -=num * v.weight
                    result +=num * v.value
                  })
                  return result
                }

          9. 輸入一個遞增排序的數(shù)組和一個數(shù)字S,在數(shù)組中查找兩個數(shù),使得他們的和正好是S,如果有多對數(shù)字的和等于S,輸出兩個數(shù)的乘積最小的。

          function FindNumbersWithSum(array, sum)
          {
              var index=0
              for (var i=0; i < array.length - 1 && array[i] < sum / 2; i++) {
                  for (var j=i + 1; j < array.length; j++) {
                      if (array[i] + array[j]===sum) return [array[i], array[j]]
                  }
                  //index=array.indexOf(sum - array[i], i + 1)
                 // if (index !==-1) {
                 //     return [array[i], array[index]]
                  //}
              }
              return []

          10. 二叉樹各種(層序)遍歷

          深度廣度遍歷

          // 根據(jù)前序和中序重建二叉樹
          /* function TreeNode(x) {
              this.val=x;
              this.left=null;
              this.right=null;
          } */
          function reConstructBinaryTree(pre, vin)
          {
              var result=null
              if (pre.length===1) {
                  result={
                      val: pre[0],
                      left: null,
                      right: null
                  }
              } else if (pre.length > 1) {
                  var root=pre[0]
                  var vinRootIndex=vin.indexOf(root)
                  var vinLeft=vin.slice(0, vinRootIndex)
                  var vinRight=vin.slice(vinRootIndex + 1, vin.length)
                  pre.shift()
                  var preLeft=pre.slice(0, vinLeft.length)
                  var preRight=pre.slice(vinLeft.length, pre.length)
                  result={
                      val: root,
                      left: reConstructBinaryTree(preLeft, vinLeft),
                      right: reConstructBinaryTree(preRight, vinRight)
                  }
              }
              return result
          }
          
          // 遞歸
          // 前序遍歷
          function prevTraverse (node) {
            if (node===null) return;
          
            console.log(node.data);
            prevTraverse(node.left);
            prevTraverse(node.right);
          }
          
          // 中序遍歷
          function middleTraverse (node) {
            if (node===null) return;
          
            middleTraverse(node.left);
            console.log(node.data);
            middleTraverse(node.right);
          }
          
          // 后序遍歷
          function lastTraverse (node) {
            if (node===null) return;
          
            lastTraverse(node.left);
            lastTraverse(node.right);
            console.log(node.data);
          }
          
          // 非遞歸
          // 前序遍歷
          function preTraverse(tree) {
                  var arr=[],
                    node=null
                  arr.unshift(tree)
                  while (arr.length) {
                    node=arr.shift()
                    console.log(node.root)
                    if (node.right) arr.unshift(node.right)
                    if (node.left) arr.unshift(node.left)
                  }
                }
          
          // 中序遍歷
          function middleTraverseUnRecursion (root) {
            let arr=[],
                node=root;
          
            while (arr.length !==0 || node !==null) {
              if (node===null) {
                node=arr.shift();
                console.log(node.data);
                node=node.right;
              } else {
                arr.unshift(node);
                node=node.left;
              }
            }
          
          }
          
          // 廣度優(yōu)先-層序遍歷
          // 遞歸
          var result=[]
          var stack=[tree]
          var count=0
          var bfs=function () {
            var node=stack[count]
            if (node) {
              result.push(node.value)
              if (node.left) stack.push(node.left)
              if (node.right) stack.push(node.right)
              count++
              bfs()
            }
          }
          bfs()
          console.log(result)
          // 非遞歸
          function bfs (node) {
            var result=[]
            var queue=[]
            queue.push(node)
            while (queue.length) {
              node=queue.shift()
              result.push(node.value)
              node.left && queue.push(node.left)
              node.right && queue.push(node.right)
            }
            return result
          }

          11. 各種排序

          // 插入排序
          function insertSort(arr) {
                  var temp
                  for (var i=1; i < arr.length; i++) {
                    temp=arr[i]
                    for (var j=i; j > 0 && temp < arr[j - 1]; j--) {
                      arr[j]=arr[j - 1]
                    }
                    arr[j]=temp
                  }
                  return arr
                }
                console.log(insertSort([3, 1, 8, 2, 5]))
          
          // 歸并排序
          function mergeSort(array) {
                  var result=array.slice(0)
                  function sort(array) {
                    var length=array.length
                    var mid=Math.floor(length * 0.5)
                    var left=array.slice(0, mid)
                    var right=array.slice(mid, length)
                    if (length===1) return array
                    return merge(sort(left), sort(right))
                  }
                  function merge(left, right) {
                    var result=[]
          
                    while (left.length || right.length) {
                      if (left.length && right.length) {
                        if (left[0] < right[0]) {
                          result.push(left.shift())
                        } else {
                          result.push(right.shift())
                        }
                      } else if (left.length) {
                        result.push(left.shift())
                      } else {
                        result.push(right.shift())
                      }
                    }
                    return result
                  }
                  return sort(result)
                }
                console.log(mergeSort([5, 2, 8, 3, 6]))
          
          // 二分插入排序
          function twoSort(array) {
                  var len=array.length,
                    i,
                    j,
                    tmp,
                    low,
                    high,
                    mid,
                    result
                  result=array.slice(0)
                  for (i=1; i < len; i++) {
                    tmp=result[i]
                    low=0
                    high=i - 1
                    while (low <=high) {
                      mid=parseInt((high + low) / 2, 10)
                      if (tmp < result[mid]) {
                        high=mid - 1
                      } else {
                        low=mid + 1
                      }
                    }
                    for (j=i - 1; j >=high + 1; j--) {
                      result[j + 1]=result[j]
                    }
                    result[j + 1]=tmp
                  }
                  return result
                }
                console.log(twoSort([4, 1, 7, 2, 5]))

          12. 使用尾遞歸對斐波那契優(yōu)化

          遞歸非常耗費內(nèi)存,因為需要同時保存成千上百個調(diào)用幀,很容易發(fā)生“棧溢出”錯誤(stack overflow)。但對于尾遞歸來說,由于只存在一個調(diào)用幀,所以永遠(yuǎn)不會發(fā)生“棧溢出”錯誤。

          // 傳統(tǒng)遞歸斐波那契, 會造成超時或溢出
          function Fibonacci (n) {
            if ( n <=1 ) {return 1};
          
            return Fibonacci(n - 1) + Fibonacci(n - 2);
          }
          
          Fibonacci(10) // 89
          Fibonacci(100) // 超時
          Fibonacci(500) // 超時
          
          // 使用尾遞歸優(yōu)化, 可規(guī)避風(fēng)險
          function Fibonacci2 (n , ac1=1 , ac2=1) {
            if( n <=1 ) {return ac2};
          
            return Fibonacci2 (n - 1, ac2, ac1 + ac2);
          }
          
          Fibonacci2(100) // 573147844013817200000
          Fibonacci2(1000) // 7.0330367711422765e+208
          Fibonacci2(10000) // Infinity

          13. 兩個升序數(shù)組合并為一個升序數(shù)組

          function sort (A, B) {
            var i=0, j=0, p=0, m=A.length, n=B.length, C=[]
            while (i < m || j < n) {
              if (i < m && j < n) {
                C[p++]=A[i] < B[j] ? A[i++] : B[j++]
              } else if (i < m) {
                C[p++]=A[i++]
              } else {
                C[p++]=B[j++]
              }
            }
            return C
          }

          node相關(guān)

          1. node的router是什么

          2. 數(shù)據(jù)庫索引是啥

          • 狹義上: 索引是數(shù)據(jù)庫針對每條數(shù)據(jù)自動生成的內(nèi)部唯一id標(biāo)識, 用以快速搜索定位數(shù)據(jù)
          • 廣義上: 是數(shù)據(jù)庫根據(jù)每條數(shù)據(jù)形成的關(guān)鍵字, 將劃分為樹形結(jié)構(gòu), 便于sql語句對數(shù)據(jù)的查找, 使算法復(fù)雜度降低到O(logn)

          3. 瀏覽器的事件循環(huán)和node事件循環(huán)有什么區(qū)別?

          以上就是前端面試題全面整理-帶解析 涵蓋(css、js、瀏覽器、vue、react、移動web、前端性能、算法、node)的詳細(xì)內(nèi)容,更多請關(guān)注html中文網(wǎng)其它相關(guān)文章!


          我是@半糖學(xué)前端 ,專注前端技術(shù)領(lǐng)域分享,一個前端從業(yè)者,關(guān)注我和我一起學(xué)習(xí),共同進(jìn)步!


          主站蜘蛛池模板: 久久精品国产一区二区三 | 波多野结衣一区二区三区| 日本欧洲视频一区| 日韩人妻不卡一区二区三区| 国产成人高清亚洲一区久久| 色狠狠AV一区二区三区| 日韩国产一区二区| 亚洲欧美日韩一区二区三区在线 | 国产激情一区二区三区四区 | 无码AⅤ精品一区二区三区| 99精品国产高清一区二区麻豆| 免费萌白酱国产一区二区三区| 国产一区在线观看免费| 精品人妻AV一区二区三区| 无码视频一区二区三区在线观看| 国产一区二区三区小向美奈子| 极品少妇一区二区三区四区| 国产对白精品刺激一区二区| 91精品一区二区三区在线观看| 日本不卡一区二区三区视频| 久久99精品国产一区二区三区| 亚洲线精品一区二区三区影音先锋| 一区二区三区高清在线| 无码国产亚洲日韩国精品视频一区二区三区| 波多野结衣一区二区| 国产乱人伦精品一区二区在线观看| 国产一区二区久久久| 韩国资源视频一区二区三区| 国产凸凹视频一区二区| 精品乱码一区二区三区在线| 日韩精品一区二区三区视频| 免费在线视频一区| 国产精品成人一区二区| 99久久精品费精品国产一区二区| 久久无码一区二区三区少妇| 国产凹凸在线一区二区| 一区二区三区四区免费视频| 在线精品视频一区二区| 国产成人一区二区三区精品久久| 美女视频黄a视频全免费网站一区 美女免费视频一区二区 | 亚洲av无一区二区三区|