真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

javascript助手,JAVASCRIPT前端招聘

請教:js和jsp一樣嗎?如果不一樣,他們有什么區(qū)別?

jsp與asp php是同一個級別的,都是運行在服務(wù)器里的腳本格式。

成都創(chuàng)新互聯(lián)公司成都企業(yè)網(wǎng)站建設(shè)服務(wù),提供網(wǎng)站設(shè)計、網(wǎng)站制作網(wǎng)站開發(fā),網(wǎng)站定制,建網(wǎng)站,網(wǎng)站搭建,網(wǎng)站設(shè)計,成都響應(yīng)式網(wǎng)站建設(shè),網(wǎng)頁設(shè)計師打造企業(yè)風格網(wǎng)站,提供周到的售前咨詢和貼心的售后服務(wù)。歡迎咨詢做網(wǎng)站需要多少錢:028-86922220

javascript 是直接運行在客戶端的腳本語言。

首先,javascript是netscape發(fā)明的,提交給ECMA組織進行標準化,JavaScript在不斷的修訂,從1.0到1.1、1.2、1.3、1.5,而ECMAScript也在不斷的升級,有Edition 1、2、3,其中Edition 3相當于JavaScript 1.5。雖然MS后來參與了標準化,但還是以NS為主導的。目前正在制定的Edition 4也將以Netscape正在制定的JavaScript 2.0協(xié)同開發(fā)。順便說一下,jscript的文檔在Windows Script 5.6(包含jscript、vbscript和windows host script編譯器)之前是很差的,就是因為ms只是在抄襲而又沒抄全。在我的《javascript隱藏秘技》中,還指出了ms的jscript的幾處實現(xiàn)上的bug(與ECMAScript標準的不一致)。

javascript還有一些其他的實現(xiàn),比如apache的許多項目,比如resin的jsp實現(xiàn)了js 1.3(類似jscript用于asp)。注意jsp只是一個服務(wù)器腳本語言的規(guī)范,并沒有規(guī)定一定要用java,事實上有不少jsp engine支持額外的腳本語言,尤其是支持js居多。

DOM和jscript是分離的。W3C DOM 和DHTML也不是一回事。在IE 5之前,jscript只支持MS專有的DHTML(NS也有自己的專有DHTML用于NN系列,MS是仿造它的),但是DOM(文檔對象模型)是W3C制定的標準,不是MS的!到目前為止,仍然是Mozilla(Netscape)對DOM的支持最好(支持所有的DOM Level 1和大多數(shù)DOM Level 2特性),IE 6只支持了絕大多數(shù)的DOM Level 1和極少的DOM Level 2特性。

簡單的說,一個jsp程序員必須要是一個Java程序員。而一個能寫javaScript的就不一定了!呵呵

javascrip只是從java語言中提取出來的一部分冬冬,在網(wǎng)頁中用javascript這個東西很不好的,最好不用

有很多很多介紹和說明

前端開發(fā)常用又好用的幾個軟件

正所謂“工欲善其事必先利其器”,一名合格的Web前端開發(fā)工程師自然會用到不少能使其工作高效的工具。下面,就給大家分享Web前端學習需要了解的十款HTML5開發(fā)工具。

1、Lungo

Lungo是一款基于HTML5的開發(fā)框架,專為想要設(shè)計、構(gòu)建和共享跨設(shè)備應(yīng)用的開發(fā)者而準備。支持開放的Web標準,如HTML5、CSS3和JavaScript;支持手機、電視以及桌面設(shè)備。擁有強大的JavaScript API:開發(fā)WebAPP應(yīng)用有很多種方式,而不是一味的優(yōu)化。Lungo提供了一個強大的API,這樣你可以完全掌控自己的WebAPP應(yīng)用程序。

2、Animatron

Animatron是一款簡單而又強大的在線工具,通過它,你可以創(chuàng)建出令人驚嘆的的HTML5動畫和互動內(nèi)容。使用非常直觀的Animatron編輯器去設(shè)計和發(fā)布完美的移動產(chǎn)品,同時也可以到處播放的電影和信息圖表等,從桌面瀏覽器到移動設(shè)備,無需編碼,所見即所得。

