この記事が提供する内容は包括的です。フロントエンドの面接の質問について詳しくまとめられており、困っている友人が参考になれば幸いです。
[関連する推奨事項: フロントエンドの面接の質問(2020)]
1. いくつかの未解決の質問
1. 自己紹介: 面接官は、基本的な個人情報に加えて、あなたのユニークな点や長所を聞きたいと考えています。
2. プロジェクトの紹介
3. フロントエンド開発についてどのように考えていますか?
4. フロントエンド開発を普段どのように学んでいますか?
5. 今後 3 ~ 5 年間の計画は何ですか?
位置の値、相対と絶対は誰を基準にして配置されますか?
absolute: 絶対的に配置された要素を生成します。最も近いレベルの配置を基準にして相対的に配置されません。 位置決め用の静的な親要素。
fixed (古い IE ではサポートされていません) は、通常はブラウザ ウィンドウまたは 位置決め用のフレームです。
relative 通常のフロー内の位置を基準にして、相対的に配置された要素を生成します。
静的デフォルト値。配置はありません。要素は通常のフローで表示されます。
sticky スティッキー配置要素を生成します。コンテナの位置は通常のドキュメント フローに基づいて計算されます。
クロスの解決方法-ドメインの問題
JSONP:
原則は、スクリプト タグを動的に挿入し、スクリプト タグを通じて js ファイルを導入し、js ファイルが正常に読み込まれた後、 url パラメーターで指定した関数を使用し、必要な json データをパラメーターとして渡します。
同一オリジン ポリシーの制限により、XmlHttpRequest では現在のソース (ドメイン名、プロトコル、ポート) からのリソースのリクエストのみが許可されます。クロスドメイン リクエストを実装するには、クロスドメイン リクエストを実装します。スクリプト タグを介してドメイン リクエストを処理し、サーバー上で JSON データを出力し、コールバック関数を実行してクロスドメイン データ リクエストを解決します。
利点は、優れた互換性、シンプルさと使いやすさ、ブラウザとサーバー間の双方向通信のサポートです。欠点は、GET リクエストのみがサポートされていることです。
JSONP: json パディング (内部パディング) は、名前が示すように、JSON をボックスに埋めることです。
<script> function createJs(sUrl){ var oScript = document.createElement('script'); oScript.type = 'text/javascript'; oScript.src = sUrl; document.getElementsByTagName('head')[0].appendChild(oScript); } createJs('jsonp.js'); box({ 'name': 'test' }); function box(json){ alert(json.name); } </script>
CORS
サーバー側でCORS サポートは主に Access-Control-Allow-Origin を設定することによって実行されます。ブラウザーが対応する設定を検出すると、Ajax クロスドメイン アクセスを許可できます。
document.domain を変更してサブドメインを横断する
サブドメインの document.domain とメイン ドメインを同じメイン ドメインに設定する 前提条件: 2 つのドメイン名は同じベース ドメインに属している必要があります。 name! また、使用するプロトコルとポートは一貫している必要があります。そうでないと、domain をクロスドメインに使用できません。
メイン ドメインが同じ場合は、domain を使用します。
ウィンドウを使用します。クロスドメインの名前
window オブジェクトには name 属性があり、これには特徴があります。つまり、ウィンドウ (ウィンドウ) のライフサイクル内で、ウィンドウによってロードされるすべてのページは window.name を共有します。各ページの window.name には読み取りおよび書き込み権限があり、window.name はウィンドウによって読み込まれるすべてのページに保持されます。
HTML5 で新しく導入された window.postMessage メソッドを使用して、ドメイン間でデータを送信します。 ##フラッシュやサーバー上でのプロキシ ページの設定など、クロスドメインの方法もあります。個人的には、window.name メソッドは複雑ではなく、ほとんどすべてのブラウザと互換性があると思います。これは本当に優れたクロスドメインメソッドです。
XML と JSON の違いは何ですか?(1)。
JSON は XML に比べてデータサイズが小さく、通信速度が速いです。
(2)。
JSON と JavaScript 間の対話はより便利で、解析と処理が容易になり、より優れたデータ対話が可能になります。
(3). データの説明。
JSON は XML ほどデータの記述が少ないです。
(4)。
JSON は XML よりもはるかに高速です。
webpack についての意見について話してくださいWebPack は、モジュールの依存関係を管理し、静的ファイルが必要な出力モジュールをコンパイルするために、モジュール パッケージ化ツールです。 Web 開発で使用される HTML、JavaScript、CSS、およびさまざまな静的ファイル (画像、フォントなど) を適切に管理およびパッケージ化できるため、開発プロセスがより効率的になります。さまざまな種類のリソースに対応する、webpack には対応するモジュール ローダーがあります。 webpack モジュール パッケージャーはモジュール間の依存関係を分析し、最後に 最適化およびマージされた静的リソースが生成されます。
webpack の 2 つの主要な機能:
1.コード分割 (自動的に完了可能)
2.loader はさまざまな種類の静的ファイルを処理でき、一連の操作をサポートします
webpack は commonJS 形式でスクリプトを記述しますが、AMD/CMD も包括的にサポートしているため、古いプロジェクトのコード移行に便利です。
Webpack には requireJs とbrowserify の機能がありますが、独自の新機能も多数あります:
1. CommonJS、AMD、および ES6 の構文と互換性があります
2. js、css、画像、その他のリソース ファイルのパッケージ化がサポートされています。###3。 インライン モジュール ローダーとプラグイン メカニズムにより、CoffeeScript や ES6
4 のサポートを提供するなど、柔軟性と拡張性が向上します。 独立した構成ファイル webpack.config.js5 があり、コードをさまざまなチャンクに分割してオンデマンドでロードできるため、初期化時間が短縮されます。 SourceUrls と SourceMap はデバッグが簡単です。7 強力なプラグイン インターフェイスがあり、そのほとんどは内部プラグインであり、より柔軟に使用できます。8 Webpack は非同期を使用します。 IO とマルチレベル キャッシュを備えています。これにより、Webpack が高速になり、インクリメンタル コンパイルでさらに高速になります。
TCP 送信の 3 ウェイ ハンドシェイクと 4 ウェーブ戦略について話しましょう
データを配信するためにターゲットでは、TCP プロトコルは 3 ウェイ ハンドシェイク戦略を使用します。 TCP プロトコルを使用してデータ パケットが送信された後、TCP は 後者の状況は無視して、確実に相手に届けられたかどうかを確認します。ハンドシェイク中に TCP フラグ (SYN および ACK) が使用されます。
送信側はまずSYNフラグを付けたデータパケットを相手に送信します。それを受信した後、受信側は確認情報を伝えるために SYN/ACK フラグを含むデータ パケットを送り返します。最後に、送信者は「ハンドシェイク」の終了を示す ACK フラグを含むデータ パケットを送り返します。
ハンドシェイク プロセス中のある段階で説明できない中断が発生した場合、TCP プロトコルは同じデータ パケットを同じ順序で再度送信します。
TCP 接続の切断には「4 ウェイ ハンドシェイク」が必要です:
TCP と UDP の違い
TCP (伝送制御プロトコル、Transmission Control Protocol) は、接続ベースのプロトコルです。つまり、正式にデータを送信する前に、データを受信するには、相手との信頼できる接続を確立する必要があります。 TCP 接続は、確立されるまでに 3 つの「会話」を経る必要があります。
UDP (User Data Protocol、User Datagram Protocol) は、TCP に対応するプロトコルです。これは非接続指向のプロトコルであり、相手との接続を確立せず、データ パケットを相手に直接送信します。UDP は、一度に少量のデータのみを送信し、高い信頼性を必要としないアプリケーション環境に適しています。
スコープ チェーンについての理解を教えてください
スコープ チェーンの役割は、実行環境で変数と関数にアクセスできるようにすることです。スコープ チェーン内の変数は上方向にのみアクセスできます。変数は、ウィンドウ オブジェクトにアクセスすると終了します。スコープ チェーン内の変数へのアクセスは許可されません。
Ajax プロセスの作成
(1) XMLHttpRequest オブジェクトを作成します。これは、非同期呼び出しオブジェクトを作成します。
(2) 新しい(3) HTTPリクエストのメソッド、URL、検証情報を指定します。
(3) HTTPリクエストのステータス変化に応答する関数を設定します。 (4) HTTP リクエストを送信します。
#(6) JavaScript と DOM を使用して部分更新を実装します。
プログレッシブ拡張とグレースフル デグラデーション
グレースフル ダウングレード: 最初から完全な機能を構築し、下位バージョンのブラウザーと互換性を持たせます。
一般的な Web セキュリティと保護の原則
SQL インジェクションの原則は、SQL コマンドをWeb フォームのクエリ文字列。最終的にサーバーをだまして悪意のある SQL コマンドを実行させます。
一般に、次の点があります: 1. ユーザーの入力を決して信頼しないでください。単一引用符と二重引用符を使用するか、長さを制限します。 " 変換などに使用します。2. SQL の動的アセンブリは使用しないでください。データのクエリとアクセスには、パラメーター化された SQL を使用するか、ストアド プロシージャを直接使用できます。
3. 管理者権限を持つデータベース接続は決して使用しないでください。アプリケーションごとに権限が制限された別のデータベース接続を使用してください。
4. 機密情報は平文で保存しないでください。パスワードや機密情報は暗号化またはハッシュ化してください。
を入力します。
看似安全的链接,骗取用户点击后,窃取cookie中的用户私密信息;或者攻击者在论坛中加一个恶意表单,
当用户提交表单的时候,却把信息传送到攻击者的服务器中,而不是用户原本以为的信任站点。
XSS防范方法
首先代码里对用户输入的地方和变量都需要仔细检查长度和对”<”,”>”,”;”,”’”等字符做过滤;其次任何内容写到页面之前都必须加以encode,避免不小心把html tag 弄出来。这一个层面做好,至少可以堵住超过一半的XSS 攻击。
首先,避免直接在cookie 中泄露用户隐私,例如email、密码等等。
其次,通过使cookie 和系统ip 绑定来降低cookie 泄露后的危险。这样攻击者得到的cookie 没有实际价值,不可能拿来重放。
如果网站不需要再浏览器端对cookie 进行操作,可以在Set-Cookie 末尾加上HttpOnly 来防止javascript 代码直接获取cookie 。
尽量采用POST 而非GET 提交表单
XSS与CSRF有什么区别吗?
XSS是获取信息,不需要提前知道其他用户页面的代码和数据包。CSRF是代替用户完成指定的动作,需要知道其他用户页面的代码和数据包。
要完成一次CSRF攻击,受害者必须依次完成两个步骤:
登录受信任网站A,并在本地生成Cookie。
在不登出A的情况下,访问危险网站B。
CSRF的防御
服务端的CSRF方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数。
通过验证码的方法
Web Worker 和webSocket
worker主线程:
1、通过 worker = new Worker( url ) 加载一个JS文件来创建一个worker,同时返回一个worker实例。
2.通过worker.postMessage( data ) 方法来向worker发送数据。
3.绑定worker.onmessage方法来接收worker发送过来的数据。
4.可以使用 worker.terminate() 来终止一个worker的执行。
WebSocket是Web应用程序的传输协议,它提供了双向的,按序到达的数据流。他是一个Html5协议,WebSocket的连接是持久的,他通过在客户端和服务器之间保持双工连接,服务器的更新可以被及时推送给客户端,而不需要客户端以一定时间间隔去轮询。
HTTP和HTTPS
HTTP协议通常承载于TCP协议之上,在HTTP和TCP之间添加一个安全协议层(SSL或TSL),这个时候,就成了我们常说的HTTPS。
默认HTTP的端口号为80,HTTPS的端口号为443。
为什么HTTPS安全
因为网络请求需要中间有很多的服务器路由器的转发。中间的节点都可能篡改信息,而如果使用HTTPS,密钥在你和终点站才有。https之所以比http安全,是因为他利用ssl/tls协议传输。它包含证书,卸载,流量转发,负载均衡,页面适配,浏览器适配,refer传递等。保障了传输过程的安全性
对前端模块化的认识
AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。
CMD 是 SeaJS 在推广过程中对模块定义的规范化产出。
AMD 是提前执行,CMD 是延迟执行。
AMD推荐的风格通过返回一个对象做为模块对象,CommonJS的风格通过对module.exports或exports的属性赋值来达到暴露模块对象的目的。
CMD模块方式
define(function(require, exports, module) { // 模块代码 });
Javascript垃圾回收方法
标记清除(mark and sweep)
这是JavaScript最常见的垃圾回收方式,当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”。
垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量以及被环境中变量所引用的变量(闭包),在这些完成之后仍存在标记的就是要删除的变量了
引用计数(reference counting)
在低版本IE中经常会出现内存泄露,很多时候就是因为其采用引用计数方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数,当声明了一个 变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加1,如果该变量的值变成了另外一个,则这个值得引用次数减1,当这个值的引用次数变为0的时 候,说明没有变量在使用,这个值没法被访问了,因此可以将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为0的值占用的空间。
在IE中虽然JavaScript对象通过标记清除的方式进行垃圾回收,但BOM与DOM对象却是通过引用计数回收垃圾的,
也就是说只要涉及BOM及DOM就会出现循环引用问题。
你觉得前端工程的价值体现在哪
为简化用户使用提供技术支持(交互部分)
为多个浏览器兼容性提供支持
为提高用户浏览速度(浏览器性能)提供支持
为跨平台或者其他基于webkit或其他渲染引擎的应用提供支持
为展示数据提供支持(数据接口)
谈谈性能优化问题
代码层面:避免使用css表达式,避免使用高级选择器,通配选择器。
缓存利用:缓存Ajax,使用CDN,使用外部js和css文件以便缓存,添加Expires头,服务端配置Etag,减少DNS查找等
请求数量:合并样式和脚本,使用css图片精灵,初始首屏之外的图片资源按需加载,静态资源延迟加载。
请求带宽:压缩文件,开启GZIP,
代码层面的优化
用hash-table来优化查找
少用全局变量
用innerHTML代替DOM操作,减少DOM操作次数,优化javascript性能
用setTimeout来避免页面失去响应
缓存DOM节点查找的结果
避免使用CSS Expression
避免全局查询
避免使用with(with会创建自己的作用域,会增加作用域链长度)
多个变量声明合并
避免图片和iFrame等的空Src。空Src会重新加载当前页面,影响速度和效率
尽量避免写在HTML标签中写Style属性
移动端性能优化
尽量使用css3动画,开启硬件加速。
适当使用touch事件代替click事件。
避免使用css3渐变阴影效果。
可以用transform: translateZ(0)来开启硬件加速。
不滥用Float。Float在渲染时计算量比较大,尽量减少使用
不滥用Web字体。Web字体需要下载,解析,重绘当前页面,尽量减少使用。
合理使用requestAnimationFrame动画代替setTimeout
CSS中的属性(CSS3 transitions、CSS3 3D transforms、Opacity、Canvas、WebGL、Video)会触发GPU渲染,请合理使用。过渡使用会引发手机过耗电增加
PC端的在移动端同样适用
相关阅读:如何做到一秒渲染一个移动页面
什么是Etag?
当发送一个服务器请求时,浏览器首先会进行缓存过期判断。浏览器根据缓存过期时间判断缓存文件是否过期。
情景一:若没有过期,则不向服务器发送请求,直接使用缓存中的结果,此时我们在浏览器控制台中可以看到 200 OK(from cache) ,此时的情况就是完全使用缓存,浏览器和服务器没有任何交互的。
情景二:若已过期,则向服务器发送请求,此时请求中会带上①中设置的文件修改时间,和Etag
然后,进行资源更新判断。服务器根据浏览器传过来的文件修改时间,判断自浏览器上一次请求之后,文件是不是没有被修改过;根据Etag,判断文件内容自上一次请求之后,有没有发生变化
情形一:若两种判断的结论都是文件没有被修改过,则服务器就不给浏览器发index.html的内容了,直接告诉它,文件没有被修改过,你用你那边的缓存吧—— 304
Not Modified,此时浏览器就会从本地缓存中获取index.html的内容。此时的情况叫协议缓存,浏览器和服务器之间有一次请求交互。
情形二:若修改时间和文件内容判断有任意一个没有通过,则服务器会受理此次请求,之后的操作同①
① 只有get请求会被缓存,post请求不会
Expires和Cache-Control
Expires要求客户端和服务端的时钟严格同步。HTTP1.1引入Cache-Control来克服Expires头的限制。如果max-age和Expires同时出现,则max-age有更高的优先级。
Cache-Control: no-cache, private, max-age=0 ETag: abcde Expires: Thu, 15 Apr 2014 20:00:00 GMT Pragma: private Last-Modified: $now // RFC1123 format
ETag应用:
Etag由服务器端生成,客户端通过If-Match或者说If-None-Match这个条件判断请求来验证资源是否修改。常见的是使用If-None-Match。请求一个文件的流程可能如下:
====第一次请求===
1.客户端发起 HTTP GET 请求一个文件;
2.服务器处理请求,返回文件内容和一堆Header,当然包括Etag(例如"2e681a-6-5d044840")(假设服务器支持Etag生成和已经开启了Etag).状态码200
====第二次请求===
客户端发起 HTTP GET 请求一个文件,注意这个时候客户端同时发送一个If-None-Match头,这个头的内容就是第一次请求时服务器返回的Etag:2e681a-6-5d0448402.服务器判断发送过来的Etag和计算出来的Etag匹配,因此If-None-Match为False,不返回200,返回304,客户端继续使用本地缓存;流程很简单,问题是,如果服务器又设置了Cache-Control:max-age和Expires呢,怎么办
答案是同时使用,也就是说在完全匹配If-Modified-Since和If-None-Match即检查完修改时间和Etag之后,
服务器才能返回304.(不要陷入到底使用谁的问题怪圈)
为什么使用Etag请求头?
Etag 主要为了解决 Last-Modified 无法解决的一些问题。
栈和队列的区别?
栈的插入和删除操作都是在一端进行的,而队列的操作却是在两端进行的。
队列先进先出,栈先进后出。
栈只允许在表尾一端进行插入和删除,而队列只允许在表尾一端进行插入,在表头一端进行删除
栈和堆的区别?
栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。
堆(数据结构):堆可以被看成是一棵树,如:堆排序;
栈(数据结构):一种先进后出的数据结构。
快速 排序的思想并实现一个快排?
快速排序”的思想很简单,整个排序过程只需要三步:
(1)在数据集之中,找一个基准点
(2)建立两个数组,分别存储左边和右边的数组
(3)利用递归进行下次比较
<script type="text/javascript"> function quickSort(arr){ if(arr.length<=1){ return arr;//如果数组只有一个数,就直接返回; } var num = Math.floor(arr.length/2);//找到中间数的索引值,如果是浮点数,则向下取整 var numValue = arr.splice(num,1);//找到中间数的值 var left = []; var right = []; for(var i=0;i<arr.length;i++){ if(arr[i]<numValue){ left.push(arr[i]);//基准点的左边的数传到左边数组 } else{ right.push(arr[i]);//基准点的右边的数传到右边数组 } } return quickSort(left).concat([numValue],quickSort(right));//递归不断重复比较 } alert(quickSort([32,45,37,16,2,87]));//弹出“2,16,32,37,45,87” </script>
你觉得jQuery或zepto源码有哪些写的好的地方
(答案仅供参考)
jQuery源码封装在一个匿名函数的自执行环境中,有助于防止变量的全局污染,然后通过传入window对象参数,可以使window对象作为局部变量使用,好处是当jquery中访问window对象的时候,就不用将作用域链退回到顶层作用域了,从而可以更快的访问window对象。同样,传入undefined参数,可以缩短查找undefined时的作用域链。
(function( window, undefined ) { //用一个函数域包起来,就是所谓的沙箱 //在这里边var定义的变量,属于这个函数域内的局部变量,避免污染全局 //把当前沙箱需要的外部变量通过函数参数引入进来 //只要保证参数对内提供的接口的一致性,你还可以随意替换传进来的这个参数 window.jQuery = window.$ = jQuery; })( window );
jquery将一些原型属性和方法封装在了jquery.prototype中,为了缩短名称,又赋值给了jquery.fn,这是很形象的写法。
有一些数组或对象的方法经常能使用到,jQuery将其保存为局部变量以提高访问速度。
jquery实现的链式调用可以节约代码,所返回的都是同一个对象,可以提高代码效率。
ES6的了解
新增模板字符串(为JavaScript提供了简单的字符串插值功能)、箭头函数(操作符左边为输入的参数,而右边则是进行的操作以及返回的值Inputs=>outputs。)、for-of(用来遍历数据—例如数组中的值。)arguments对象可被不定参数和默认参数完美代替。ES6将promise对象纳入规范,提供了原生的Promise对象。增加了let和const命令,用来声明变量。增加了块级作用域。let命令实际上就增加了块级作用域。ES6规定,var命令和function命令声明的全局变量,属于全局对象的属性;let命令、const命令、class命令声明的全局变量,不属于全局对象的属性。。还有就是引入module模块的概念
js继承方式及其优缺点
原型链继承的缺点
一是字面量重写原型会中断关系,使用引用类型的原型,并且子类型还无法给超类型传递参数。
借用构造函数(类式继承)
借用构造函数虽然解决了刚才两种问题,但没有原型,则复用无从谈起。所以我们需要原型链+借用构造函数的模式,这种模式称为组合继承
组合式继承
组合式继承是比较常用的一种继承方法,其背后的思路是 使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数复用,又保证每个实例都有它自己的属性。
关于Http 2.0 你知道多少?
HTTP/2引入了“服务端推(server push)”的概念,它允许服务端在客户端需要数据之前就主动地将数据发送到客户端缓存中,从而提高性能。
HTTP/2提供更多的加密支持
HTTP/2使用多路技术,允许多个消息在一个连接上同时交差。
它增加了头压缩(header compression),因此即使非常小的请求,其请求和响应的header都只会占用很小比例的带宽。
defer和async
defer并行加载js文件,会按照页面上script标签的顺序执行
async并行加载js文件,下载完成立即执行,不会按照页面上script标签的顺序执行
谈谈浮动和清除浮动
浮动的框可以向左或向右移动,直到他的外边缘碰到包含框或另一个浮动框的边框为止。由于浮动框不在文档的普通流中,所以文档的普通流的块框表现得就像浮动框不存在一样。浮动的块框会漂浮在文档普通流的块框上。
如何评价AngularJS和BackboneJS
backbone具有依赖性,依赖underscore.js。Backbone + Underscore + jQuery(or Zepto) 就比一个AngularJS 多出了2 次HTTP请求.
Backbone的Model没有与UI视图数据绑定,而是需要在View中自行操作DOM来更新或读取UI数据。AngularJS与此相反,Model直接与UI视图绑定,Model与UI视图的关系,通过directive封装,AngularJS内置的通用directive,就能实现大部分操作了,也就是说,基本不必关心Model与UI视图的关系,直接操作Model就行了,UI视图自动更新。
AngularJS的directive,你输入特定数据,他就能输出相应UI视图。是一个比较完善的前端MVW框架,包含模板,数据双向绑定,路由,模块化,服务,依赖注入等所有功能,模板功能强大丰富,并且是声明式的,自带了丰富的 Angular 指令。
用过哪些设计模式?
工厂模式:
主要好处就是可以消除对象间的耦合,通过使用工程方法而不是new关键字。将所有实例化的代码集中在一个位置防止代码重复。
工厂模式解决了重复实例化的问题 ,但还有一个问题,那就是识别问题,因为根本无法 搞清楚他们到底是哪个对象的实例。
function createObject(name,age,profession){//集中实例化的函数 var obj = new Object(); obj.name = name; obj.age = age; obj.profession = profession; obj.move = function () { return this.name + ' at ' + this.age + ' engaged in ' + this.profession; }; return obj; } var test1 = createObject('trigkit4',22,'programmer');//第一个实例 var test2 = createObject('mike',25,'engineer');//第二个实例
构造函数模式
使用构造函数的方法 ,即解决了重复实例化的问题 ,又解决了对象识别的问题,该模式与工厂模式的不同之处在于:
1、构造函数方法没有显示的创建对象 (new Object());
2.直接将属性和方法赋值给 this 对象;
3.没有 renturn 语句。
说说你对闭包的理解
使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。在js中,函数即闭包,只有函数才会产生作用域的概念
闭包有三个特性:
1.函数嵌套函数
2.函数内部可以引用外部的参数和变量
3.参数和变量不会被垃圾回收机制回收
请你谈谈Cookie的弊端
cookie虽然在持久保存客户端数据提供了方便,分担了服务器存储的负担,但还是有很多局限性的。
第一:每个特定的域名下最多生成20个cookie
1、IE6或更低版本最多20个cookie
2.IE7和之后的版本最后可以有50个cookie。
3.Firefox最多50个cookie
4.chrome和Safari没有做硬性限制
IE和Opera 会清理近期最少使用的cookie,Firefox会随机清理cookie。
cookie的最大大约为4096字节,为了兼容性,一般不能超过4095字节。
IE 提供了一种存储可以持久化用户数据,叫做userdata,从IE5.0就开始支持。每个数据最多128K,每个域名下最多1M。这个持久化数据放在缓存中,如果缓存没有清理,那么会一直存在。
优点:极高的扩展性和可用性
1、通过良好的编程,控制保存在cookie中的session对象的大小。
2.通过加密和安全传输技术(SSL),减少cookie被破解的可能性。
3.只在cookie中存放不敏感数据,即使被盗也不会有重大损失。
4. Cookie が永久に有効にならないように、Cookie の有効期間を制御します。泥棒が期限切れの Cookie を入手した可能性があります。
欠点:
1. `Cookie` の数と長さに制限があります。各ドメインには最大 20 個の Cookie のみを含めることができ、各 Cookie の長さは 4 KB を超えることはできません。そうしないと、セキュリティの問題で切り捨てられます。 Cookie が誰かに傍受された場合、その人はすべてのセッション情報を取得できます。暗号化も役に立ちません。傍受者は Cookie の意味を知る必要がないため、Cookie をそのまま転送するだけで目的を達成できます。
ブラウザのローカル ストレージ
ブラウザの上位バージョンでは、js は sessionStorage と globalStorage を提供します。 LocalStorage は、globalStorage を置き換えるために HTML5 で提供されます。
HTML5 のウェブ ストレージには、sessionStorage と localStorage という 2 つのストレージ メソッドがあります。 sessionStorage は、セッション内のデータをローカルに保存するために使用されます。これらのデータには、同じセッション内のページからのみアクセスでき、セッションが終了するとデータは破棄されます。したがって、sessionStorage は永続的なローカル ストレージではなく、セッション レベルのストレージにすぎません。 LocalStorage は、データがアクティブに削除されない限り、永続的なローカル ストレージとして使用されます。Web ストレージと Cookie の違い
Web ストレージの概念は Cookie の概念と似ていますが、異なる点は、大容量のストレージ用に設計されているという点です。 Cookie のサイズは制限されており、新しいページをリクエストするたびに Cookie が送信されるため、帯域幅が浪費されます。また、Cookie はスコープを指定する必要があり、ドメイン間で呼び出すことはできません。
さらに、Web Storage には setItem、getItem、removeItem、clear などのメソッドがあります。Cookie とは異なり、フロントエンド開発者は setCookie と getCookie を自分でカプセル化する必要があります。 しかし、Cookie も不可欠です。Cookie の役割はサーバーと対話し、HTTP 仕様の一部として存在することです。 、Web Storage はデータをローカルに「保存」するためのみです。 ブラウザのサポート IE7 以下を除き、他の標準ブラウザは完全にサポートされています (すなわち、FF は Web サーバーで実行する必要があります)。これは言及する価値があります。たとえば、IE 7 と IE6 の userData は、実際には JavaScript ローカル ストレージのソリューションです。単純なコードのカプセル化により、すべてのブラウザを統合して Web をサポートできます。 ストレージ。 localStorage と sessionStorage には、setItem、getItem、removeItem などの同じ操作メソッドがあります。Cookie と session の違い:
1. Cookie データはクライアントのブラウザに保存され、セッション データはサーバーに配置されます。
2. Cookie はあまり安全ではありません。ローカルに保存された COOKIE を他人が解析して COOKIE を欺く可能性があります。セキュリティを考慮すると、セッションを使用する必要があります。 3. セッションは一定期間内にサーバーに保存されます。アクセスが増加すると、サーバーのパフォーマンスがより多く消費されます。サーバーのパフォーマンスを軽減するには、COOKIE を使用する必要があります。 4. 1 つの Cookie によって保存されるデータは 4K を超えることはできません。サイトで保存できる Cookie は 20 個までです。 5. 個人的な提案: ログイン情報などの重要な情報は SESSION として保存する必要がある場合は、COOKIEに配置できます。
display:none と Visibility:hidden の違いは何ですか?
display:none 対応する要素を非表示にし、ドキュメント レイアウト内でその要素にスペースを割り当てなくなり、その要素のすべての側面にある要素は、あたかも存在しなかったかのように閉じられます。
visibility:hidden 対応する要素を非表示にしますが、ドキュメント レイアウト内の元のスペースは保持します。
CSS のリンクと @import の違いは何ですか?
位置: 絶対との類似点と相違点float 属性
共通点: インライン要素と絶対属性に float を設定すると、要素をドキュメント フローから取り出し、その幅と高さを設定できます。
違い: float は引き続きその位置を占めますが、absolute はドキュメント フロー内の他の要素をカバーします。ボックス サイズ属性を導入しますか?
box-sizing 属性は、主に要素のボックス モデルの解析モードを制御するために使用されます。デフォルト値はコンテンツボックスです。
content-box: 要素に W3C 標準ボックス モデルを維持させます。要素の幅/高さは境界線によって決まります パディングコンテンツの幅/高さが決定されます。 width/height 属性の設定は、コンテンツ部分の幅/高さを参照します。 border-box: 要素に IE の従来のボックス モデル (IE6 および) を維持させます。以下のバージョンと IE6~7 の奇妙なモード)。幅/高さのプロパティを設定すると、境界線が参照されます。 パディングコンテンツ标准浏览器下,按照W3C规范对盒模型解析,一旦修改了元素的边框或内距,就会影响元素的盒子尺寸,就不得不重新计算元素的盒子尺寸,从而影响整个页面的布局。
CSS 选择符有哪些?哪些属性可以继承?优先级算法如何计算? CSS3新增伪类有那些?
1、id选择器( # myid)
2.类选择器(.myclassname)
3.标签选择器(p, h1, p)
4.相邻选择器(h1 + p)
5.子选择器(ul > li)
6.后代选择器(li a)
7.通配符选择器( * )
8.属性选择器(a[rel = "external"])
9.伪类选择器(a: hover, li:nth-child)
优先级为:
!important > id > class > tag
important 比 内联优先级高,但内联比 id 要高
CSS3新增伪类举例:
p:first-of-type 选择属于其父元素的首个
元素的每个
元素。
p:last-of-type 选择属于其父元素的最后
元素的每个
元素。
p:only-of-type 选择属于其父元素唯一的
元素的每个
元素。
p:only-child 选择属于其父元素的唯一子元素的每个
元素。
p:nth-child(2) 选择属于其父元素的第二个子元素的每个
元素。
:enabled :disabled 控制表单控件的禁用状态。
:checked 单选框或复选框被选中。
CSS3有哪些新特性?
CSS3实现圆角(border-radius),阴影(box-shadow),
对文字加特效(text-shadow、),线性渐变(gradient),旋转(transform)
transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);//旋转,缩放,定位,倾斜
增加了更多的CSS选择器 多背景 rgba
在CSS3中唯一引入的伪元素是::selection.
媒体查询,多栏布局
border-image
CSS3中新增了一种盒模型计算方式:box-sizing。盒模型默认的值是content-box, 新增的值是padding-box和border-box,几种盒模型计算元素宽高的区别如下:
content-box(默认)
布局所占宽度Width:
Width = width + padding-left + padding-right + border-left + border-right
布局所占高度Height:
Height = height + padding-top + padding-bottom + border-top + border-bottom
padding-box
布局所占宽度Width:
Width = width(包含padding-left + padding-right) + border-top + border-bottom
布局所占高度Height:
Height = height(包含padding-top + padding-bottom) + border-top + border-bottom
border-box
布局所占宽度Width:
Width = width(包含padding-left + padding-right + border-left + border-right)
布局所占高度Height:
Height = height(包含padding-top + padding-bottom + border-top + border-bottom)
对BFC规范的理解?
BFC,块级格式化上下文,一个创建了新的BFC的盒子是独立布局的,盒子里面的子元素的样式不会影响到外面的元素。在同一个BFC中的两个毗邻的块级盒在垂直方向(和布局方向有关系)的margin会发生折叠。
(W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行布局,以及与其他元素的关系和相互作用。
说说你对语义化的理解?
1,去掉或者丢失样式的时候能够让页面呈现出清晰的结构
2,有利于SEO:和搜索引擎建立良好沟通,有助于爬虫抓取更多的有效信息:爬虫依赖于标签来确定上下文和各个关键字的权重;
3,方便其他设备解析(如屏幕阅读器、盲人阅读器、移动设备)以意义的方式来渲染网页;
4,便于团队开发和维护,语义化更具可读性,是下一步吧网页的重要动向,遵循W3C标准的团队都遵循这个标准,可以减少差异化。
Doctype作用? 严格模式与混杂模式如何区分?它们有何意义?
1)、 声明位于文档中的最前面,处于 标签之前。告知浏览器以何种模式来渲染文档。
2)、严格模式的排版和 JS 运作模式是 以该浏览器支持的最高标准运行。
3)、在混杂模式中,页面以宽松的向后兼容的方式显示。模拟老式浏览器的行为以防止站点无法工作。
4)、DOCTYPE不存在或格式不正确会导致文档以混杂模式呈现。
你知道多少种Doctype文档类型?
该标签可声明三种 DTD 类型,分别表示严格版本、过渡版本以及基于框架的 HTML 文档。
HTML 4.01 规定了三种文档类型:Strict、Transitional 以及 Frameset。
XHTML 1.0 规定了三种 XML 文档类型:Strict、Transitional 以及 Frameset。
Standards (标准)模式(也就是严格呈现模式)用于呈现遵循最新标准的网页,而 Quirks
(包容)模式(也就是松散呈现模式或者兼容模式)用于呈现为传统浏览器而设计的网页。
HTML与XHTML——二者有什么区别
区别:
1、所有的标记都必须要有一个相应的结束标记
2.所有标签的元素和属性的名字都必须使用小写
3.所有的XML标记都必须合理嵌套
4.所有的属性必须用引号""括起来
5.把所有<和&特殊符号用编码表示
6.给所有属性赋一个值
7.不要在注释内容中使“--”
8.图片必须有说明文字
常见兼容性问题?
png24位的图片在iE6浏览器上出现背景,解决方案是做成PNG8.也可以引用一段脚本处理.
浏览器默认的margin和padding不同。解决方案是加一个全局的*{margin:0;padding:0;}来统一。
IE6双边距bug:块属性标签float后,又有横行的margin情况下,在ie6显示margin比设置的大。
浮动ie产生的双倍距离(IE6双边距问题:在IE6下,如果对元素设置了浮动,同时又设置了margin-left或margin-right,margin值会加倍。)
#box{ float:left; width:10px; margin:0 0 0 100px;}
这种情况之下IE会产生20px的距离,解决方案是在float的标签样式控制中加入_display:inline;将其转化为行内属性。(_这个符号只有ie6会识别)
渐进识别的方式,从总体中逐渐排除局部。
首先,巧妙的使用“\9”这一标记,将IE游览器从所有情况中分离出来。
接着,再次使用“+”将IE8和IE7、IE6分离开来,这样IE8已经独立识别。
css
.bb{ background-color:#f1ee18;/*所有识别*/ .background-color:#00deff\9; /*IE6、7、8识别*/ +background-color:#a200ff;/*IE6、7识别*/ _background-color:#1e0bd1;/*IE6识别*/ }
怪异模式问题:漏写DTD声明,Firefox仍然会按照标准模式来解析网页,但在IE中会触发
怪异模式。为避免怪异模式给我们带来不必要的麻烦,最好养成书写DTD声明的好习惯。现在可以使用[html5](http://www.w3.org/TR/html5/single-page.html)推荐的写法:`
上下margin重合问题
ie和ff都存在,相邻的两个div的margin-left和margin-right不会重合,但是margin-top和margin-bottom却会发生重合。
解决方法,养成良好的代码编写习惯,同时采用margin-top或者同时采用margin-bottom。
解释下浮动和它的工作原理?清除浮动的技巧
浮动元素脱离文档流,不占据空间。浮动元素碰到包含它的边框或者浮动元素的边框停留。
1、使用空标签清除浮动。
这种方法是在所有浮动标签后面添加一个空标签 定义css clear:both. 弊端就是增加了无意义标签。
2.使用overflow。
给包含浮动元素的父标签添加css属性 overflow:auto; zoom:1; zoom:1用于兼容IE6。
3.使用after伪对象清除浮动。
该方法只适用于非IE浏览器。具体写法可参照以下示例。使用中需注意以下几点。
一、该方法中必须为需要清除浮动元素的伪对象中设置 height:0,否则该元素会比实际高出若干像素;
浮动元素引起的问题和解决办法?
浮动元素引起的问题:
(1)父元素的高度无法被撑开,影响与父元素同级的元素
(2)与浮动元素同级的非浮动元素(内联元素)会跟随其后
(3)若非第一个元素浮动,则该元素之前的元素也需要浮动,否则会影响页面显示的结构
解决方法:
使用CSS中的clear:both;属性来清除元素的浮动可解决2、3问题,对于问题1,添加如下样式,给父元素添加clearfix样式:
.clearfix:after{ content: "."; display: block;height: 0; clear: both;visibility: hidden; } .clearfix{ display: inline-block; } /* for IE/Mac */
清除浮动的几种方法:
1,额外标签法,
<p style="clear:both;"></p>(缺点:不过这个办法会增加额外的标签使HTML结构看起来不够简洁。)
2,使用after伪类
#parent:after{ content:"."; height:0; visibility:hidden; display:block; clear:both; }
3,浮动外部元素
4,设置overflow为hidden或者auto
DOM操作——怎样添加、移除、移动、复制、创建和查找节点。
1)创建新节点
createDocumentFragment() //创建一个DOM片段 createElement() //创建一个具体的元素 createTextNode() //创建一个文本节点
2)添加、移除、替换、插入
appendChild() removeChild() replaceChild() insertBefore() //并没有insertAfter()
3)查找
getElementsByTagName() //通过标签名称 getElementsByName() //通过元素的Name属性的值(IE容错能力较强,会得到一个数组,其中包括id等于name值的) getElementById() //通过元素Id,唯一性
html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?
HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加。
拖拽释放(Drag and drop) API
语义化更好的内容标签(header,nav,footer,aside,article,section)
音频、视频API(audio,video)
画布(Canvas) API
地理(Geolocation) API
本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失;
sessionStorage 的数据在浏览器关闭后自动删除
表单控件,calendar、date、time、email、url、search
新的技术webworker, websocket, Geolocation
移除的元素
纯表现的元素:basefont,big,center,font, s,strike,tt,u;
对可用性产生负面影响的元素:frame,frameset,noframes;
支持HTML5新标签:
IE8/IE7/IE6支持通过document.createElement方法产生的标签,
可以利用这一特性让这些浏览器支持HTML5新标签,
当然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架
<!--[if lt IE 9]> <script> src="http://html5shim.googlecode.com/svn/trunk/html5.js" </script> <![endif]-->
如何区分: DOCTYPE声明\新增的结构元素\功能元素
如何实现浏览器内多个标签页之间的通信?
调用localstorge、cookies等本地存储方式
什么是 FOUC(无样式内容闪烁)?你如何来避免 FOUC?
FOUC - Flash Of Unstyled Content 文档样式闪烁
<style type="text/css" media="all">@import "../fouc.css";</style>
而引用CSS文件的@import就是造成这个问题的罪魁祸首。IE会先加载整个HTML文档的DOM,然后再去导入外部的CSS文件,因此,在页面DOM加载完成到CSS导入完成中间会有一段时间页面上的内容是没有样式的,这段时间的长短跟网速,电脑速度都有关系。
解决方法简单的出奇,只要在
之间加入一个或者