好程式設計師web前端分享web測試之Js中的變數
好程式設計師 web前端分享web測試之Js中的變數 , JavaScript的變數與其他語言的變數有很大區別。JavaScript變數是鬆散型的(不強制型別)本質,決定了它只是在特定時間用於儲存特定值的一個名字而已。由於不存在定義某個變數必須要儲存何種資料型別值的規則,變數的值及其資料型別可以在指令碼的生命週期內改變。
變數及作用域
1.基本型別和引用型別的值
ECMAScript變數可能包含兩種不同的資料型別的值:基本型別值和引用型別值。基本型別值指的是那些儲存在棧記憶體中的簡單資料段,即這種值完全儲存在記憶體中的一個位置。而引用型別值則是指那些儲存在堆記憶體中的物件,意思是變數中儲存的實際上只是一個指標,這個指標指向記憶體中的另一個位置,該位置儲存物件。
將一個值賦給變數時,解析器必須確定這個值是基本型別值,還是引用型別值。基本型別值有以下幾種: Undefined、Null、Boolean、Number和String。這些型別在記憶體中分別佔有固定大小的空間,他們的值儲存在棧空間,我們透過按值來訪問的。
PS:在某些語言中,字串以物件的形式來表示,因此被認為是引用型別。ECMAScript放棄這一傳統。
如果賦值的是引用型別的值,則必須在堆記憶體中為這個值分配空間。由於這種值的大小不固定,因此不能把它們儲存到棧記憶體中。但記憶體地址大小的固定的,因此可以將記憶體地址儲存在棧記憶體中。這樣,當查詢引用型別的變數時,先從棧中讀取記憶體地址,然後再透過地址找到堆中的值。對於這種,我們把它叫做按引用訪問。
2.動態屬性
定義基本型別值和引用型別值的方式是相似的:建立一個變數併為該變數賦值。但是,當這個值儲存到變數中以後,對不同型別值可以執行的操作則大相徑庭。
var box = new Object();
box.name = 'zhang';
alert(box.name);
如果是基本型別的值新增屬性的話,就會出現問題了。
var box = 'zhang';
box.age = 17;
alert(box.age);
3.複製變數值
在變數複製方面,基本型別和引用型別也有所不同。基本型別複製的是值本身,而引用型別複製的是地址。
var box = 'zhang';
var box2 = box;
box2是雖然是box1的一個副本,但從圖示可以看出,它是完全獨立的。也就是說,兩個變數分別操作時互不影響。
var box = new Object();
box.name = 'zhang';
var box2 = box;
在引用型別中, box2其實就是box,因為他們指向的是同一個物件。如果這個物件中的name屬性被修改了,box2.name和box.name輸出的值都會被相應修改掉了。
4.傳遞引數
ECMAScript中所有函式的引數都是按值傳遞的,言下之意就是說,引數不會按引用傳遞,雖然變數有基本型別和引用型別之分。
function box(num) {
num += 10;
return num;
}
var num = 50;
var result = box(num);
alert(result);
alert(num);
以上的程式碼中,傳遞的引數是一個基本型別的值。而函式里的 num是一個區域性變數,和外面的num沒有任何聯絡。
下面給出一個引數作為引用型別的例子。
function box(obj) {
obj.name = 'zhang';
}
var p = new Object();
box(p);
alert(p.name);
function box(obj) {
obj.name = 'zhang';
var obj = new Object();
obj.name = 'Mr.';
}
最後得出結論, ECMAScript函式的引數都將是區域性變數,也就是說,沒有按引用傳遞。
5.檢測型別
要檢測一個變數的型別,我們可以透過 typeof運算子來判別。諸如:
var box = 'zhang';
alert(typeof box);
雖然 typeof運算子在檢查基本資料型別的時候非常好用,但檢測引用型別的時候,它就不是那麼好用了。通常,我們並不想知道它是不是物件,而是想知道它到底是什麼型別的物件。因為陣列也是object,null也是Object等等。
這時我們應該採用 instanceof運算子來檢視。
var box = [1,2,3];
alert(box instanceof Array);
var box2 = {};
alert(box2 instanceof Object);
var box3 = /g/;
alert(box3 instanceof RegExp);
var box4 = new String('zhang');
alert(box4 instanceof String);
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2652355/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師web前端學習路線分享web測試之Js中的函式程式設計師Web前端JS函式
- 好程式設計師web前端教程分享js閉包程式設計師Web前端JS
- 好程式設計師web前端教程分享js模板模式程式設計師Web前端JS模式
- 好程式設計師web前端教程分享Vue.js面試題程式設計師Web前端Vue.js面試題
- 好程式設計師web前端教程分享js中的模組化二程式設計師Web前端JS
- 好程式設計師web前端教程分享js中的模組化一程式設計師Web前端JS
- 好程式設計師分享Web前端知識之HTML程式設計師Web前端HTML
- 好程式設計師web前端分享CSS3 漸變程式設計師Web前端CSSS3
- 好程式設計師web前端分享web前端入門知識程式設計師Web前端
- 好程式設計師Web前端分享前端CSS篇程式設計師Web前端CSS
- 好程式設計師web前端教程分享web中CSS絕對定位程式設計師Web前端CSS
- 好程式設計師web前端分享應該怎樣學好web前端?程式設計師Web前端
- 好程式設計師web前端分享js剪下板Clipboard.js 使用程式設計師Web前端JS
- 好程式設計師web前端教程分享JavaScript面試題程式設計師Web前端JavaScript面試題
- 好程式設計師web前端分享常見面試題程式設計師Web前端面試題
- 好程式設計師web前端分享JS引擎的執行機制程式設計師Web前端JS
- 好程式設計師web前端教程分享JS基礎知識程式設計師Web前端JS
- 好程式設計師web前端分享js實現實戰案例程式設計師Web前端JS
- 好程式設計師web前端教程分享js reduce方法使用教程程式設計師Web前端JS
- 好程式設計師web前端培訓分享JS面試題總結一程式設計師Web前端JS面試題
- 好程式設計師web前端教程分享web前端基礎知識程式設計師Web前端
- 好程式設計師web前端分享:如何理解web語義化?程式設計師Web前端
- 好程式設計師分享Web前端開發工具程式設計師Web前端
- 好程式設計師web前端教程分享CSS技巧!程式設計師Web前端CSS
- 好程式設計師web前端分享Cookie知識程式設計師Web前端Cookie
- 好程式設計師web前端培訓分享Vue面試題程式設計師Web前端Vue面試題
- 好程式設計師web前端分享如何理解JS的單執行緒程式設計師Web前端JS執行緒
- 好程式設計師web前端教程分享JavaScript Math(算數)物件程式設計師Web前端JavaScript物件
- 好程式設計師HTML5大前端分享web前端面試題程式設計師HTML前端Web面試題
- 好程式設計師web前端教程分享前端javascript練習題之promise程式設計師Web前端JavaScriptPromise
- 好程式設計師web前端分享前端 javascript 練習題程式設計師Web前端JavaScript
- 好程式設計師web前端開發測驗之css部分程式設計師Web前端CSS
- 好程式設計師web前端教程分享HTML5面試技巧程式設計師Web前端HTML面試
- 好程式設計師web前端教程分享Jquery常見面試題程式設計師Web前端jQuery面試題
- 好程式設計師Web前端培訓分享jQuery面試題梳理程式設計師Web前端jQuery面試題
- 好程式設計師web前端教程分享web前端入門基礎知識程式設計師Web前端
- 好程式設計師分享Web前端效能最佳化程式設計師Web前端
- 好程式設計師web前端分享邏輯運算程式設計師Web前端