3、DCloudHBuilder

DCloudHBuilder:基于HTML5開發(fā)工具是當前最快的HTML開發(fā)工具,強大的代碼助手幫你快速完成開發(fā),最全的語法庫和瀏覽器兼容性數(shù)據(jù)讓瀏覽器碎片化不再頭痛,DCloud 還提供云端打包服務(wù),可以讓開發(fā)者直接在云端生成 .ipa 或 .apk 安裝包供部署調(diào)試。

4、mobl

mobl 是一個新的開源的編程語言,主要用于加速手機應(yīng)用的開發(fā),mobl 可方便構(gòu)建手機 Web 應(yīng)用程序,包括 iOS、Android 和其他支持 HTML5 技術(shù)的手機。Mobl使用一種與JavaScript非常類似的腳本語言實現(xiàn)了靜態(tài)類型的推斷語言。該語言擁有以下頂級結(jié)構(gòu): 實體(entities)、類型(types)、函數(shù)(functions)、控件(controls)、屏幕(screens)、樣式(styles )和設(shè)備(services)。實體是在本地存儲中持久化的數(shù)據(jù)元素,而類型是一種供我們使用的不穩(wěn)定的數(shù)據(jù)。函數(shù)與那些定義在JavaScript以及能夠調(diào)用JavaScript代碼的語言中的函數(shù)類似等。

5、Initializr

Initializr 是制作 HTML5 網(wǎng)站最好的入門輔助開發(fā)工具,你可以使用提供的特色模板快速生成網(wǎng)站,也可以自定義,Initializr 會為你生成代碼簡潔的可定制的網(wǎng)頁模板。

6、WebStorm

WebStorm是一款強大的HTML5/JavaScriptWeb前端開發(fā)工具,被廣大JS開發(fā)者譽為“Web前端開發(fā)神器”。

WebStorm 8全新特性中包括對AngularJS的支持,能夠高效準確地智能感知Angular語法、指令。WebStorm還完美支持Spy-js,合并了這款JavaScript調(diào)試利器,大大提高了開發(fā)者們的工作效率。

7、Notepad++

Notepad++程序員必備的文本編輯器,軟件小巧高效,支持27種編程語言,通吃C,C++ ,Java ,C#, XML, HTML, PHP,JS 等,推薦各位下載使用。Notepad++ 可完美地取代微軟的記事本。

8、Dreamweaver

Dreamweaver 是世界頂級軟件廠商Adobe推出的一套擁有可視化編輯界面,用于制作并編輯網(wǎng)站和移動應(yīng)用程序的網(wǎng)頁設(shè)計軟件。由于它支持代碼、拆分、設(shè)計、實時視圖等多種方式來創(chuàng)作、編寫和修改網(wǎng)頁,對于初級人員,你可以無需編寫任何代碼就能快速創(chuàng)建Web頁面。其成熟的代碼編輯工具更適用于Web開發(fā)高級人員的創(chuàng)作!

9、Eclipse

Eclipse的本身只是一個框架平臺,但是眾多插件的支持使得Eclipse擁有其他功能相對固定的IDE軟件很難具有的靈活性。許多軟件開發(fā)商以Eclipse為框架開發(fā)自己的IDE。Eclipse最初是由IBM公司開發(fā)的替代商業(yè)軟件Visual Age for Java的下一代ide開發(fā)環(huán)境,2001年11月貢獻給開源社區(qū),現(xiàn)在它由非營利軟件供應(yīng)商聯(lián)盟Eclipse基金會(Eclipse Foundation)管理。

10、DevExtreme

DevExtreme是專為你的移動世界精心準備的,一個跨平臺開發(fā)的HTML5/JS框架,可以構(gòu)建iOS、Android、Tizen和Windows Phone 8應(yīng)用程序,是Visual Studio開發(fā)人員開發(fā)跨平臺移動產(chǎn)品的優(yōu)選工具。

以上就是為大家分享的十款HTML5開發(fā)必備的工具,相信這些工具一定會讓你幫你在從事Web前端開發(fā)過程中提高效率,打開一扇新的大門。

百度網(wǎng)盤直鏈下載助手JS腳本無法使用,新的Microsoft Edge瀏覽器怎么辦?

