javascript的變數 數組 對象詳解用法(1/2)

來源:互聯網
上載者:User

*
1, 變數類型:
JavaScript 是弱類型, 變數可儲存任意類型, 並且運行期間類型可變;
-> 變數可進行類型轉換;
*/


/*
2, 變數聲明:
*/
var i;
var index;
var i, index;
var i = 0, index = 2;
/*
變數聲明, 無初始值時, 值為 undefined;
並且 var 聲明的變數, 不能使用 delete 操作符刪除;
重複聲明為產生覆蓋, 不會造成錯誤;
遺漏聲明, 則會把變數隱式聲明此變數, 並做為全域變數; (下節介紹)
*/


/*
3, 變數範圍:
以函數劃分: 函數內部聲明的變數, 只能啟動並執行函數內部, 即局部變數; (閉包仍可引用);
內部變數比全域變數優先順序別高; ex:
*/

var g = 'global';
function check() {
var g = 'local';
console.log(g); // local
}
check();

/* 變數儘可能都使用 var 聲明 */
/* 沒有塊級範圍 */

if (false) {
var test = 2;
function t() {
console.log('t function');
}
}
t(); // t function;
console.log(test); // undefined;
/*
例外:
firefox 會報錯;
t is not defined;
test 值為 undefined;(末聲明和賦值的變數都是 undefined)
*/

/* 變數聲明會提前掛起 */
function f() {
console.log(test); // undefined
var test = 'test';
console.log(test); // 'test'
}
// 轉化為
function f() {
var test;
console.log(test); // 變數僅聲明, 則初始化為 undefined
test = 'test';
console.log(test); // 變數已賦值, 'test'
}
/* 未定義變數和未賦值變數 */
console.log(t); // 直接使用變數 t;
// 註: 直接給變數賦值時, 會隱式的把變數做為全域對待;
var t; // 未賦值變數, undefined;

/*
4, 基本類型和參考型別:
Number/boolean/null/undefined/ 基本類型;
Array/Object/Function 參考型別
第五版, 63頁:
無論將字串看作是行為與基本類型相似的不可變參考型別,
還是將它看作使用參考型別的內部功能實現的基本類型, 結果都是一樣的;
即: String 類型表現為 基本類型;
下面執行個體說明基本類型和參考型別差別:
*/

var a = 3.14;
var b = a;
a = 4;
console.log(a, b); // 4, 3.14;

var a = [1, 2, 3];
var b = a;
a[0] = 99;
console.log(a, b); // 相同; [99, 2, 3];

// 數組是參考型別, 變數a和b 指向同一塊記憶體位址;
// 變數儲存基本類型的實際值, 而儲存參考型別的引用(類指標);

/*
5, 垃圾收集
參考型別是沒有固定大小的, 比如: Array, 隨時可以修改 length;
變數並不能直接儲存引用的值, 而是被儲存在某個位置, 變數儲存的只是對此位置的引用.
所以, JavaScript 會動態分配記憶體來儲存實體;
最終要釋放這些記憶體以便再用, 否則會消耗所有可用記憶體導致系統崩潰;
JavaScript 不要求手動釋放記憶體; 它使用一種稱為垃圾收集方法[方法不可見];
它會把對不再使用的對象所佔用的記憶體釋放;
*/
var s = 'hello';
var u = s.toUpperCase();
s = u; // 不能再擷取到 'hello' 值;
// 環境中不再有 'hello' 引用[沒有變數指向它]
// (是否進行回收, 是通過是否存在賦值決定的)
/*
6, 作為屬性的變數
全域對象
window, this, Math;
瀏覽器中的:navigator, screen;
局部變數:調用對象
調用對象
全域變數是特殊的全域對象的屬性, 那麼局部變數被稱為調用對象(call object)的屬性;
函數的參數和局部變數作為調用對象的屬性而儲存;
(使用獨立Object Storage Service局部變數使 JavaScript 可防止局部變數覆蓋同名全域變數的值)
JavaScript 的執行環境
JavaScript 解譯器執行一個函數時, 會為函數建立一個執行環境(execution context);
一個執行環境就是所有 JavaScript 程式碼片段執行時所在的環境.
運行不屬性任何函數的 JavaScript 代碼的環境使用的就是全域對象.
所有 JavaScript 函數都運行在 自己專屬的執行環境中, 並且有自己的調用對象, 在調用對象中定義了局部變數.
JavaScript 解譯器可在不同的全域執行環境中運行指令碼, 並且這些環境不脫節, 彼此可引用;
(window-iframe);
深入理解變數範圍
每個 JavaScript 執行環境都有一個和它關聯在一起的範圍鏈(scope chain);
範圍鏈是一個對象列表或對象鏈;
當 JavaScript 代碼需要查詢變數 X 的值時, 它就開始查看此鏈上的第一個對象;
如果對象存在一個名為 x 的屬性, 那麼就採用那個屬性的值.
如果沒有, JavaScript 會繼續查詢鏈中的第二個對象.
如果還沒有找到, 繼續查詢下一個對象. 以此類推...
補充:
f() 範圍 -> 閉包範圍 -> var 變數所在範圍
-> Object 的原型範圍 -> Object 類屬性範圍
-> 頂層範圍(window);
*/

