Javascript常見技術點
阿新 • • 發佈:2019-02-14
前臺技術容易上手,掌握主要賬務一些細碎的技術點會給開發帶來更大的便利。本文章持續更新,用於記錄常見的javascript技術點。
1、javascript面向物件中繼承實現
javascript面向物件中的繼承實現一般都使用到了建構函式和Prototype原型鏈,簡單的程式碼如下: function Animal(name) {
this.name = name;
}
Animal.prototype.getName = function() {
alert(this.name)
}
function Dog() {};
Dog.prototype = new Animal("Buddy");
Dog.prototype.constructor = Dog;
var dog = new Dog();
2、寫出3個使用this的典型應用
(1)在html元素事件屬性中使用,如
<input type=”button” onclick=”showInfo(this);” value=”點選一下”/>
(2)建構函式
function Animal(name, color) {
this.name = name;
this.color = color;
}
(3)
<input type="button" id="text" value="點選一下" />
<script type="text/javascript">
var btn = document.getElementById("text");
btn.onclick = function() {
alert(this.value); //此處的this是按鈕元素
}
</script>
(4)CSS expression表示式中使用this關鍵字
<table width="100px" height="100px">
<tr>
<td>
<div style="width:expression(this.parentNode.width);">div element</div>
</td>
</tr>
</table>
3、JavaScript中如何對一個物件進行深度clone
function cloneObject(o) {
if (!o || 'object' !== typeof o) {
return o;
}
var c = 'function' === typeof o.pop ? [] : {};
var p, v;
for (p in o) {
if (o.hasOwnProperty(p)) {
v = o[p];
if (v && 'object' === typeof v) {
c[p] = Ext.ux.clone(v);
} else {
c[p] = v;
}
}
}
return c;
};
4、ajax是什麼? ajax的互動模型? 同步和非同步的區別? 如何解決跨域問題?
Ajax是多種技術組合起來的一種瀏覽器和伺服器互動技術,基本思想是允許一個網際網路瀏覽器向一個遠端頁面/服務做非同步的http呼叫,並且用收到的資料來更新一個當前web頁面而不必重新整理整個頁面。該技術能夠改進客戶端的體驗。包含的技術:XHTML:對應W3C的XHTML規範,目前是XHTML1.0。
CSS:對應W3C的CSS規範,目前是CSS2.0
DOM:這裡的DOM主要是指HTML DOM,XML DOM包括在下面的XML中
JavaScript:對應於ECMA的ECMAScript規範
XML:對應W3C的XML DOM、XSLT、XPath等等規範
XMLHttpRequest:對應WhatWG的Web Applications1.0規範(http://whatwg.org/specs/web-apps/current-work/)
AJAX互動模型
同步:指令碼會停留並等待伺服器傳送回覆然後再繼續
非同步:指令碼允許頁面繼續其程序並處理可能的回覆
跨域問題簡單的理解就是因為JS同源策略的限制,a.com域名下的JS無法操作b.com或c.a.com下的物件,具體場景如下:
PS:(1)如果是埠或者協議造成的跨域問題前端是無能為力的
(2) 在跨域問題上,域僅僅通過URL的首部來識別而不會嘗試判斷相同的IP地址對應的域或者兩個域是否對應一個IP
前端對於跨域的解決辦法:
(1) document.domain+iframe
(2) 動態建立script標籤
5、什麼是閉包?下面這個ul,如何點選每一列的時候alert其index?
<ul id=”test”>
<li>這是第一條</li>
<li>這是第二條</li>
<li>這是第三條</li>
</ul>
內部函式被定義它的函式的外部區域呼叫的時候就產生了閉包。
(function A() {
var index = 0;
var ul = document.getElementById("test");
var obj = {};
for (var i = 0, l = ul.childNodes.length; i < l; i++) {
if (ul.childNodes[i].nodeName.toLowerCase() == "li") {
var li = ul.childNodes[i];
li.onclick = function() {
index++;
alert(index);
}
}
}
})();
6、請給出非同步載入js方案,不少於兩種
預設情況javascript是同步載入的,也就是javascript的載入時阻塞的,後面的元素要等待javascript載入完畢後才能進行再載入,對於一些意義不是很大的javascript,如果放在頁頭會導致載入很慢的話,是會嚴重影響使用者體驗的。非同步載入方式:
(1) defer,只支援IE
(2) async:
(3) 建立script,插入到DOM中,載入完畢後callBack,見程式碼:
function loadScript(url, callback) {
var script = document.createElement("script")
script.type = "text/javascript";
if (script.readyState) { //IE
script.onreadystatechange = function() {
if (script.readyState == "loaded" ||
script.readyState == "complete") {
script.onreadystatechange = null;
callback();
}
};
} else { //Others: Firefox, Safari, Chrome, and Opera
script.onload = function() {
callback();
};
}
script.src = url;
document.body.appendChild(script);
}
7、請設計一套方案,用於確保頁面中JS載入完全。
var n = document.createElement("script");
n.type = "text/javascript";
//以上省略部分程式碼
//ie支援script的readystatechange屬性(IE support the readystatechange event for script and css nodes)
if (ua.ie) {
n.onreadystatechange = function() {
var rs = this.readyState;
if ('loaded' === rs || 'complete' === rs) {
n.onreadystatechange = null;
f(id, url); //回撥函式
}
};
//省略部分程式碼
//safari 3.x supports the load event for script nodes(DOM2)
n.addEventListener('load', function() {
f(id, url);
});
//firefox and opera support onload(but not dom2 in ff) handlers for
//script nodes. opera, but no ff, support the onload event for link
//nodes.
} else {
n.onload = function() {
f(id, url);
};
}
8、js中如何定義class,如何擴充套件prototype?
Ele.className = “***”; //***在css中定義,形式如下:.*** {…}A.prototype.B = C;
A是某個建構函式的名字
B是這個建構函式的屬性
C是想要定義的屬性的值
9、documen.write和 innerHTML的區別
document.write只能重繪整個頁面innerHTML可以重繪頁面的一部分
10、前端開發的優化問題
(1) 減少http請求次數:css spirit,data uri(2) JS,CSS原始碼壓縮
(3) 前端模板 JS+資料,減少由於HTML標籤導致的頻寬浪費,前端用變數儲存AJAX請求結果,每次操作本地變數,不用請求,減少請求次數
(4) 用innerHTML代替DOM操作,減少DOM操作次數,優化javascript效能
(5) 用setTimeout來避免頁面失去響應
(6) 用hash-table來優化查詢
(7) 當需要設定的樣式很多時設定className而不是直接操作style
(8) 少用全域性變數
(9) 快取DOM節點查詢的結果
(10) 避免使用CSS Expression
(11) 圖片預載
(12) 避免在頁面的主體佈局中使用table,table要等其中的內容完全下載之後才會顯示出來,顯示比div+css佈局慢