把文件保存到自己的網(wǎng)盤

點擊下載助手-API下載-直接下載,如果不能下載,試試顯示鏈接,有4個備用鏈接。

qBittorrent只支持BT或者PT下載

可以利用IDM下載

JavaScript清除歷史記錄的一點問題

1.不要做任何假設(shè)

(JavaScript是一個不可靠的助手)

可能不唐突的JavaScript 的最重要的一個特性就是——你要停止任何假設(shè):

* 不要假設(shè)JavaScript是可用的,你最好認為它很有可能是不可用的,而不是直接依賴于它。

* 在你經(jīng)過測試確認一些方法和屬性可以使用之前,不要假設(shè)瀏覽器支持它們。

* 不要假設(shè)HTML代碼如你想象的那樣正確,每次都要進行檢查,并且當其不可用的時候就什么也不要做。

* 讓JavaScript的功能獨立于輸入設(shè)備

* 要記住其他的腳本可能會影響你的JavaScript的功能,所以要保證你的腳本的作用域盡可能地安全。

在開始設(shè)計你的腳本之前,要考慮的第一件事情就是檢查一下你要為其編寫腳本的HTML代碼,看看有什么東西可以幫助你達到目的。

2.找出鉤子和節(jié)點關(guān)系

(HTML是腳本的基石)

在開始編寫腳本之前,要先看一下你要為之編寫JavaScript的HTML。如果HTML是未經(jīng)組織的或者未知的,那么你幾乎不可能有一個好的腳本編寫方案——很可能就會出現(xiàn)下面的情況:要么是會用JavaScript創(chuàng)建太多標記,要么就是應(yīng)用太依賴于JavaScript。

在HTML中有一些東西需要考慮,那就是鉤子和節(jié)點關(guān)系。

1.HTML 鉤子

HTML最初的和最重要的鉤子就是ID,而且ID可以通過最快的DOM方法——getElementById 訪問到。如果在一個有效的HTML文檔中所有的ID都是獨一無二的話(在IE中關(guān)于name 和 ID 有一個bug,不過有些好的類庫解決了這個問題),使用ID就是安全可靠的,并且易于測試。

其他一些鉤子就是是HTML元素和CSS類,HTML元素可以通過getElementsByTagName方法訪問,而在多數(shù)瀏覽器中都還不能通過原生的DOM方法來訪問CSS類。不過,有很多外部類庫提供了可以訪問CSS類名(類似于 getElementsByClassName) 的方法。

2.HTML 節(jié)點關(guān)系

關(guān)于HTML的另外比較有意思的一點就是標記之間的關(guān)系,思考下面的問題:

* 要怎樣才可以最容易地、通過最少的DOM遍歷來到達目標節(jié)點?

* 通過修改什么標記,可以盡可能多地訪問到需要修改的子節(jié)點?

* 一個給定的元素有什么屬性或信息可以用來到達另外一個元素?

遍歷DOM很耗資源而且速度很慢,這就是為什么要盡量使用瀏覽器中已經(jīng)在使用的技術(shù)來做這件事情。

3.把遍歷交給專家來做

(CSS,更快地遍歷DOM)

有關(guān)DOM的腳本和使用方法或?qū)傩裕╣etElementsByTagName, nextSibling, previousSibling, parentNode以及其它)來遍歷DOM似乎迷惑了很多人,這點很有意思。而有趣的是,我們其實早已經(jīng)通過另外一種技術(shù)—— CSS ——做了這些事情。

CSS 是這樣一種技術(shù),它使用CSS選擇器,通過遍歷DOM來訪問目標元素并改變它們的視覺屬性。一段復(fù)雜的使用DOM的JavaScript可以用一個CSS選擇器取代:

