1. eval是做什么的况脆?
它的功能是把對應(yīng)的字符串解析成JS代碼并運行徽鼎;
應(yīng)該避免使用eval肤频,不安全净嘀,非常耗性能(2次,一次解析成js語句,一次執(zhí)行)辟躏。
由JSON字符串轉(zhuǎn)換為JSON對象的時候可以用eval,var obj =eval('('+ str +')');
2. 什么是window對象? 什么是document對象?
- window對象是指瀏覽器打開的窗口拨黔。
- document對象是Documentd對象(HTML 文檔對象)的一個只讀引用贺待,window對象的一個屬性。
3. null零截,undefined 的區(qū)別麸塞?
- null 表示一個對象是“沒有值”的值,也就是值為“空”涧衙;
- undefined 表示一個變量聲明了沒有初始化(賦值)哪工;
undefined不是一個有效的JSON奥此,而null是;
undefined的類型(typeof)是undefined雁比;
null的類型(typeof)是object稚虎;
4. ["1", "2", "3"].map(parseInt) 答案是多少?
parseInt() 函數(shù)能解析一個字符串偎捎,并返回一個整數(shù)蠢终,需要兩個參數(shù) (val, radix),
其中 radix 表示要解析的數(shù)字的基數(shù)茴她⊙胺鳎【該值介于 2 ~ 36 之間,并且字符串中的數(shù)字不能大于radix才能正確返回數(shù)字結(jié)果值】;
但此處 map 傳了 3 個 (element, index, array),我們重寫parseInt函數(shù)測試一下是否符合上面的規(guī)則丈牢。
function parseInt(str, radix) {
return str+'-'+radix;
};
var a=["1", "2", "3"];
a.map(parseInt); // ["1-0", "2-1", "3-2"] 不能大于radix
因為二進制里面祭钉,沒有數(shù)字3,導(dǎo)致出現(xiàn)超范圍的radix賦值和不合法的進制解析,才會返回NaN
所以["1", "2", "3"].map(parseInt) 答案也就是:[1, NaN, NaN]
5. 事件是己沛?IE與火狐的事件機制有什么區(qū)別慌核? 如何阻止冒泡?
- 我們在網(wǎng)頁中的某個操作(有的操作對應(yīng)多個事件)泛粹。例如:當(dāng)我們點擊一個按鈕就會產(chǎn)生一個事件。是可以被 JavaScript 偵測到的行為肮疗。
- 事件處理機制:I.E.是事件冒泡晶姊、Firefox同時支持兩種事件模型,也就是:捕獲型事件和冒泡型事件伪货;
- ev.stopPropagation();(舊ie的方法 ev.cancelBubble = true;)
6. javascript 代碼中的"use strict";是什么意思 ? 使用它區(qū)別是什么们衙?
use strict是一種ECMAscript 5 添加的(嚴格)運行模式,這種模式使得 Javascript 在更嚴格的條件下運行,
使JS編碼更加規(guī)范化的模式,消除Javascript語法的一些不合理、不嚴謹之處碱呼,減少一些怪異行為蒙挑。
默認支持的糟糕特性都會被禁用,比如不能用with愚臀,也不能在意外的情況下給全局變量賦值;
全局變量的顯示聲明,函數(shù)必須聲明在頂層忆蚀,不允許在非函數(shù)代碼塊內(nèi)聲明函數(shù),arguments.callee也不允許使用;
消除代碼運行的一些不安全之處姑裂,保證代碼運行的安全,限制函數(shù)中的arguments修改馋袜,嚴格模式下的eval函數(shù)的行為和非嚴格模式的也不相同;
提高編譯器效率,增加運行速度舶斧;
為未來新版本的Javascript標(biāo)準(zhǔn)化做鋪墊欣鳖。
7. Javascript中,有一個函數(shù)茴厉,執(zhí)行時對象查找時泽台,永遠不會去查找原型什荣,這個函數(shù)是?
hasOwnProperty
javaScript中hasOwnProperty函數(shù)方法是返回一個布爾值怀酷,指出一個對象是否具有指定名稱的屬性稻爬。此方法無法檢查該對象的原型鏈中是否具有該屬性;該屬性必須是對象本身的一個成員胰坟。
使用方法:
object.hasOwnProperty(proName)
其中參數(shù)object是必選項因篇。一個對象的實例。
proName是必選項笔横。一個屬性名稱的字符串值竞滓。
如果 object 具有指定名稱的屬性,那么JavaScript中hasOwnProperty函數(shù)方法返回 true吹缔,反之則返回 false商佑。
8. JSON 的了解?
JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式厢塘。
它是基于JavaScript的一個子集茶没。數(shù)據(jù)格式簡單, 易于讀寫, 占用帶寬小
如:{"age":"12", "name":"back"}
JSON字符串轉(zhuǎn)換為JSON對象:
var obj =eval('('+ str +')');
var obj = str.parseJSON();
var obj = JSON.parse(str);
JSON對象轉(zhuǎn)換為JSON字符串:
var last=obj.toJSONString();
var last=JSON.stringify(obj);
9. js延遲加載的方式有哪些?
defer和async晚碾、動態(tài)創(chuàng)建DOM方式(用得最多)抓半、按需異步載入js
10.如何判斷當(dāng)前腳本運行在瀏覽器還是node環(huán)境中?(阿里)
this === window ? 'browser' : 'node';
通過判斷Global對象是否為window格嘁,如果不為window笛求,當(dāng)前腳本沒有運行在瀏覽器中
11.javascript的typeof返回哪些數(shù)據(jù)類型
alert(typeof [1, 2]); //object
alert(typeof 'leipeng'); //string
var i = true;
alert(typeof i); //boolean
alert(typeof 1); //number
var a;
alert(typeof a); //undefined
function a(){;};
alert(typeof a) //function
12. 例舉3種強制類型轉(zhuǎn)換和2種隱式類型轉(zhuǎn)換?
強制(parseInt(),parseFloat(),Number())
隱式(== ,!!)
13. split() 、join() 的區(qū)別
前者是切割成數(shù)組的形式糕簿,后者是將數(shù)組轉(zhuǎn)換成字符串
14. 數(shù)組方法pop() push() unshift() shift()
push()尾部添加 pop()尾部刪除
unshift()頭部添加 shift()頭部刪除
map() : 遍歷數(shù)組中的元素, 返回一個新數(shù)組(包含回調(diào)函數(shù)返回的數(shù)據(jù))
filter():遍歷數(shù)組中的元素, 返回一個新數(shù)組(包含回調(diào)函數(shù)返回true的元素)
15.事件綁定和普通事件有什么區(qū)別
普通添加事件的方法:
var btn = document.getElementById("hello");
btn.onclick = function(){
alert(1);
}
btn.onclick = function(){
alert(2);
}
執(zhí)行上面的代碼只會alert 2
事件綁定方式添加事件:
var btn = document.getElementById("hello");
btn.addEventListener("click",function(){
alert(1);
},false);
btn.addEventListener("click",function(){
alert(2);
},false);
執(zhí)行上面的代碼會先alert 1 再 alert 2
普通添加事件的方法不支持添加多個事件探入,最下面的事件會覆蓋上面的,而事件綁定(addEventListener)方式添加事件可以添加多個懂诗。
addEventListener不兼容低版本IE
普通事件無法取消
addEventLisntener還支持事件冒泡+事件捕獲
16. IE和DOM事件流的區(qū)別
- 執(zhí)行順序不一樣蜂嗽、
- 參數(shù)不一樣
- 事件加不加on
- this指向問題
17. IE和標(biāo)準(zhǔn)下有哪些兼容性的寫法
var ev = ev || window.event
document.documentElement.clientWidth || document.body.clientWidth
var target = ev.srcElement||ev.target
18.如何阻止事件冒泡和事件默認行為
//阻止事件冒泡
if(typeof ev.stopPropagation=='function') { //標(biāo)準(zhǔn)的
ev.stopPropagation();
} else { //非標(biāo)準(zhǔn)IE
window.event.cancelBubble = true;
}
//阻止事件默認行為
return false
19. window.onload 和document ready的區(qū)別
window.onload 是在dom文檔樹加載完和所有文件加載完之后執(zhí)行一個函數(shù)document.ready原生中沒有這個方法,jquery中有 (document).ready要比window.onload先執(zhí)行
window.onload只能出來一次,$(document).ready可以出現(xiàn)多次
20. ”==”和“===”的不同
前者會自動轉(zhuǎn)換類型
后者不會
21. JavaScript是一門什么樣的語言离唐,它有哪些特點隆嗅?
javaScript一種直譯式腳本語言,是一種動態(tài)類型侯繁、弱類型胖喳、基于原型的語言,內(nèi)置支持類型贮竟。它的解釋器被稱為JavaScript引擎丽焊,為瀏覽器的一部分较剃,廣泛用于客戶端的腳本語言,最早是在HTML網(wǎng)頁上使用技健,用來給HTML網(wǎng)頁增加動態(tài)功能写穴。JavaScript兼容于ECMA標(biāo)準(zhǔn),因此也稱為ECMAScript雌贱。
基本特點
- 是一種解釋性腳本語言(代碼不進行預(yù)編譯)啊送。
- 主要用來向HTML(標(biāo)準(zhǔn)通用標(biāo)記語言下的一個應(yīng)用)頁面添加交互行為。
- 可以直接嵌入HTML頁面欣孤,但寫成單獨的js文件有利于結(jié)構(gòu)和行為的分離馋没。
跨平臺特性,在絕大多數(shù)瀏覽器的支持下降传,可以在多種平臺下運行(如Windows篷朵、Linux、Mac婆排、Android声旺、iOS等)。
22. JavaScript的數(shù)據(jù)類型都有什么段只?
基本數(shù)據(jù)類型:String,boolean,Number,Undefined, Null
引用數(shù)據(jù)類型:Object, Array, Function
那么問題來了腮猖,如何判斷某變量是否為數(shù)組數(shù)據(jù)類型?
方法一.判斷其是否具有“數(shù)組性質(zhì)”赞枕,如slice()方法澈缺。可自己給該變量定義slice方法鹦赎,故有時會失效
方法二.obj instanceof Array 在某些IE版本中不正確
方法三.方法一二皆有漏洞谍椅,在ECMA Script5中定義了新方法Array.isArray(), 保證其兼容性误堡,最好的方法如下:
if(typeof Array.isArray==="undefined")
{
Array.isArray = function(arg){
return Object.prototype.toString.call(arg)==="[object Array]"
};
}
23. 當(dāng)一個DOM節(jié)點被點擊時候古话,我們希望能夠執(zhí)行一個函數(shù),應(yīng)該怎么做锁施?
直接在DOM里綁定事件:<div onclick=”test()”></div>
在JS里通過onclick綁定:xxx.onclick = test
通過事件添加進行綁定:addEventListener(xxx, ‘click’, test)
那么問題來了陪踩,Javascript的事件流模型都有什么?
“事件冒泡”:事件開始由最具體的元素接受悉抵,然后逐級向上傳播
“事件捕捉”:事件由最不具體的節(jié)點先接收肩狂,然后逐級向下,一直到最具體的
“DOM事件流”:三個階段:事件捕捉姥饰,目標(biāo)階段傻谁,事件冒泡
24. 看下列代碼輸出為何?解釋原因列粪。
var a;
alert(typeof a); // undefined
alert(b); // 報錯
解釋:Undefined是一個只有一個值的數(shù)據(jù)類型审磁,這個值就是“undefined”谈飒,在使用var聲明變量但并未對其賦值進行初始化時,這個變量的值就是undefined态蒂。而b由于未聲明將報錯杭措。注意未申明的變量和聲明了未賦值的是不一樣的。
25. 看下列代碼,輸出什么钾恢?解釋原因手素。
var undefined;
undefined == null; // true undefined與null相等,但不恒等(===)
1 == true; // true 一個是number一個是string時瘩蚪,會嘗試將string轉(zhuǎn)換為number
2 == true; // false 嘗試將boolean轉(zhuǎn)換為number泉懦,0或1
0 == false; // true
0 == ''; // true
NaN == NaN; // false
[] == false; // true 嘗試將Object轉(zhuǎn)換成number或string,取決于另外一個對比量的類型
[] == ![]; // true
所以募舟,對于0祠斧、空字符串的判斷,建議使用 “===” 拱礁∽练妫“===”會先判斷兩邊的值類型,類型不匹配時為false呢灶。
看下面的代碼吴超,輸出什么,foo的值為什么鸯乃?
var foo = "11"+2-"1";
console.log(foo);
console.log(typeof foo);
執(zhí)行完后foo的值為111鲸阻,foo的類型為String。
26. 已知數(shù)組var stringArray = [“This”, “is”, “Baidu”, “Campus”]缨睡,Alert出”This is Baidu Campus”鸟悴。
alert(stringArray.join(" "))
27.已知有字符串foo=”get-element-by-id”,寫一個function將其轉(zhuǎn)化成駝峰表示法”getElementById”
function combo(msg){
var arr=msg.split("-");
for(var i=1;i<arr.length;i++){
arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].substr(1,arr[i].length-1);
}
msg=arr.join("");
return msg;
}
28. 輸出今天的日期,以YYYY-MM-DD的方式奖年,比如今天是2014年9月26日细诸,則輸出2014-09-26
var d = new Date();
// 獲取年,getFullYear()返回4位的數(shù)字
var year = d.getFullYear();
// 獲取月陋守,月份比較特殊震贵,0是1月,11是12月
var month = d.getMonth() + 1;
var d = new Date();
// 獲取年水评,getFullYear()返回4位的數(shù)字
var year = d.getFullYear();
// 獲取月猩系,月份比較特殊,0是1月中燥,11是12月
var month = d.getMonth() + 1;
29. 將字符串”<tr><td>{$id}</td><td>{$name}</td></tr>”中的{$id}替換成10; {$name}替換成Tony (使用正則表達式)
"<tr><td>{$id}</td><td>{$id}_{$name}</td></tr>".replace(/{\$id}/g, '10').replace(/{\$name}/g, 'Tony');
30.為了保證頁面輸出安全寇甸,我們經(jīng)常需要對一些特殊的字符進行轉(zhuǎn)義,請寫一個函數(shù)escapeHtml,將<, >, &, “進行轉(zhuǎn)義
function escapeHtml(str) {
return str.replace(/[<>”&]/g, function(match) {
switch (match) {
case “<”:
return “<”;
case “>”:
return “>”;
case “&”:
return “&”;
case “\””:
return “"”;
}
});
}
31. foo = foo||bar 拿霉,這行代碼是什么意思式塌?為什么要這樣寫?
如果foo存在友浸,值不變峰尝,否則把bar的值賦給foo。
短路表達式:作為”&&”和”||”操作符的操作數(shù)表達式收恢,這些表達式在進行求值時武学,只要最終的結(jié)果已經(jīng)可以確定是真或假,求值過程便告終止伦意,這稱之為短路求值火窒。
32. 看下列代碼,將會輸出什么?(變量聲明提升)
var foo = 1;
(function(){
console.log(foo);
var foo = 2;
console.log(foo);
})()
答案:輸出undefined 和 2驮肉。上面代碼相當(dāng)于:
var foo = 1;
(function(){
var foo;
console.log(foo); //undefined
foo = 2;
console.log(foo); // 2;
})()
函數(shù)聲明與變量聲明會被JavaScript引擎隱式地提升到當(dāng)前作用域的頂部熏矿,但是只提升名稱不會提升賦值部分。
33. 用js實現(xiàn)隨機選取10–100之間的10個數(shù)字离钝,存入一個數(shù)組票编,并排序。
function randomNub(aArray, len, min, max) {
if (len >= (max - min)) {
return '超過' + min + '-' + max + '之間的個數(shù)范圍' + (max - min - 1) + '個的總數(shù)';
}
if (aArray.length >= len) {
aArray.sort(function(a, b) {
return a - b
});
return aArray;
}
var nowNub = parseInt(Math.random() * (max - min - 1)) + (min + 1);
for (var j = 0; j < aArray.length; j++) {
if (nowNub == aArray[j]) {
randomNub(aArray, len, min, max);
return;
}
}
aArray.push(nowNub);
randomNub(aArray, len, min, max);
return aArray;
var arr=[];
randomNub(arr,10,10,100);
34.把兩個數(shù)組合并卵渴,并刪除第二個元素慧域。
var array1 = ['a','b','c'];
var bArray = ['d','e','f'];
var cArray = array1.concat(bArray);
cArray.splice(1,1);
35.有這樣一個URL:http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e,請寫一段JS程序提取URL中的各個GET參數(shù)(參數(shù)名和參數(shù)個數(shù)不確定)浪读,將其按key-value形式返回到一個json結(jié)構(gòu)中昔榴,如{a:’1′, b:’2′, c:”, d:’xxx’, e:undefined}。
function URLParameter(str) {
var obj = {},
reg = /([^=?&]+)=([^=?&]+)/g;
str.replace(reg, function () {
var arg = arguments;
obj[arg[1]] = arg[2];
});
return obj;
}
36. 正則表達式構(gòu)造函數(shù)var reg=new RegExp(“xxx”)與正則表達字面量var reg=//有什么不同碘橘?匹配郵箱的正則表達式互订?
當(dāng)使用RegExp()構(gòu)造函數(shù)的時候,不僅需要轉(zhuǎn)義引號(即\”表示”)痘拆,并且還需要雙反斜杠(即\表示一個\)仰禽。使用正則表達字面量的效率更高。
郵箱的正則匹配:
var regMail = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/;
37. 寫一個function错负,清除字符串前后的空格坟瓢。
if (!String.prototype.trim) {
String.prototype.trim = function() {
return this.replace(/^\s+/, "").replace(/\s+$/,"");
}
}
//測試
var str = " \t\n test string ".trim();
alert(str == "test string"); // alerts "true"
38. 以下兩個變量a和b勇边,a+b的哪個結(jié)果是NaN犹撒?
A、var a=undefined; b=NaN
B粒褒、var a= ‘123’; b=NaN
C识颊、var a =undefined , b =NaN
D、var a=NaN , b='undefined'
39. 下面的JavaScript語句中,( )實現(xiàn)檢索當(dāng)前頁面中的表單元素中的所有文本框祥款,并將它們?nèi)壳蹇?/h3>
if(document.form.elements.type==”text”)
form.elements.value=”";
40. typeof運算符返回值中有一個跟javascript數(shù)據(jù)類型不一致清笨,它是
if(document.form.elements.type==”text”)
form.elements.value=”";
Array
41. 寫出函數(shù)DateDemo的返回結(jié)果,系統(tǒng)時間假定為今天
function DateDemo(){
var d, s="今天日期是:";
d = new Date();
s += d.getMonth() +1+ "/";
s += d.getDate() + "/";
s += d.getFullYear();
return s;
}
結(jié)果:今天日期是:7/21/2016
42. 寫出簡單描述html標(biāo)簽(不帶屬性的開始標(biāo)簽和結(jié)束標(biāo)簽)的正則表達式刃跛,并將以下字符串中的html標(biāo)簽去除掉
var reg = /<\/?\w+\/?>/gi;
var str = “<div>這里是div<p>里面的段落</p></div>”;
alert(str.replace(reg,”"));
43. 截取字符串a(chǎn)bcdefg的efg
alert('abcdefg'.substring(4));
44.簡述創(chuàng)建函數(shù)的幾種方式
//第一種(函數(shù)聲明):
function sum1(num1,num2){
return num1+num2;
}
//第二種(函數(shù)表達式):
var sum2 = function(num1,num2){
return num1+num2;
}
//第三種(函數(shù)對象方式):
var sum3 = new Function("num1","num2","return num1+num2");
45. Javascript如何實現(xiàn)繼承抠艾?
- 構(gòu)造繼承法
- 原型繼承法
- 實例繼承法
46. Javascript創(chuàng)建對象的幾種方式?
1桨昙、var obj = {};(使用json創(chuàng)建對象)
如:obj.name = '張三';
obj.action = function ()
{
alert('吃飯');
};
2检号、var obj = new Object();(使用Object創(chuàng)建對象)
如:obj.name = '張三';
obj.action = function ()
{
alert('吃飯');
};
3、通過構(gòu)造函數(shù)創(chuàng)建對象蛙酪。
(1)齐苛、使用this關(guān)鍵字
如:var obj = function (){
this.name ='張三';
this.age = 19;
this.action = function ()
{
alert('吃飯');
};
}
(2)、使用prototype關(guān)鍵字
如:function obj (){}
obj.prototype.name ='張三';
obj.prototype.action=function ()
{
alert('吃飯');
};
4桂塞、使用內(nèi)置對象創(chuàng)建對象凹蜂。
如:var str = new String("實例初始化String");
var str1 = "直接賦值的String";
var func = new Function("x","alert(x)");//示例初始化func
var obj = new Object();//示例初始化一個Object
47.哪些操作會造成內(nèi)存泄漏?
內(nèi)存泄漏指任何對象在您不再擁有或需要它之后仍然存在阁危。
垃圾回收器定期掃描對象玛痊,并計算引用了每個對象的其他對象的數(shù)量。如果一個對象的引用數(shù)量為 0(沒有其他對象引用過該對象)狂打,或?qū)υ搶ο蟮奈┮灰檬茄h(huán)的卿啡,那么該對象的內(nèi)存即可回收。
- setTimeout 的第一個參數(shù)使用字符串而非函數(shù)的話菱父,會引發(fā)內(nèi)存泄漏颈娜。
- 閉包
- 控制臺日志
- 循環(huán)(在兩個對象彼此引用且彼此保留時,就會產(chǎn)生一個循環(huán))
48.判斷一個字符串中出現(xiàn)次數(shù)最多的字符浙宜,統(tǒng)計這個次數(shù)
var str = 'asdfssaaasasasasaa';
var json = {};
for (var i = 0; i < str.length; i++) {
if(!json[str.charAt(i)]){
json[str.charAt(i)] = 1;
}else{
json[str.charAt(i)]++;
}
};
var iMax = 0;
var iIndex = '';
for(var i in json){
if(json[i]>iMax){
iMax = json[i];
iIndex = i;
}
}
alert('出現(xiàn)次數(shù)最多的是:'+iIndex+'出現(xiàn)'+iMax+'次');
49.寫一個獲取非行間樣式的函數(shù)
function getStyle(obj,attr,value)
{
if(!value)
{
if(obj.currentStyle)
{
return obj.currentStyle(attr);
}
else{
obj.getComputedStyle(attr,false);
}
}
else
{
obj.style[attr] = value;
}
}
50.字符串反轉(zhuǎn)官辽,如將 '12345678' 變成 '87654321'
//思路:先將字符串轉(zhuǎn)換為數(shù)組 split(),利用數(shù)組的反序函數(shù) reverse()顛倒數(shù)組粟瞬,再利用 jion() 轉(zhuǎn)換為字符串
var str = '12345678';
str = str.split('').reverse().join('');
51.將數(shù)字 12345678 轉(zhuǎn)化成 RMB形式 如: 12,345,678
//思路:先將數(shù)字轉(zhuǎn)為字符同仆, str= str + '' ;
//利用反轉(zhuǎn)函數(shù),每三位字符加一個 ','最后一位不加裙品; re()是自定義的反轉(zhuǎn)函數(shù)俗批,最后再反轉(zhuǎn)回去!
function re(str) {
str += '';
return str.split("").reverse().join("");
}
function toRMB(num) {
var tmp='';
for (var i = 1; i <= re(num).length; i++) {
tmp += re(num)[i - 1];
if (i % 3 == 0 && i != re(num).length) {
tmp += ',';
}
}
return re(tmp);
}
52. 生成5個不同的隨機數(shù)市怎;
//思路:5個不同的數(shù)岁忘,每生成一次就和前面的所有數(shù)字相比較,如果有相同的区匠,則放棄當(dāng)前生成的數(shù)字干像!
var num1 = [];
for(var i = 0; i < 5; i++){
num1[i] = Math.floor(Math.random()*10) + 1; //范圍是 [1, 10]
for(var j = 0; j < i; j++){
if(num1[i] == num1[j]){
i--;
}
}
}
53.去掉數(shù)組中重復(fù)的數(shù)字
方法一:
//思路:每遍歷一次就和之前的所有做比較,不相等則放入新的數(shù)組中!
//這里用的原型 個人做法麻汰;
Array.prototype.unique = function(){
var len = this.length,
newArr = [],
flag = 1;
for(var i = 0; i < len; i++, flag = 1){
for(var j = 0; j < i; j++){
if(this[i] == this[j]){
flag = 0; //找到相同的數(shù)字后速客,不執(zhí)行添加數(shù)據(jù)
}
}
flag ? newArr.push(this[i]) : '';
}
return newArr;
}
方法二:
var arr=[1,2,3,3,4,4,5,5,6,1,9,3,25,4];
Array.prototype.unique2 = function()
{
var n = []; //一個新的臨時數(shù)組
for(var i = 0; i < this.length; i++) //遍歷當(dāng)前數(shù)組
{
//如果當(dāng)前數(shù)組的第i已經(jīng)保存進了臨時數(shù)組,那么跳過五鲫,
//否則把當(dāng)前項push到臨時數(shù)組里面
if (n.indexOf(this[i]) == -1) n.push(this[i]);
}
return n;
}
var newArr2=arr.unique2(arr);
alert(newArr2); //輸出1,2,3,4,5,6,9,25
54.階乘函數(shù)溺职;
Number.prototype.N = function(){
var re = 1;
for(var i = 1; i <= this; i++){
re *= i;
}
return re;
}
var num = 5;
alert(num.N());
56.window.location.search() 返回的是什么?
http://localhost:8080/xxx?ver=1.0&id=123
返回值:?ver=1.0&id=timlq 也就是問號后面的部分
57. window.location.reload() 作用位喂?
刷新當(dāng)前頁面辅愿。
58. javascript 中的垃圾回收機制?
在Javascript中忆某,如果一個對象不再被引用点待,那么這個對象就會被GC回收。如果兩個對象互相引用弃舒,而不再 被第3者所引用癞埠,那么這兩個互相引用的對象也會被回收。因為函數(shù)a被b引用聋呢,b又被a外的c引用苗踪,這就是為什么 函數(shù)a執(zhí)行后不會被回收的原因。
59.精度問題: JS 精度不能精確到 0.1 所以 削锰。通铲。。器贩。同時存在于值和差值中
var n = 0.3,m = 0.2, i = 0.2, j = 0.1;
alert((n - m) == (i - j)); //false
alert((n-m) == 0.1); //false
alert((i-j)==0.1); //true
60.計算字符串字節(jié)數(shù):
new function(s){
if(!arguments.length||!s) return null;
if(""==s) return 0;
var l=0;
for(var i=0;i<s.length;i++){
if(s.charCodeAt(i)>255) l+=2; else l+=1; //charCodeAt()得到的是unCode碼
} //漢字的unCode碼大于 255bit 就是兩個字節(jié)
alert(l);
}("hello world!");
61. 匹配輸入的字符:第一個必須是字母或下劃線開頭颅夺,長度5-20
var reg = /^[a-zA-Z_][a-zA-Z0-9_]{5,20}/,
name1 = 'leipeng',
name2 = '0leipeng',
name3 = '你好leipeng',
name4 = 'hi';
alert(reg.test(name1));
alert(reg.test(name2));
alert(reg.test(name3));
alert(reg.test(name4));
63.你如何優(yōu)化自己的代碼?
代碼重用
避免全局變量(命名空間蛹稍,封閉空間吧黄,模塊化mvc..)
拆分函數(shù)避免函數(shù)過于臃腫
注釋
64. 使用js實現(xiàn)這樣的效果:在文本域里輸入文字時,當(dāng)按下enter鍵時不換行唆姐,而是替換成“{{enter}}”,(只需要考慮在行尾按下enter鍵的情況).
<html>
<head>
<script>
function back(ele,event){
event = event || window.event;
if(event.keyCode==13){
event.returnValue = false;
ele.value+="{{enter}}"
return false;
}
}
</script>
</head>
<body>
<textarea rows="3" cols="40" id="te" onkeypress="back(this,event);"></textarea>
</body>
</html>
65. 簡述readyonly與disabled的區(qū)別
ReadOnly和Disabled的作用是使用戶不能夠更改表單域中的內(nèi)容.
但是二者還是有著一些區(qū)別的:
- Readonly只針對input(text/password)和textarea有效僵娃,而disabled對于所有的表單元素有效彪薛,包括select,radio,checkbox,button等星掰。
- 在表單元素使用了disabled后骗奖,我們將表單以POST或者GET的方式提交的話,這個元素的值不會被傳遞出去声功,而readonly會將該值傳遞出去
66. 為什么擴展javascript內(nèi)置對象不是好的做法烦却?
因為你不知道哪一天瀏覽器或javascript本身就會實現(xiàn)這個方法,而且和你擴展的實現(xiàn)有不一致的表現(xiàn)减噪。到時候你的javascript代碼可能已經(jīng)在無數(shù)個頁面中執(zhí)行了數(shù)年短绸,而瀏覽器的實現(xiàn)導(dǎo)致所有使用擴展原型的代碼都崩潰了。筹裕。醋闭。
67. 什么是三元表達式?“三元”表示什么意思朝卒?
三元運算符:
三元如名字表示的三元運算符需要三個操作數(shù)证逻。
語法是 條件 ? 結(jié)果1 : 結(jié)果2;. 這里你把條件寫在問號(?)的前面后面跟著用冒號(:)分隔的結(jié)果1和結(jié)果2。滿足條件時結(jié)果1否則結(jié)果2抗斤。
68.變量的命名規(guī)范以及命名推薦
變量囚企,函數(shù),方法:小寫開頭瑞眼,以后的每個單詞首字母大寫 (駝峰)
構(gòu)造函數(shù)龙宏,class:每個單詞大寫開頭
基于實際情況,以動詞伤疙,名詞银酗,謂詞來命名。盡量言簡意駭徒像,以命名代替注釋
69.三種彈窗的單詞以及三種彈窗的功能
1.alert
//彈出對話框并輸出一段提示信息
function ale() {
//彈出一個對話框
alert("提示信息黍特!");
}
2.confirm
//彈出一個詢問框,有確定和取消按鈕
function firm() {
//利用對話框返回的值 (true 或者 false)
if (confirm("你確定提交嗎锯蛀?")) {
alert("點擊了確定");
}
else {
alert("點擊了取消");
}
}
3.prompt
//彈出一個輸入框灭衷,輸入一段文字,可以提交
function prom() {
var name = prompt("請輸入您的名字", ""); //將輸入的內(nèi)容賦給變量 name 旁涤,
//這里需要注意的是翔曲,prompt有兩個參數(shù),前面是提示的話劈愚,后面是當(dāng)對話框出來后部默,在對話框里的默認值
if (name)//如果返回的有內(nèi)容
{
alert("歡迎您:" + name)
}
}
70. 主流瀏覽器內(nèi)核
IE trident 火狐gecko 谷歌蘋果webkit Opera:Presto
71.JavaScript的循環(huán)語句有哪些?
for,for..in,while,do...while
72.閉包:下面這個ul造虎,如何點擊每一列的時候alert其index傅蹂?
<ul id="test">
<li>這是第一條</li>
<li>這是第二條</li>
<li>這是第三條</li>
</ul>
//js
window.onload = function() {
var lis = document.getElementById('test').children;
for (var i = 0; i < lis.length; i++) {
lis[i].onclick = (function(i) {
return function() {
alert(i)
};
})(i);
};
}
73.列出3條以上ff和IE的腳本兼容問題
- window.event:
表示當(dāng)前的事件對象,IE有這個對象算凿,F(xiàn)F沒有份蝴,F(xiàn)F通過給事件處理函數(shù)傳遞事件對象 - 獲取事件源
IE用srcElement獲取事件源,而FF用target獲取事件源 - 添加氓轰,去除事件
IE:element.attachEvent(“onclick”, function) element.detachEvent(“onclick”, function)
FF:element.addEventListener(“click”, function, true) element.removeEventListener(“click”, function, true) - 獲取標(biāo)簽的自定義屬性
IE:div1.value或div1[“value”]
FF:可用div1.getAttribute(“value”)
74. 在Javascript中什么是偽數(shù)組婚夫?如何將偽數(shù)組轉(zhuǎn)化為標(biāo)準(zhǔn)數(shù)組?
偽數(shù)組(類數(shù)組):無法直接調(diào)用數(shù)組方法或期望length屬性有什么特殊的行為署鸡,但仍可以對真正數(shù)組遍歷方法來遍歷它們案糙。典型的是函數(shù)的argument參數(shù)限嫌,還有像調(diào)用getElementsByTagName,document.childNodes之類的,它們都返回NodeList對象都屬于偽數(shù)組∈卑疲可以使用Array.prototype.slice.call(fakeArray)將數(shù)組轉(zhuǎn)化為真正的Array對象怒医。
75.請寫出一個程序,在頁面加載完成后動態(tài)創(chuàng)建一個form表單奢讨,并在里面添加一個input對象并給它任意賦值后義post方式提交到:http://127.0.0.1/save.php
window.onload=function(){
var form=document.createElement("form");
form.setAttribute("method", "post");
form.setAttribute("action", "http://127.0.0.1/save.php");
var input=document.createElement("input");
form.appendChild(input);
document.body.appendChild(form);
input.value="cxc";
form.submit();//提交表單
}
76.用JavaScript實現(xiàn)冒泡排序稚叹。數(shù)據(jù)為23、45拿诸、18扒袖、37、92亩码、13季率、24
//升序算法
function sort(arr){
for (var i = 0; i <arr.length; i++) {
for (var j = 0; j <arr.length-i; j++) {
if(arr[j]>arr[j+1]){
var c=arr[j];//交換兩個變量的位置
arr[j]=arr[j+1];
arr[j+1]=c;
}
};
};
return arr.toString();
}
console.log(sort([23,45,18,37,92,13,24]));
77.前端代碼優(yōu)化的方法
var User = {
count = 1,
getCount:function(){
return this.count;
}
}
console.log(User.getCount());
var func = User.getCount;
console.log(func());
1 undefined(因為是window對象執(zhí)行了func函數(shù));
78.用程序?qū)崿F(xiàn)找到html中id名相同的元素描沟?
<body>
<form id='form1'>
<div id='div1'></div>
<div id='div2'></div>
<div id='div3'></div>
<div id='div4'></div>
<div id='div5'></div>
<div id='div3'>id名重復(fù)的元素</div>
</form>
</body>
var nodes=document.querySelectorAll("#form1>*");
for(var i=0,len=nodes.length;i<len;i++){
var attr=nodes[i].getAttribute("id");
var s=1;
for(var j=i+1;j<len;j++){
if(nodes[j].getAttribute("id")==attr){
s++;
alert("id為:"+attr+"的元素出現(xiàn)"+s+"次");
}
}
}
79.程序中捕獲異常的方法蚀同?
window.error
try{}catch(){}finally{}
80.下列控制臺都輸出什么
//第1題:
function setName(){
name="張三";
}
setName();
console.log(name);
答案:"張三"
//第2題:
//考點:1、變量聲明提升 2啊掏、變量搜索機制
var a=1;
function test(){
console.log(a);
var a=1;
}
test();
答案:undefined
//第3題:
var b=2;
function test2(){
window.b=3;
console.log(b);
}
test2();
答案:3
//第4題:
c=5;//聲明一個全局變量c
function test3(){
window.c=3;
console.log(c); //答案:undefined蠢络,原因:由于此時的c是一個局部變量c,并且沒有被賦值
var c;
console.log(window.c);//答案:3迟蜜,原因:這里的c就是一個全局變量c
}
test3();
//第5題:
var arr = [];
arr[0] = 'a';
arr[1] = 'b';
arr[10] = 'c';
alert(arr.length); //答案:11
console.log(arr[5]); //答案:undefined
//第6題:
var a=1;
console.log(a++); //答案:1
console.log(++a); //答案:3
//第7題:
console.log(null==undefined); //答案:true
console.log("1"==1); //答案:true刹孔,因為會將數(shù)字1先轉(zhuǎn)換為字符串1
console.log("1"===1); //答案:false,因為數(shù)據(jù)類型不一致
//第8題:
typeof 1; "number"
typeof "hello"; "string"
typeof /[0-9]/; "object"
typeof {}; "object"
typeof null; "object"
typeof undefined; "undefined"
typeof [1,2,3]; "object"
typeof function(){}; //"function"
第9題:
parseInt(3.14); //3
parseFloat("3asdf"); //3
parseInt("1.23abc456"); //1
parseInt(true);// NaN
第10題:
//考點:函數(shù)聲明提前
function bar() {
return foo;
foo = 10;
function foo() {}
//var foo = 11;
}
alert(typeof bar());//"function"
第11題:
//考點:函數(shù)聲明提前
var foo = 1;
function bar() {
foo = 10;
return;
function foo() {}
}
bar();
alert(foo);//答案:1
第12題:
console.log(a);//是一個函數(shù)
var a = 3;
function a(){}
console.log(a);////3
第13題:
//考點:對arguments的操作
function foo(a) {
arguments[0] = 2;
alert(a);//答案:2娜睛,因為:a髓霞、arguments是對實參的訪問,b畦戒、通過arguments[i]可以修改指定實參的值
}
foo(1);
第14題:
function foo(a) {
alert(arguments.length);//答案:3方库,因為arguments是對實參的訪問
}
foo(1, 2, 3);
第15題
bar();//報錯
var foo = function bar(name) {
console.log("hello"+name);
console.log(bar);
};
console.log(typeof bar); undefined
foo("world");// helloworld
console.log(bar);// bar is not defined
console.log(foo.toString());
bar();//報錯
81. 請說出三種減低頁面加載時間的方法
- 壓縮css、js文件
- 合并js障斋、css文件纵潦,減少http請求
- 外部js、css文件放在最底下
- 減少dom操作垃环,盡可能用變量替代不必要的dom操作
82. 實現(xiàn)一個函數(shù)clone邀层,可以對JavaScript中的5種主要的數(shù)據(jù)類型(包括Number、String遂庄、Object寥院、Array、Boolean)進行值復(fù)制
// 方法一:
Object.prototype.clone = function(){
var o = this.constructor === Array ? [] : {};
for(var e in this){
o[e] = typeof this[e] === "object" ? this[e].clone() : this[e];
}
return o;
}
//方法二:
/**
* 克隆一個對象
* @param Obj
* @returns
*/
function clone(Obj) {
var buf;
if (Obj instanceof Array) {
buf = [];//創(chuàng)建一個空的數(shù)組
var i = Obj.length;
while (i--) {
buf[i] = clone(Obj[i]);
}
return buf;
}else if (Obj instanceof Object){
buf = {};//創(chuàng)建一個空對象
for (var k in Obj) { //為這個對象添加新的屬性
buf[k] = clone(Obj[k]);
}
return buf;
}else{ //普通變量直接賦值
return Obj;
}
}
83. 如何消除一個數(shù)組里面重復(fù)的元素涛目?
var arr=[1,2,3,3,4,4,5,5,6,1,9,3,25,4];
function deRepeat(){
var newArr=[];
var obj={};
var index=0;
var l=arr.length;
for(var i=0;i<l;i++){
if(obj[arr[i]]==undefined)
{
obj[arr[i]]=1;
newArr[index++]=arr[i];
}
else if(obj[arr[i]]==1)
continue;
}
return newArr;
}
var newArr2=deRepeat(arr);
alert(newArr2); //輸出1,2,3,4,5,6,9,25
84.定義一個log方法秸谢,讓它可以代理console.log的方法凛澎。
function log(msg) {
console.log(msg);
}
log("hello world!") // hello world!
如果要傳入多個參數(shù)呢?顯然上面的方法不能滿足要求估蹄,所以更好的方法是:
function log(){
console.log.apply(console, arguments);
};
到此塑煎,追問apply和call方法的異同。
85. 原生JS的window.onload與Jquery的$(document).ready(function(){})有什么不同元媚?如何用原生JS實現(xiàn)Jq的ready方法轧叽?
window.onload()方法是必須等到頁面內(nèi)包括圖片的所有元素加載完畢后才能執(zhí)行苗沧。
$(document).ready()是DOM結(jié)構(gòu)繪制完畢后就執(zhí)行刊棕,不必等到加載完畢。
/*
- 傳遞函數(shù)給whenReady()
- 當(dāng)文檔解析完畢且為操作準(zhǔn)備就緒時待逞,函數(shù)作為document的方法調(diào)用
*/
function ready(fn){
if(document.addEventListener) {//標(biāo)準(zhǔn)瀏覽器
document.addEventListener('DOMContentLoaded', function() {
//注銷事件, 避免反復(fù)觸發(fā)
document.removeEventListener('DOMContentLoaded',arguments.callee, false);
fn();//執(zhí)行函數(shù)
}, false);
}else if(document.attachEvent) {//IE
document.attachEvent('onreadystatechange', function() {
if(document.readyState == 'complete') {
document.detachEvent('onreadystatechange', arguments.callee);
fn();//函數(shù)執(zhí)行
}
});
}
};
86.(設(shè)計題)想實現(xiàn)一個對頁面某個節(jié)點的拖曳甥角?如何做?(使用原生JS)
回答出概念即可识樱,下面是幾個要點
給需要拖拽的節(jié)點綁定mousedown, mousemove, mouseup事件
mousedown事件觸發(fā)后嗤无,開始拖拽
mousemove時,需要通過event.clientX和clientY獲取拖拽位置怜庸,并實時更新位置
mouseup時当犯,拖拽結(jié)束
需要注意瀏覽器邊界的情況
87.數(shù)組和對象有哪些原生方法,列舉一下割疾?
Array.concat( ) 連接數(shù)組
Array.join( ) 將數(shù)組元素連接起來以構(gòu)建一個字符串
Array.length 數(shù)組的大小
Array.pop( ) 刪除并返回數(shù)組的最后一個元素
Array.push( ) 給數(shù)組添加元素
Array.reverse( ) 顛倒數(shù)組中元素的順序
Array.shift( ) 將元素移出數(shù)組
Array.slice( ) 返回數(shù)組的一部分
Array.sort( ) 對數(shù)組元素進行排序
Array.splice( ) 插入嚎卫、刪除或替換數(shù)組的元素
Array.toLocaleString( ) 把數(shù)組轉(zhuǎn)換成局部字符串
Array.toString( ) 將數(shù)組轉(zhuǎn)換成一個字符串
Array.unshift( ) 在數(shù)組頭部插入一個元素
Object.hasOwnProperty( ) 檢查屬性是否被繼承
Object.isPrototypeOf( ) 一個對象是否是另一個對象的原型
Object.propertyIsEnumerable( ) 是否可以通過for/in循環(huán)看到屬性
Object.toLocaleString( ) 返回對象的本地字符串表示
Object.toString( ) 定義一個對象的字符串表示
Object.valueOf( ) 指定對象的原始值
88. JS 怎么實現(xiàn)一個類。怎么實例化這個類
嚴格來講js中并沒有類的概念宏榕,不過js中的函數(shù)可以作為構(gòu)造函數(shù)來使用拓诸,通過new來實例化,其實函數(shù)本身也是一個對象麻昼。
89.在JS中有哪些會被隱式轉(zhuǎn)換為false
Undefined奠支、null、關(guān)鍵字false抚芦、NaN倍谜、零、空字符串
90.外部JS文件出現(xiàn)中文字符叉抡,會出現(xiàn)什么問題枢劝,怎么解決?
會出現(xiàn)亂碼卜壕,加charset=”utf-8”;
91.寫一個通用的事件偵聽器函數(shù)
markyun.Event = {
// 頁面加載完成后
readyEvent : function(fn) {
if (fn==null) {
fn=document;
}
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = fn;
} else {
window.onload = function() {
oldonload();
fn();
};
}
},
// 視能力分別使用dom0||dom2||IE方式 來綁定事件
// 參數(shù): 操作的元素,事件名稱 ,事件處理程序
addEvent : function(element, type, handler) {
if (element.addEventListener) {
//事件類型您旁、需要執(zhí)行的函數(shù)、是否捕捉
element.addEventListener(type, handler, false);
} else if (element.attachEvent) {
element.attachEvent('on' + type, function() {
handler.call(element);
});
} else {
element['on' + type] = handler;
}
},
// 移除事件
removeEvent : function(element, type, handler) {
if (element.removeEnentListener) {
element.removeEnentListener(type, handler, false);
} else if (element.datachEvent) {
element.detachEvent('on' + type, handler);
} else {
element['on' + type] = null;
}
},
// 阻止事件 (主要是事件冒泡轴捎,因為IE不支持事件捕獲)
stopPropagation : function(ev) {
if (ev.stopPropagation) {
ev.stopPropagation();
} else {
ev.cancelBubble = true;
}
},
// 取消事件的默認行為
preventDefault : function(event) {
if (event.preventDefault) {
event.preventDefault();
} else {
event.returnValue = false;
}
},
// 獲取事件目標(biāo)
getTarget : function(event) {
return event.target || event.srcElement;
},
// 獲取event對象的引用鹤盒,取到事件的所有信息蚕脏,確保隨時能使用event;
getEvent : function(e) {
var ev = e || window.event;
if (!ev) {
var c = this.getEvent.caller;
while (c) {
ev = c.arguments[0];
if (ev && Event == ev.constructor) {
break;
}
c = c.caller;
}
}
return ev;
}
};
92. JSON 的了解
JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式侦锯。它是基于JavaScript的一個子集驼鞭。數(shù)據(jù)格式簡單, 易于讀寫, 占用帶寬小
{'age':'12', 'name':'back'}