js部分面試題
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<style type="text/css">
</style>
</head>
<script type="text/javascript">
1:javascript的typeof返回哪些資料型別?*/
“undefined” ——未定義
“boolean”——布林值
“string”——字串
“number”——數值
“object”——物件或者null;
“function”——函式
2:如何判斷某變數是否為陣列資料型別?*/
/*判斷變數arr是不是陣列
方法一
*/
function isArray1(arr) {
return Object.prototype.toString.apply(arr) === '[object Array]';
}
/*判斷變數arr是不是陣列
方法二
*/
function isArray2(arr) {
if(arr === null || typeof arr === 'undefined'){
return false;
}
return arr.constructor === Array;
}
//測試變數
var a = null;
var b = "";
var c ;
var arr1 = [1,2,3];
var arr2 = new Array();
//列印測試結果
document.write("arr1變數是陣列型別,typeof arr1 === 'object'的結果是:"+(typeof arr1 === 'object'));
document.write("<br/>");
document.write("------------------------------------------------------------------------------------------------");
document.write("<br/>");
document.write("使用isArray1方法判斷結果如下:");
document.write("<br/>");
document.write("------------------------------------------------------------------------------------------------");
document.write("<br/>");
document.write("變數a是陣列型別的判斷結果是:"+isArray1(a));
document.write("<br/>");
document.write("變數b是陣列型別的判斷結果是:"+isArray1(b));
document.write("<br/>");
document.write("變數c是陣列型別的判斷結果是:"+isArray1(c));
document.write("<br/>");
document.write("變數arr1是陣列型別的判斷結果是:"+isArray1(arr1));
document.write("<br/>");
document.write("變數arr2是陣列型別的判斷結果是:"+isArray1(arr2));
document.write("<br/>");
document.write("------------------------------------------------------------------------------------------------");
document.write("<br/>");
document.write("使用isArray2方法判斷結果如下:");
document.write("<br/>");
document.write("------------------------------------------------------------------------------------------------");
document.write("<br/>");
document.write("變數a是陣列型別的判斷結果是:"+isArray2(a));
document.write("<br/>");
document.write("變數b是陣列型別的判斷結果是:"+isArray2(b));
document.write("<br/>");
document.write("變數c是陣列型別的判斷結果是:"+isArray2(c));
document.write("<br/>");
document.write("變數arr1是陣列型別的判斷結果是:"+isArray2(arr1));
document.write("<br/>");
document.write("變數arr2是陣列型別的判斷結果是:"+isArray2(arr2));
document.write("<br/>");
3.例舉3種強制型別轉換和2種隱式型別轉換?
強制(parseInt,parseFloat,number)
隱式(== - ===)
4.split() join() 的區別?
前者是切割成陣列的形式,後者是將陣列轉換成字串
5.陣列方法pop() push() unshift() shift()
Push()尾部新增 pop()尾部刪除
Unshift()頭部新增 shift()頭部刪除
6:當一個DOM節點被點選時候,我們希望能夠執行一個函式,應該怎麼做?
•直接在DOM裡繫結事件:<div onclick=”test()”></div>
•在JS裡通過onclick繫結:xxx.onclick = test
•通過事件新增進行繫結:addEventListener(xxx, ‘click’, test)
7:Javascript的事件流模型都有什麼?
•“事件冒泡”:事件開始由最具體的元素接受,然後逐級向上傳播
•“事件捕捉”:事件由最不具體的節點先接收,然後逐級向下,一直到最具體的
•“DOM事件流”:三個階段:事件捕捉,目標階段,事件冒泡
8.IE和DOM事件流的區別?
1.執行順序不一樣(IE中事件的執行順序是按新增的順序執行的;DOM是冒泡和捕捉)
2.引數不一樣(第三個引數的區別)
3.事件加不加on
4.this指向問題
9.IE和標準下有哪些相容性的寫法?
Var ev = ev || window.event
document.documentElement.clientWidth || document.body.clientWidth
Var target = ev.srcElement||ev.target
event.srcElement : 設定或獲取觸發事件的物件。
引用物件,這個物件有什麼屬性,就可以使用。
常用的有:
event.srcElement.TagName //事件物件的html標記
event.srcElement.innerText //事件物件的內文字
event.srcElement.value //表單事件物件的值
10.ajax請求的時候get 和post方式的區別?
一個在url後面 一個放在虛擬載體裡面
有大小限制
安全問題
應用不同 一個是論壇等只需要請求的,一個是類似修改密碼的
get:傳輸量小,快,不安全;
post:傳輸量大,慢,安全。
11.call和apply的區別?
Object.call(this,obj1,obj2,obj3)
Object.apply(this,arguments)
每個函式都有兩個非繼承而來的方法call和apply,這兩個方法的用途都是用來呼叫函式(在特定的作用域中),實際上等於函式體內的this物件的值。
兩者的區別:Object.call(this,obj1,obj2,obj3)
Object.apply(this,arguments) 推薦使用這種
Object.apply(this,[obj1,obj2,obj3])
好處:使用apply()函式的好處是,可以吧函式和物件之間進行解藕。
12.ajax請求時,如何解析json資料?
使用eval parse 鑑於安全性考慮 使用parse更靠譜
parse_ini_file() 函式解析一個配置檔案,並以陣列的形式返回其中的設定。
語法:parse_ini_file(file,process_sections)
引數:file:必需,規定要檢查的,ini,檔案
process_sections:可選。如果設定為 true,則返回一個多維陣列,包括了配置檔案中每一節的名稱和設定。預設是 false。
13:Ajax同步和非同步的區別,如何解決跨域問題?
第一種回答:
1) jsonp
2) iframe
3) window.name、window.postMessage
4) 伺服器上設定代理頁面
第二種回答:
document.domain+iframe
動態建立script標籤
第三種回答:
1、Web代理的方式。即使用者訪問A網站時所產生的對B網站的跨域訪問請求均提交到A網站的指定頁面,由該頁面代替使用者頁面完成互動,
從而返回合適的結果。此方案可以解決現階段所能夠想到的多數跨域訪問問題,但要求A網站提供Web代理的支援,因此A網站與B網站
之間必須是緊密協作的,且每次互動過程,A網站的伺服器負擔增加,且無法代使用者儲存session狀態。
2、on-Demand方式。MYMSN的門戶就用的這種方式,不過MYMSN中不涉及跨域訪問問題。動態控制script標記的生成,通過修改script
標記的src屬性完成對跨域頁面的呼叫。此方案存在的缺陷是,script的src屬性完成該呼叫時採取的方式時get方式,如果請求時傳遞
的字串過大時,可能會無法正常執行。不過此方案非常適合聚合類門戶使用。
3、iframe方式。檢視過醒來在javaeye上的一篇關於跨域訪問的帖子,他提到自己已經用iframe的方式解決了跨域訪問問題。資料提
交跟獲取,採用iframe這種方式的確可以了,但由於父視窗與子視窗之間不能互動(跨域訪問的情況下,這種互動被拒絕),因此無
法完成對父視窗效果的影響。
4、使用者本地轉儲方式:IE本身依附於windows平臺的特性為我們提供了一種基於iframe,利用記憶體來“繞行”的方案,即兩個window之
間可以在客戶端通過windows剪貼簿的方式進行資料傳輸,只需要在接受資料的一方設定Interval進行輪詢,獲得結果後清除Interval即可。
FF的平臺獨立性決定了它不支援剪貼簿這種方式,而以往版本的FF中存在的外掛漏洞又被fixed了,所以FF無法通過記憶體來完成暗渡陳倉。
而由於檔案操作FF也沒有提供支援(無法通過Cookie跨域完成資料傳遞),致使這種技巧性的方式只能在IE中使用。
5、結合了前面幾種方式,在訪問A網站時,先請求B網站完成資料處理,再根據返回的標識來獲得所需的結果。這種方法的缺點也很明顯,
B網站的負載增大了。優點,對session也實現了保持,同時A網站與B網站頁面間的互動能力增強了。最重要的一點,這種方案滿足了我的全部需要。
總結一下,以上方案中可選擇的情況下,我最推薦on-Demand方式,在不需要提交大量資料的情況下,這種方式能夠解決您的大部分問題。
14.寫一個獲取非行間樣式的函式?
寫法一:
function getStyle(obj,name){
if(obj.currentStyle){
return obj.currentStyle[name];
}
else{
return getComputedStyle(obj,false)[name]; //false是一個無用的引數
}
}
getStyle 函式有 2 個引數:
第一個引數 obj 為要獲取的物件,
第二個引數 name 為要獲取的屬性,並且做了相容處理, currentStyle 針對 IE 瀏覽器,getComputedStyle 針對火狐瀏覽器。
寫法二:
function getStyle(obj,attr,value){
if(!value){
if(obj.currentStyle){
return obj.currentStyle(attr)
}else{
obj.getComputedStyle(attr,false)
}
}else{
obj.style[attr]=value
}
}
15.事件委託是什麼?
事件委託(event delegation):利用事件冒泡的原理,讓自己的所觸發的事件,讓他的父元素代替執行!
解釋:使用事件委託技術能讓你避免對特定的每個節點新增事件監聽器;相反,事件監聽器是被新增到它們的父元素上。
事件監聽器會分析從子元素冒泡上來的事件,找到是哪個子元素的事件。
16.閉包是什麼,有什麼特性,對頁面有什麼影響?
閉包就是能夠讀取其他函式內部變數的函式。
影響:
由於閉包會使函式中的變數都被儲存到記憶體中,對記憶體的消耗很大,所以不能濫用閉包,否則會造成網頁的效能問題,在IE中可能導致記憶體洩露
17.如何阻止事件冒泡和預設事件?
if(event && event.stopPropagation){ //非IE
event.stopPropagation();
}else{ //IE
window.event.cancelBubble = true;
}
18. 新增、移除、移動、複製、建立和查詢節點的方法?
1)建立新節點
createDocumentFragment() //建立一個DOM片段
createElement() //建立一個具體的元素
createTextNode() //建立一個文字節點
2)新增、移除、替換、插入
appendChild() //新增
removeChild() //移除
replaceChild() //替換
insertBefore() //插入
3)查詢
getElementsByTagName() //通過標籤名稱
getElementsByName() //通過元素的Name屬性的值
getElementById() //通過元素Id,唯一性
getElementsByClassName() //通過元素的Class屬性的值
19.解釋jsonp的原理,以及為什麼不是真正的ajax?
動態建立script標籤,回撥函式
Ajax是頁面無重新整理請求資料操作
20.javascript的本地物件,內建物件和宿主物件?
本地物件為array obj regexp等可以new例項化
內建物件為gload Math 等不可以例項化的
宿主為瀏覽器自帶的document,window 等
21.document load 和document ready的區別?
Document.onload 是在結構和樣式載入完才執行js
Document.ready原生種沒有這個方法,jquery中有 $().ready(function)
22.”==”和“===”的不同?
返回值:相等true,不相等false
==是先轉換資料型別再進行比較,只要值相等,就相等;
===是不轉換資料型別進行等比較,必須是值相等,型別相等,才相等。
23.javascript的同源策略?
一段指令碼只能讀取來自於同一來源的視窗和文件的屬性,這裡的同一來源指的是主機名、協議和埠號的組合
24.編寫一個數組去重的方法?
function clearRepeatArray(arr){
for(var i=0;i<arr.length-1;i++){
for(var j=i+1;j<arr.length;j++){
if(arr[i]==arr[j]){
arr.splice(j,1);
break;
}
}
}
return arr;
}
26.排序演算法?
function paiXu(arr){
for(var i=0;i<arr.length-1;i++){
for(var j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
var temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
}
27:希望獲取到頁面中所有的checkbox怎麼做?(不使用第三方框架) ?
var domList = document.getElementsByTagName('input')
var checkBoxList = [];
var len = domList.length; //快取到區域性變數
while (len--) { //使用while的效率會比for迴圈更高
if (domList[len].type == 'checkbox') {
checkBoxList.push(domList[len]);
}
}
28:什麼是Ajax和JSON,它們的優缺點?
AJAX(Asynchronous JavaScript And XML):
即非同步JavaScript和XML,它不是一種新的程式語言即非同步JavaScript和XML,它不是一種新的程式語言,
而是一種用於創造更好更快以及互動性更強的Web應用程式技術(用於在web頁面中實現非同步資料互動)。
優點:
可以使得每一次請求更加迅捷,對於每一次請求返回的不是整個頁面,只僅僅是所需要的返回資料。
也就是可以使頁面不過載全部內容的情況下載入。避免使用者不斷重新整理或者跳轉頁面,提高使用者體驗 。
缺點:
對搜尋引擎不友好,(要實現ajax下的前後退功能成本較大,可能造成請求資料的增加跨域問題限制)
JSON(Java Script Object Notation):
是一種輕量級的資料交換格式,ECMA的一個子集。可在不同平臺之間進行資料交換,是資料的載體。
是一種輕量級的資料交換格式,ECMA的一個子集。可在不同平臺之間進行資料交換,是資料的載體。
優點:
輕量級的資料交換格式, 易於人的的閱讀和編寫,佔用寬頻小; 便於機器(JavaScript)解析,
(可以通過簡單的eval()進行json資料的讀取)和生成 ,支援複合資料型別(陣列,物件,字串,數字) 支援多種語言;
缺點:沒有XML格式這麼推廣的深入人心和喜用廣泛,沒有XML那麼通用性。
JSON格式目前在Web Service中推廣還屬於初級階段
29:有這樣一個URL:http://item.taobao.com /item.htm?a=1&b=2&c=&d=xxx&e,
請寫一段JS程式提取URL中的各個GET引數(引數名和 引數個數不確定),將其按key-value形式返回到一個json結構中,
如{a:’1′, b:’2′ , c:”, d:’xxx’, e:undefined}?*/
function test(){
var url="http://item.taobao.com /item.htm?a=1&b=2&c=&d=xxx&e";
//找到問號的下標,擷取下標加1之後的字元
var index=url.lastIndexOf("?");
var str=url.substring(index+1);
//1、split("&")變成陣列
var arr = str.split("&");
//2、遍歷陣列
for(var i=0;i<arr.length;i++){
if(arr[i].indexOf("=")>-1){//如果元素有等號;把等號替換成:" 再在最後拼接 "
//a=1 --》 a:"1"
arr[i]=arr[i].replace("=",":\"")+"\"";
}else{
//如果元素沒有等號,直接在後面拼接 :undefined;
//e --》 e:undefined;
arr[i]=arr[i]+":undefined";
}
}
//3、把陣列的每個元素用join拼接成字串 resultStr;
var resultStr = arr.join(",");
//4、在resultStr的兩端分別拼接上 左花括號和右花括號
resultStr = "{"+resultStr+"}";
//5、把json的字串形式變成物件;
var keyValueJson = eval("("+resultStr+")");
console.log(keyValueJson.a);
console.log(keyValueJson.b);
console.log(keyValueJson.c);
console.log(keyValueJson.d);
console.log(keyValueJson.e);
}
30:正則表示式建構函式var reg=new RegExp(“xxx”)與正則表達字面量var reg=//有什麼不同?匹配郵箱的正則表示式?*/
當使用RegExp()建構函式的時候,不僅需要轉義引號(即\”表示”),並且還需要雙反斜槓(即\\表示一個\)。使用正則表達字面量的效率更高。
var regMail = /^([a-zA-Z0-9_-])[email protected]([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/;
var regMail = /^\[email protected]\w+(\.(net|com|cn))+$/;
31:.Javascript中callee和caller的作用?
caller是返回一個對函式的引用,該函式呼叫了當前函式;
callee是返回正在被執行的function函式,也就是所指定的function物件的正文。
案例:
那麼問題來了?如果一對兔子每月生一對兔子;一對新生兔,從第二個月起就開始生兔子;
假定每對兔子都是一雌一雄,試問一對兔子,第n個月能繁殖成多少對兔子?(使用callee完成)
var result=[];
function fn(n){ //典型的斐波那契數列
if(n==1){
return 1;
}else if(n==2){
return 1;
}else{
if(result[n]){
return result[n];
}else{
//argument.callee()表示fn()
result[n]=arguments.callee(n-1)+arguments.callee(n-2);
return result[n];
}
}
}
32: 下面這個ul,如何點選每一列的時候alert其index?(閉包)?
<ul id=”test”>
<li>這是第一條</li>
<li>這是第二條</li>
<li>這是第三條</li>
</ul>*/
var lis;
window.onload = function(){
lis = document.getElementById("test").children;
for(var i=0;i<lis.length;i++){
lis[i].onclick = demo;
}
}
function demo(){
for(var i=0;i<lis.length;i++){
lis[i].ord = i;
function liIndex(){
alert(this.ord);
}
lis[i].onclick = liIndex;
}
}
33: 給String物件新增一個方法,傳入一個string型別的引數,然後將string的每個字元間價格空格返回,例如:
addSpace(“hello world”) // -> ‘h e l l o w o r l d’*/
function addSpace(str){
var newStr = "";
for(var i=0;i<str.length;i++){
newStr += str.charAt(i);
if(str.charAt(i)!=" "){
newStr += " ";
}
}
return newStr.substring(0,newStr.length-1);
}
function test(){
var s = addSpace("hello world");
alert(s);
}
34:函式宣告與函式表示式的區別?
// 函式宣告
function funDeclaration(type){
return type==="Declaration";
}
// 函式表示式
var funExpression = function(type){
return type==="Expression";
}
案例:
funDeclaration("Declaration"); //=> true
function funDeclaration(type){
return type==="Declaration";
}
funExpression("Expression"); //=>false
var funExpression = function(type){
return type==="Expression";
}
結論:
用函式宣告建立的函式funDeclaration可以在funDeclaration定義之前就進行呼叫;
而用函式表示式建立的funExpression函式不能在funExpression被賦值之前進行呼叫。
為什麼會這樣呢?!這就要理解Javascript Function兩種型別的區別:
用函式宣告建立的函式可以在函式解析後呼叫(解析時進行等邏輯處理);
而用函式表示式建立的函式是在執行時進行賦值,且要等到表示式賦值完成後才能呼叫。
35:在Javascript中什麼是偽陣列?如何將偽陣列轉化為標準陣列?
偽陣列(類陣列):
無法直接呼叫陣列方法或期望length屬性有什麼特殊的行為,但仍可以對真正陣列遍歷方法來遍歷它們。
典型的是函式的argument引數,還有像呼叫getElementsByTagName,document.childNodes之類的,它們都回NodeList物件都屬於偽陣列。
可以使用Array.prototype.slice.call(fakeArray)將陣列轉化為真正的Array物件。
在 JavaScript 中, 函式中的隱藏變數 arguments 和用 getElementsByTagName 獲得的元素集合(NodeList)都不是真正的陣列,
不能使用 push 等方法,在有這種需要的時候只能先轉換為真正的陣列。
對於 arguments,可以使用 Array.prototype.slice.call(arguments); 來達到轉換的目的,
但對於 NodeList 則不行了,其在 IE8 及以下將會報錯,只能說其 JS 引擎有所限制。
因此,如果需要把 NodeList 轉換為真正的陣列,則需要做下相容處理。
function makeArray(c) {
try{
return Array.prototype.slice.call(c);
}catch(e){
var ret = [];
var len = c.length;
for(var i=0;i<len;i++) {
ret[i] = c[i];
}
return ret;
}
}
36:想實現一個對頁面某個節點的拖曳?如何做?(使用原生JS)?
/*
1.給需要拖拽的節點繫結mousedown, mousemove, mouseup事件
2.mousedown事件觸發後,開始拖拽
3.mousemove時,需要通過event.clientX和clientY獲取拖拽位置,並實時更新位置
4.mouseup時,拖拽結束
5.需要注意瀏覽器邊界的情況
*/
37:var numberArray = [3,6,2,4,1,5]; (考察基礎API)?
1) 實現對該陣列的倒排,輸出[5,1,4,2,6,3]
2) 實現對該陣列的降序排列,輸出[6,5,4,3,2,1]*/
var numberArray = [3,6,2,4,1,5];
numberArray.reverse(); // 5,1,4,2,6,3 reverse() 方法用於顛倒陣列中元素的順序。
numberArray.sort(function(a,b){ //6,5,4,3,2,1
return b-a;
});
38:.將字串”<tr><td>{$id}</td><td>{$name}</td></tr>”中的{$id}替換成10,{$name}替換成Tony (使用正則表示式)?*/
"<tr><td>{id}</td><td>{id}</td><td>{id}_{$name}</td></tr>".replace(/{\$id}/g, '10').replace(/{\$name}/g, 'Tony');
39:foo = foo||bar ,這行程式碼是什麼意思?為什麼要這樣寫?*/
if(!foo) foo = bar; //如果foo存在,值不變,否則把bar的值賦給foo。
短路表示式:
作為"&&"和"||"操作符的運算元表示式,這些表示式在進行求值時,只要最終的結果已經可以確定是真或假,求值過程便告終止,這稱之為短路求值。
40:為了保證頁面輸出安全,我們經常需要對一些特殊的字元進行轉義,請寫一個函式escapeHtml,將<, >, &, “進行轉義?*/
function escapeHtml(str) {
return str.replace(/[<>"&]/g, function(match) {
switch (match) {
case "<":
return "<";
case ">":
return ">";
case "&":
return "&";
case "\"":
return """;
}
});
}
41:寫一個function,清除字串前後的空格。(相容所有瀏覽器)?
使用自帶介面trim(),考慮相容性:
if (!String.prototype.trim) {
String.prototype.trim = function() {
return this.replace(/^\s+/, "").replace(/\s+$/,"");
}
}
// test the function
var str = " \t\n test string ".trim();
alert(str == "test string"); // alerts "true"
42:Javascript中callee和caller的作用?
caller是返回一個對函式的引用,該函式呼叫了當前函式;
callee是返回正在被執行的function函式,也就是所指定的function物件的正文。
43:談一談你對javascript的理解,javascript能做什麼?
理解:
1. javascript是主要用在web中的一種動態的解析型語言。
2. 可以改變網頁裡的資料,根據使用者點選等操作告訴伺服器可以動態的改變網頁的大小。
3. JavaScript是一種基於物件和事件驅動並具有相對安全性的客戶端指令碼語言,是一種輕量級的程式語言。
同時也是一種廣泛用於客戶端Web開發的指令碼語言,常用來給HTML網頁新增動態功能,比如響應使用者的各種操作,
可以將動態的文字放入 HTML 頁面, 可以對事件作出響應, 可以讀寫 HTML 元素, 可被用來驗證資料, 可被用來檢測訪問者的瀏覽器, 可被用來建立 cookies
語法:
1. 要記住JavaScript是一門面向物件的語言,JavaScript 中所有變數都是物件,除了兩個例外 null 和 undefined。注意數字也是物件
2. 要記住JavaScript中函式是一等公民。比如在Java這樣的基於類的程式語言中,每個方法不能獨立存在,必須定義在某個類中,而Javascript中是可以單獨定義函式的。
3. 要記住JavaScript不是基於類的面嚮物件語言,它是基於原型的。現在的主流的面向物件的程式語言都是基於類來設計的,
所以很多人難以理解一門面向物件語言裡為什麼會沒有類。但實際上基於類還是基於原型(Prototype)都只是面向物件程式語言的不同的實現風格。
44:在javascript中如何檢測客戶端的瀏覽器和作業系統型別?
Navigator物件包含了Web瀏覽器的基本資訊(如名稱,版本,作業系統等)
通過window.navigator方式可以引用該物件,並利用它的屬性讀取客戶端基本資訊
Navigator的5個主要屬性:
appName:Web瀏覽器的名稱
appVersion:瀏覽器的版本號和其他版本資訊
userAgent:瀏覽器在它的USER-AGENT HTTP標題中傳送的字串。該屬性包含appName,appVersion屬性的所有資訊
appCodeName:瀏覽器的程式碼名
platform:客戶瀏覽器所在的作業系統
案例:
<script type="text/javascript">
var appname = navigator.appName;
var appversion = navigator.appVersion;
var useragent = navigator.userAgent;
var appcodename = navigator.appCodeName;
var platform = navigator.platform;
document.write(appname+"<br>"+appversion+"<br>"+useragent+"<br>"+appcodename+"<br>"+platform);
</script>
45:Cookie在客戶機上是如何儲存的?
理解:
Cookies就是伺服器暫存放在你的電腦裡的文字檔案,好讓伺服器用來辨認你的計算機。當你在瀏覽網站的時候,
Web伺服器會先送一小小資料放在你的計算機上,Cookies 會幫你在網站上所打的文字或是一些選擇都記錄下來。
當下次你再訪問同一個網站,Web伺服器會先看看有沒有它上次留下的Cookies資料,
有的話,就會依據Cookie裡的內容來判斷使用者,送出特定的網頁內容給你。
46:Prompt box是什麼?它的返回值有什麼用?
提示框 (prompt()):
1. prompt() 方法用於顯示可提示使用者進行輸入的對話方塊。如果使用者單擊提示框的取消按鈕,則返回 null。
如果使用者單擊確認按鈕,則返回輸入欄位當前顯示的文字。
2. 在使用者點選確定按鈕或取消按鈕把對話方塊關閉之前,它將阻止使用者對瀏覽器的所有輸入。
在呼叫 prompt() 時,將暫停對 JavaScript 程式碼的執行,在使用者作出響應之前,不會執行下一條語句。
47:如何獲取javascript所能表示的最大值和最小值?
alert(Math.max.apply(null, a));//最大值
alert(Math.min.apply(null, a));//最小值
48:Null和Undefined有和區別與聯絡?
/*
概念:
null :
這是一個物件,但是為空。因為是物件,所以 typeof null 返回 'object' 。
null 是 JavaScript 保留關鍵字。
null 參與數值運算時其值會自動轉換為 0 ,因此,下列表達式計算後會得到正確的數值:
案例:
表示式:123 + null結果值:123
表示式:123 * null結果值:0
undefined :
undefined是全域性物件(window)的一個特殊屬性,其值是未定義的。但 typeof undefined 返回 'undefined' 。
雖然undefined是有特殊含義的,但它確實是一個屬性,而且是全域性物件(window)的屬性。
JavaScript的最初版本是這樣區分的:null是一個表示"無"的物件,轉為數值時為0;
undefined是一個表示"無"的原始值,轉為數值時為NaN。
目前:null和undefined基本是同義的,只有一些細微的差別。
具體區別:
null表示"沒有物件",即該處不應該有值。
典型用法是:
(1) 作為函式的引數,表示該函式的引數不是物件。
(2) 作為物件原型鏈的終點。
事例:
Object.getPrototypeOf(Object.prototype) // null
undefined表示"缺少值",就是此處應該有一個值,但是還沒有定義。
典型用法是:
(1)變數被聲明瞭,但沒有賦值時,就等於undefined。
(2)呼叫函式時,應該提供的引數沒有提供,該引數等於undefined。
(3)物件沒有賦值的屬性,該屬性的值為undefined。
(4)函式沒有返回值時,預設返回undefined。
事例:
var i;
console.log(i); // undefined;
function f(x){ console.log(x); }
f(); // undefined
var o = new Object();
o.p; // undefined
function x = f();
x; // undefined
*/
/**
49:如何理解javascript中的variable typing,試用程式碼說明?*/
/* 變數型別(variable typing)
js的基本資料型別:number(數字型別),string(字串),boolean(布林型別 true/false)
//null(空型別只有一個值null)在使用typeof測試型別時,返回object。
//undefine(未定義型別)未定義型別只有一個值underfine
*/
/**
50:如何理解javascript中的物件?*/
/* 萬物皆物件
概述:
在js中,物件是擁有屬性和方法的資料
屬性:描述物件的特徵,一般是名詞;
方法:描述物件的功能,一般是動詞。
拓展:類和物件
類就是型別,就是資料型別和自定義型別
物件就是變數
*/
</script>
<body>
</body>
</html>