1. 程式人生 > >js部分面試題

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 "&lt;";

case ">":

return "&gt;";

case "&":

return "&amp;";

case "\"":

return "&quot;";

}

});

}

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>