對象與數組


/*
數組和對象 【JavaScript 權威指南 第五版】
*/

/*
對象: 是一個無序屬性集合, 每個屬性都有自己的名字和值 */

/* 建立對象簡單方法, 對象直接量 */

var obj = {};
var obj = {name: 'maxthon'};
var obj = {name: {}, text: []};

/* 可使用 new 操作符 */
var a = new Array();
var d = new Date();
var r = new RegExp('網頁特效', 'i');
var o = new Object(); // var o = {};
/* 註: new 操作符後跟建構函式, 所以
typeof Array; // 'function'
typeof Object; // 'function'
Object 是 Function 的執行個體.
Function 是特殊的對象, 也是 Object 的執行個體.
*/

/* 對象屬性 */
// 使用 . 符合來存取屬性的值.
// 註:同時可使用 [], 裡面使用屬性名稱(可使用變數, 這點特別有用).

var t = {};
t.text = 'hello';
t.o = {};
t.o.name = 'rd';
t.n = [];

var t = {
"text": "hello"
};
console.log(t.text); // 'hello';

// 補充: 通常使用關鍵字 var 來聲明變數, 但是聲明對象屬性時, 不能使用 var 聲明


/* 對象枚舉 */

var F = function () {};
F.prototype.name = 'RD';
var obj = new F;
for (var key in obj) {
console.log(key); // name;
}

// 僅枚舉對象自身, 不沿原型鏈向上查

for (var key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key); //
}
}

/* 註: for in 不能枚舉出預定義屬性; toString. */


/* 檢查屬性存在性 */

window.a = 'rd';
console.log(a in window); // true;

var F = function () {};
F.prototype.name = 'RD';
var obj = new F;
console.log('name' in obj); // true;


var toString = Object.prototype.toString;

// 如果對象 obj, 含有方法 getName, 則執行它;

if (obj.getName && toString.call(obj.getName) === '[object Function]') ) {
obj.getName();
}

// 補充:
console.log(null == undefined); // true;
console.log(null !== undefined); // true;


 

/* 刪除屬性 */

delete obj.name;

// 補充: 使用 delete 操作符, 不能刪除使用 var 聲明的變數;


/* 作為關聯陣列的對象 */

// 取對象屬性:
obj.name;
obj['name']; // 這裡 name 為字串.

// 使用 [] 表示時, 屬性名稱是用字串來表示的. 那麼可
// 在運行過程中進行添加等操作
// 註:當此屬性是做為變數傳遞時, 特別有用.
// 又稱 關聯陣列

/* 映射: JavaScript 對象把字串(屬性名稱) 映射成值. */
for (var key in obj) {
console.log(key); // key 屬性名稱, 此處 做為值存在.
}

首頁 1 2 末頁

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.