Java代碼 var n = document.getElementById('nav'); if(n){ var as = n.getElementsByTagName('a'); if(as.length 0){ for(var i=0;as[i];i++){ as[i].style.color = ‘#369′; as[i].style.textDecoration = ‘none’; } } } /* 下面的代碼與上面功能一樣 */ #nav a{ color:#369; text-decoration:none; } var n = document.getElementById('nav'); if(n){ var as = n.getElementsByTagName('a'); if(as.length 0){ for(var i=0;as[i];i++){ as[i].style.color = ‘#369′; as[i].style.textDecoration = ‘none’; } } } /* 下面的代碼與上面功能一樣 */ #nav a{ color:#369; text-decoration:none; }

這是一個可以好好利用的很強大的技巧。你可以通過動態(tài)為DOM中高層的元素添加class 或者更改元素ID來實現(xiàn)這一點。如果你使用DOM為文檔的body添加了一個CSS類,那么設(shè)計師就很可以容易地定義文檔的靜態(tài)版本和動態(tài)版本。

Java代碼 JavaScript: var dynamicClass = 'js'; var b = document.body; b.className = b.className ? b.className + ' js' : 'js'; CSS: /* 靜態(tài)版本 */ #nav { .... } /* 動態(tài)版本 */ body.js #nav { .... } JavaScript: var dynamicClass = 'js'; var b = document.body; b.className = b.className ? b.className + ' js' : 'js'; CSS: /* 靜態(tài)版本 */ #nav { .... } /* 動態(tài)版本 */ body.js #nav { .... }

4.理解瀏覽器和用戶

(在既有的使用模式上創(chuàng)建你所需要的東西)

不唐突的JavaScript 中很重要的一部分就是理解瀏覽器是如何工作的(尤其是瀏覽器是如何崩潰的)以及用戶期望的是什么。不考慮瀏覽器你也可以很容易地使用JavaScript 創(chuàng)建一個完全不同的界面。拖拽界面,折疊區(qū)域,滾動條和滑動塊都可以使用JavaScript創(chuàng)建,但是這個問題并不是個簡單的技術(shù)問題,你需要思考下面的問題:

* 這個新界面可以獨立于輸入設(shè)備么?如果不能,那么可以依賴哪些東西?

* 我創(chuàng)建的這個新界面是否遵循了瀏覽器或者其它富界面的準則(你可以通過鼠標在多級菜單中直接切換嗎?還是需要使用tab鍵?)

* 我需要提供什么功能但是這個功能是依賴于JavaScript的?

最后一個問題其實不是問題,因為如果需要你就可以使用DOM來憑空創(chuàng)建HTML。關(guān)于這點的一個例子就是“打印”鏈接,由于瀏覽器沒有提供一個非 JavaScript的打印文檔功能,所以你需要使用DOM來創(chuàng)建這類鏈接。同樣地,一個實現(xiàn)了展開和收縮內(nèi)容模塊的、可以點擊的標題欄也屬于這種情況。標題欄不能被鍵盤激活,但是鏈接可以。所以為了創(chuàng)建一個可以點擊的標題欄你需要使用JavaScript將鏈接加入進去,然后所有使用鍵盤的用戶就可以收縮和展開內(nèi)容模塊了。

解決這類問題的極好的資源就是設(shè)計模式庫。至于要知道瀏覽器中的哪些東西是獨立于輸入設(shè)備的,那就要靠經(jīng)驗的積累了。首先你要理解的就是事件處理機制。

5.理解事件

(事件處理會引起改變)

事件處理是走向不唐突的JavaScript的第二步。重點不是讓所有的東西都變得可以拖拽、可以點擊或者為它們添加內(nèi)聯(lián)處理,而是理解事件處理是一個可以完全分離出來的東西。我們已經(jīng)將HTML,CSS和JavaScript分離開來,但是在事件處理的分離方面卻沒有走得很遠。

事件處理器會監(jiān)聽發(fā)生在文檔中元素上的變化,如果有事件發(fā)生,處理器就會找到一個很奇妙的對象(一般會是一個名為e的參數(shù)),這個對象會告訴元素發(fā)生了什么以及可以用它做什么。

對于大多數(shù)事件處理來說,真正有趣的是它不止發(fā)生在你想要訪問的元素上,還會在DOM中較高層級的所有元素上發(fā)生(但是并不是所有的事件都是這樣,focus和blur事件是例外)。舉例來說,利用這個特性你可以為一個導航列表只添加一個事件處理器,并且使用事件處理器的方法來獲取真正觸發(fā)事件的元素。這種技術(shù)叫做事件委托,它有幾點好處:

* 你只需要檢查一個元素是否存在,而不需要檢查每個元素

* 你可以動態(tài)地添加或者刪除子節(jié)點而并不需要刪除相應(yīng)的事件處理器

* 你可以在不同的元素上對相同的事件做出響應(yīng)

需要記住的另一件事是,在事件向父元素傳播的時候你可以停止它而且你可以覆寫掉HTML元素(比如鏈接)的缺省行為。不過,有時候這并不是個好主意,因為瀏覽器賦予HTML元素那些行為是有原因的。舉個例子,鏈接可能會指向頁面內(nèi)的某個目標,不去修改它們能確保用戶可以將頁面當前的腳本狀態(tài)也加入書簽。

6.為他人著想

(命名空間,作用域和模式)

你的代碼幾乎從來不會是文檔中的唯一的腳本代碼。所以保證你的代碼里沒有其它腳本可以覆蓋的全局函數(shù)或者全局變量就顯得尤為重要。有一些可用的模式可以來避免這個問題,最基礎(chǔ)的一點就是要使用 var 關(guān)鍵字來初始化所有的變量。假設(shè)我們編寫了下面的腳本:

Java代碼 var nav = document.getElementById('nav'); function init(){ // do stuff } function show(){ // do stuff } function reset(){ // do stuff } var nav = document.getElementById('nav'); function init(){ // do stuff } function show(){ // do stuff } function reset(){ // do stuff }

上面的代碼中包含了一個叫做nav的全局變量和名字分別為 init,show 和 reset 的三個函數(shù)。這些函數(shù)都可以訪問到nav這個變量并且可以通過函數(shù)名互相訪問:

Java代碼 var nav = document.getElementById('nav'); function init(){ show(); if(nav.className === 'show'){ reset(); } // do stuff } function show(){ var c = nav.className; // do stuff } function reset(){ // do stuff } var nav = document.getElementById('nav'); function init(){ show(); if(nav.className === 'show'){ reset(); } // do stuff } function show(){ var c = nav.className; // do stuff } function reset(){ // do stuff }

你可以將代碼封裝到一個對象中來避免上面的那種全局式編碼,這樣就可以將函數(shù)變成對象中的方法,將全局變量變成對象中的屬性。 你需要使用“名字+冒號”的方式來定義方法和屬性,并且需要在每個屬性或方法后面加上逗號作為分割符。

Java代碼 var myScript = { nav:document.getElementById('nav'), init:function(){ // do stuff }, show:function(){ // do stuff }, reset:function(){ // do stuff } } var myScript = { nav:document.getElementById('nav'), init:function(){ // do stuff }, show:function(){ // do stuff }, reset:function(){ // do stuff } }

所有的方法和屬性都可以通過使用“類名+點操作符”的方式從外部和內(nèi)部訪問到。

Java代碼 var myScript = { nav:document.getElementById('nav'), init:function(){ myScript.show(); if(myScript.nav.className === 'show'){ myScript.reset(); } // do stuff }, show:function(){ var c = myScript.nav.className; // do stuff }, reset:function(){ // do stuff } } var myScript = { nav:document.getElementById('nav'), init:function(){ myScript.show(); if(myScript.nav.className === 'show'){ myScript.reset(); } // do stuff }, show:function(){ var c = myScript.nav.className; // do stuff }, reset:function(){ // do stuff } }

這種模式的缺點就是,你每次從一個方法中訪問其它方法或?qū)傩远急仨氃谇懊婕由蠈ο蟮拿?,而且對象中的所有東西都是可以從外部訪問的。如果你只是想要部分代碼可以被文檔中的其他腳本訪問,可以考慮下面的模塊(module)模式:

Java代碼 var myScript = function(){ //這些都是私有方法和屬性 var nav = document.getElementById('nav'); function init(){ // do stuff } function show(){ // do stuff } function reset(){ // do stuff } //公有的方法和屬性被使用對象語法包裝在return 語句里面 return { public:function(){ }, foo:'bar' } }(); var myScript = function(){ //這些都是私有方法和屬性 var nav = document.getElementById('nav'); function init(){ // do stuff } function show(){ // do stuff } function reset(){ // do stuff } //公有的方法和屬性被使用對象語法包裝在return 語句里面 return { public:function(){ }, foo:'bar' } }();

你可以使用和前面的代碼同樣的方式訪問返回的公有的屬性和方法,在本示例中可以這么訪問:myScript.public() 和 myScript.foo 。但是這里還有一點讓人覺得不舒服:當你想要從外部或者從內(nèi)部的一個私有方法中訪問公有方法的時候,還是要寫一個冗長的名字(對象的名字可以非常長)。為了避免這一點,你需要將它們定義為私有的并且在return語句中只返回一個別名:

Java代碼 var myScript = function(){ // 這些都是私有方法和屬性 var nav = document.getElementById('nav'); function init(){ // do stuff } function show(){ // do stuff // do stuff } function reset(){ // do stuff } var foo = 'bar'; function public(){ } var myScript = function(){ // 這些都是私有方法和屬性 var nav = document.getElementById('nav'); function init(){ // do stuff } function show(){ // do stuff // do stuff } function reset(){ // do stuff } var foo = 'bar'; function public(){ }

//只返回指向那些你想要訪問的私有方法和屬性的指針

Java代碼 return { public:public, foo:foo } }(); return { public:public, foo:foo } }();

這就保證了代碼風格一致性,并且你可以使用短一點的別名來訪問其中的方法或?qū)傩浴?/p>

如果你不想對外部暴露任何的方法或?qū)傩?,你可以將所有的代碼封裝到一個匿名方法中,并在它的定義結(jié)束后立刻執(zhí)行它:

Java代碼 (function(){ // these are all private methods and properties var nav = document.getElementById('nav'); function init(){ // do stuff show(); // 這里不需要類名前綴 } function show(){ // do stuff } function reset(){ // do stuff } })(); (function(){ // these are all private methods and properties var nav = document.getElementById('nav'); function init(){ // do stuff show(); // 這里不需要類名前綴 } function show(){ // do stuff } function reset(){ // do stuff } })();

對于那些只執(zhí)行一次并且對其它函數(shù)沒有依賴的代碼模塊來說,這種模式非常好。

通過遵循上面的那些規(guī)則,你的代碼更好地為用戶工作,也可以使你的代碼在機器上更好地運行并與其他開發(fā)者的代碼和睦相處。不過,還有一個群體需要考慮到。

7.為接手的開發(fā)者考慮

(使維護更加容易)

使你的腳本真正地unobtrusive的最后一步是在編寫完代碼之后仔細檢查一遍,并且要照顧到一旦腳本上線之后要接手你的代碼的開發(fā)者。考慮下面的問題:

* 所有的變量和函數(shù)名字是否合理并且易于理解?

* 代碼是否經(jīng)過了合理的組織?從頭到尾都很流暢嗎?

* 所有的依賴都顯而易見嗎?

* 在那些可能引起混淆的地方都添加了注釋嗎?

最重要的一點是:要認識到文檔中的HTML和CSS代碼相對于JavaScript來說更有可能被改變(因為它們負責視覺效果)。所以不要在腳本代碼中包含任何可以讓終端用戶看到的class和ID,而是要將它們分離出來放到一個保存配置信息的對象中。

Java代碼 myscript = function(){ var config = { navigationID:'nav', visibleClass:'show' }; var nav = document.getElementById(config.navigationID); function init(){ show(); if(nav.className === config.visibleClass){ reset(); }; // do stuff }; function show(){ var c = nav.className; // do stuff }; function reset(){ // do stuff }; }(); myscript = function(){ var config = { navigationID:'nav', visibleClass:'show' }; var nav = document.getElementById(config.navigationID); function init(){ show(); if(nav.className === config.visibleClass){ reset(); }; // do stuff }; function show(){ var c = nav.className; // do stuff }; function reset(){ // do stuff }; }();

這樣維護者就知道去哪里修改這些屬性,而不需要改動其他代碼。

javascript 中不同類型以及不同環(huán)境下變量的內(nèi)存都是何時釋放

一.基本類型和引用類型的值

javascript中的變量包含兩種不同數(shù)據(jù)類型的:基本類型值和引用類型值。基本類型值指的是簡單的數(shù)據(jù)段,而引用類型值指那些可能右多個值構(gòu)成的對象。

1.動態(tài)的屬性

定義基本類型值和引用類型值的方式是類似的:創(chuàng)建一個變量并為該變量賦值。但是,當這個值保存到變量中以后,對不同類型值可以執(zhí)行的操作則大相徑庭。

對于引用類型的值,我們可以為其添加屬性和方法,也可以改變和刪除其屬性和方法:

var person = new Object();

person.name = "Nicholas";

alert(person.name);// “Nicholas”

基本類型值不能動態(tài)添加:

var name = "Nicholas";

name.age = 27;

alert(name.age);// undefined

2.復(fù)制變量值

復(fù)制變量值時兩種類型也會有所不同。

基本類型:

重新在內(nèi)存中開辟一段空間,賦值前后的兩者相互獨立

引用類型:

雖然也會重新開辟一段空間,但其接受到的值實際上是一個指針,而這個指針指向存儲在堆中的一個對象。賦值操作結(jié)束后,兩個變量實際上將引用同一個對象。

3.傳遞參數(shù)

javascript中所有函數(shù)的參數(shù)都是按值傳遞的?;绢愋椭档膫鬟f如同基本類型變量的復(fù)制一樣,而引用類型的值的傳遞,則如同引用類型變量的復(fù)制一樣。

在向參數(shù)傳遞引用類型的值時,會把這個值在內(nèi)存中的地址復(fù)制給一個局部變量,因此這個局部變量的變化會反映在函數(shù)的外部,情況下面例子:

function addTen(num){

num += 10;

return num;

}

var count = 20;

var result = addTen(count);

alert(count);// 20,沒有變化

alert(result);// 30

引用傳遞:

function setName(obj){

obj.name = "Nicholas";

}

var person = new Object();

setName(person);

alert(person.name);// "Nicholas"

證明對象是按值傳遞的例子:

function setName(obj){

obj.name = "Nicholas";

obj = new Object();

obj.name = "Greg";

}

var person = new Object();

setName(person);

alert(person.name);// "Nicholas"

4.檢測類型

在檢測基本類型時typeof是非常得力的助手,但在檢測引用類型的值時,這個操作符的用處不大。通常,我們并不是想知道某個值是對象,而是想知道它是什么類型的對象。為此,javascript提供了instanceof操作符,其語法如下:

result = variable instanceof constructor

alert(person instanceof Object);// 變量person是Object嗎?

alert(colors instanceof Array);// 變量colors是Array嗎?

alert(pattern instanceof RegExp);// 變量parrern是RegExp嗎

二.執(zhí)行環(huán)境和作用域

執(zhí)行環(huán)境是javascript中最為重要的一個概念。執(zhí)行環(huán)境定義了變量或函數(shù)有權(quán)訪問的其他數(shù)據(jù),決定了它們各自的行為。每個執(zhí)行環(huán)境都有一個與之關(guān)聯(lián)的變量對象,環(huán)境中定義的所有變量和函數(shù)都保存在這個對象中。

每個函數(shù)都有自己的執(zhí)行環(huán)境。當執(zhí)行流進入一個函數(shù)時,函數(shù)的執(zhí)行環(huán)境就會被推入一個環(huán)境棧中。而在函數(shù)執(zhí)行之后,棧將其環(huán)境彈出,把控制權(quán)返回給之前的執(zhí)行環(huán)境。Javascript中的執(zhí)行流正式右這個方便的機制控制著。

當代碼在一個環(huán)境中執(zhí)行時,會創(chuàng)建變量對象的一個作用域鏈。作用域鏈的用途是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。作用域鏈的前端,始終都是當前執(zhí)行的代碼所在環(huán)境的變量對象。如果這個環(huán)境是函數(shù),則將其活動對象作為變量對象?;顒訉ο笞铋_始只包含一個變量,即arguments對象。作用域鏈中的下一個變量對象來自包含(外部)環(huán)境,直至全局執(zhí)行環(huán)境的變量對象

1.延長作用域鏈

雖然執(zhí)行環(huán)境的類型總共只有兩種——全局和局部(函數(shù)),但是可以延長作用域鏈。因為有些語句可以在作用域鏈的前端臨時增加一個變量對象,該變量對象在執(zhí)行代碼后被移除:

try-catch語句的catch快

with語句

2.沒有塊級作用域

先看如下例子:

if (true){

var color = "blue";

}

alert(color);// "blue"

for (var i = 0; i 10; ++i){

doSomething(i);

}

alert(i); // 10

使用var聲明的變量會自動被添加到最接近的環(huán)境中。在函數(shù)內(nèi)部,最接近的環(huán)境就是函數(shù)的局部環(huán)境;在with語句中,最接近的環(huán)境是函數(shù)環(huán)境。如果初始化變量時沒有使用var聲明,該變量會被添加到全局變量

3.垃圾收集

1.收集方式

標記清除、引用清除

2.性能問題(臨界值)

3.管理內(nèi)存(不用的數(shù)據(jù)即使設(shè)置為null)

四.總結(jié)

javascript變量可以用來保存兩種類型的值:基本類型值和引用類型值?;绢愋偷闹翟醋砸韵?種基本類型數(shù)據(jù):Undefined、Null、Boolean、Number和String?;绢愋椭岛鸵妙愋椭稻哂幸韵绿攸c:

基本類型值在內(nèi)存中占據(jù)固定大小的空間,因此被保存在棧內(nèi)存中

從一個變量向另一個變量復(fù)制基本類型的值,會創(chuàng)建這個值的一個副本

引用類型的值是對象,保存在堆內(nèi)存中

包含引用類型值的變量實際上包含的并不是對象本身,而是一個指向該對象的指針

從一個變量向另一個變量復(fù)制引用類型的值,賦值的其實是指針,因此兩個變量最終都指向同一個對象

確定一個值是哪種基本類型可以使用typeof操作符,而確定一個值是哪種引用類型可以使用instanceof操作符

所有變量(包括基本類型和引用類型)都存在于一個執(zhí)行環(huán)境(也稱為作用域)當中,這個執(zhí)行環(huán)境決定了變量的聲明周期,以及哪一部分代碼可以訪問其中的變量。以下是關(guān)于執(zhí)行環(huán)境的幾點總結(jié):

執(zhí)行環(huán)境有全局執(zhí)行環(huán)境(也成為全局環(huán)境)和函數(shù)執(zhí)行環(huán)境之分

每次進入一個新執(zhí)行環(huán)境,都會創(chuàng)建一個用于搜索變量和函數(shù)的作用域鏈

函數(shù)的局部環(huán)境不僅有權(quán)訪問函數(shù)作用域中的變量,而且有權(quán)訪問其包含(父)環(huán)境,乃至全局環(huán)境

全局環(huán)境只能訪問在全景環(huán)境中定義的變量和函數(shù),而不能直接訪問局部環(huán)境中的任何數(shù)據(jù)

變量的執(zhí)行環(huán)境有助于確定應(yīng)該合適釋放環(huán)境

javascript是一門具有自動垃圾收集機制的編程語言,開發(fā)人員不必關(guān)心內(nèi)存分配和回收問題??梢詫avascript的垃圾收集例程作如下總結(jié):

離開作用域的值將被自動標記為可以回收,因此將在垃圾收集期間被刪除

“標記清除”是目前主流的垃圾收集算法,這種算法的思想是給當前不實用的值加上標記,然后再回收其內(nèi)存

另一種垃圾收集算法是“引用計數(shù)“,這種算法的思想是跟蹤記錄所有值被引用的次數(shù)。Javascript引擎不淺不再使用這種算法;但在IE中訪問非原聲JavaScript對象(如DOM對象)時,這種算法仍然可能導致問題

當代碼中存在循環(huán)引用現(xiàn)象時,“引用技術(shù)”算法就會導致問題

解除變量的引用不僅有助于消除循環(huán)引用現(xiàn)象,而且對垃圾收集也有好處。為了確保有效地回收內(nèi)存,應(yīng)該及時接觸不再使用的全局對象、全局對象屬性以及循環(huán)引用變量的引用


分享標題:javascript助手,JAVASCRIPT前端招聘
文章URL:http://weahome.cn/article/dsseeod.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部