一、基本類型和引用類型的值
首先疚顷,我們知道JS的數(shù)據(jù)類型有6種:Undefined旱易、Null、Boolean腿堤、Number咒唆、String、Object
如果從用圖和功能上分的話释液,我們可以分為兩大類:
- 基本類型:Undefined全释、Null、Boolean误债、Number浸船、String
-
引用類型:Object
這兩種類型的區(qū)別:
1、保存的方式不同
基本數(shù)據(jù)類型是按值訪問的寝蹈,因?yàn)榭梢圆僮鞅4嬖谧兞恐械膶?shí)際的值李命。引用類型的值是保存在內(nèi)存中的對象。與其他語言不同箫老,JavaScript 不允許直接訪問內(nèi)存中的位置封字,也就是說不能直接操作對象的內(nèi)存空間。在操作對象時耍鬓,實(shí)際上是在操作對象的引用而不是實(shí)際的對象阔籽。
并且引用類型的值可以添加屬性和方法,或者改變刪除屬性和方法牲蜀。
2笆制、復(fù)制變量的值
當(dāng)從一個變量向另一個變量復(fù)制引用類型的值時,同樣也會將存儲在變量對象中的值復(fù)制一份放到為新變量分配的空間中涣达。不同的是在辆,這個值的副本實(shí)際上是一個指針证薇,而這個指針指向存儲在堆中的一個對象。復(fù)制操作結(jié)束后匆篓,兩個變量實(shí)際上將引用同一個對象浑度。因此,改變其中一個變量鸦概,就會影響另一個變量
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Nicholas";
alert(obj2.name); //"Nicholas"
3俺泣、傳遞參數(shù)
ECMAScript 中所有函數(shù)的參數(shù)都是按值傳遞的。也就是說完残,把函數(shù)外部的值復(fù)制給函數(shù)內(nèi)部的參數(shù)伏钠,就和把值從一個變量復(fù)制到另一個變量一樣
4、檢測類型(instanceof)
instanceof 可以用來檢測一個變量是什么類型的對象谨设,例如:
alert(person instanceof Object); // 變量person 是Object 嗎熟掂?
alert(colors instanceof Array); // 變量colors 是Array 嗎?
alert(pattern instanceof RegExp); // 變量pattern 是RegExp 嗎扎拣?
二赴肚、重點(diǎn)理解作用域和作用域鏈
1、執(zhí)行環(huán)境(作用域)
執(zhí)行環(huán)境其實(shí)定義了變量或者函數(shù)訪問其他數(shù)據(jù)的權(quán)限范圍二蓝。每個執(zhí)行環(huán)境都有一個與它相關(guān)聯(lián)的變量對象(variable object)誉券,在環(huán)境中定義的所有變量和函數(shù)都保存在這個對象中。
- 全局執(zhí)行環(huán)境
var color = "red";
上述代碼其實(shí)在全局環(huán)境中執(zhí)行的刊愚,在web瀏覽器中踊跟,與全局環(huán)境相關(guān)聯(lián)的對象是window,所以我們可以通過window.color訪問這個變量鸥诽。注意:某個執(zhí)行環(huán)境中的所有代碼執(zhí)行完畢后商玫,該環(huán)境被銷毀,保存在其中的所有變量和函數(shù)定義也隨之銷毀
-
函數(shù)執(zhí)行環(huán)境(局部環(huán)境)
每個函數(shù)也會有自己的執(zhí)行環(huán)境牡借。
2拳昌、作用域鏈
當(dāng)代碼在一個環(huán)境中執(zhí)行時,會創(chuàng)建變量對象的一個作用域鏈(scope chain)钠龙。作用域鏈的用途炬藤,是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。作用域鏈的前端碴里,始終都是當(dāng)前執(zhí)行的代碼所在環(huán)境的變量對象沈矿。如果這個環(huán)境是函數(shù),則將其活動對象(activation object)作為變量對象并闲∠杆活動對象在最開始時只包含一個變量,即arguments 對象(這個對象在全局環(huán)境中是不存在的)帝火。作用域鏈中的下一個變量對象來自包含(外部)環(huán)境溜徙,而再下一個變量對象則來自下一個包含環(huán)境。這樣犀填,一直延續(xù)到全局執(zhí)行環(huán)境蠢壹;全局執(zhí)行環(huán)境的變量對象始終都是作用域鏈中的最后一個對象。
-
延長作用域鏈
通過with 九巡、 try catch 語句
function buildUrl() {
var qs = "?debug=true";
with(location){
var url2 = href + qs;
}
return url;
}
-
沒有塊級作用域
對比其他的類C語言图贸,由花括號封閉的代碼塊都有自己的作用域(如果用ECMAScript 的話來講,就是它們自己的執(zhí)行環(huán)境)冕广,而ECMAScript沒有塊級作用域
if (true) {
var color = "blue";
}
alert(color); //"blue"