ECMAScript學(xué)習(xí)筆記(2)--基本類型及語法相關(guān)

1、變量名區(qū)分大小寫; 注意代碼塊的概念。
變量分為原始值和引用值:原始值存儲(chǔ)在棧,引用值存儲(chǔ)在堆(引用值一般是一個(gè)指針或?qū)ο竺?、函?shù)名)。在C語言中編譯的程序占用的內(nèi)存分為以下幾個(gè)部分:棧區(qū)(由系統(tǒng)分配/內(nèi)存塊連續(xù))、堆區(qū)(由程序員分配與釋放或系統(tǒng)結(jié)束后釋放/鏈表結(jié)構(gòu)不連續(xù)的內(nèi)存塊)、全局區(qū)、文字常量區(qū)、程序代碼。
(1)原始類型有5種:Undefined、Null、Boolean、Number、String
Null專用值為null表示尚存在的對象,Undefined申明變量未初始化賦予該值(不等同于未定義的值,typeof無法區(qū)分是未聲明還是未初始化)

成都創(chuàng)新互聯(lián)公司于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元靈川做網(wǎng)站,已為上家服務(wù),為靈川各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108

var oTemp;
typeof(oTemp);
console.log(oTemp == undefined);

結(jié)果為:

Hello
undefined
true

如果直接未聲明使用oTemp ==undefined程序報(bào)錯(cuò),null ==undefined是true說明兩值相等,但是不代表含義相同。
Infinity表示無窮大,往往用isFinite()方法確保該數(shù)不是無窮大。還有一個(gè)特殊值是NaN,表示非數(shù),不用使用NaN==NaN(輸出false)判單非數(shù),使用isNaN()判斷非數(shù)。

console.log(NaN ==NaN);
var i=123;
console.log(isNaN(i)+'+++++++'+isNaN(a));

結(jié)果為:

false
false+++++++true

Number可以為32位整數(shù)也可以為64位浮點(diǎn)數(shù),String大小是沒有固定的

(2)引用類型通常叫做class,遇到引用值也就是處理對象。ECMAScript中其實(shí)沒有類這個(gè)詞,主要用對象定義,等同其他語言的類概念。

(3)以js舉例:JavaScript的執(zhí)行上下文生成之后,會(huì)創(chuàng)建一個(gè)叫做變量對象的特殊對象,基礎(chǔ)數(shù)據(jù)類型往往都會(huì)保存在變量對象中,引用數(shù)據(jù)類型的值是保存在堆內(nèi)存中的對象。JavaScript不允許直接訪問堆內(nèi)存數(shù)據(jù),需要通過地址引用訪問(操作地址值指向堆內(nèi)存空間數(shù)據(jù)訪問),如下代碼:

var a = 10;
var b = a;
b = 100;
console.log(a); //a=10 a、b是兩個(gè)獨(dú)立的變量空間,相互不干擾

再看:

var a= { m: 10, n: 20 }
var b = a;
b. m= 15;
console.log(a.m); //輸出15 a、b兩個(gè)不同空間變量指向同一個(gè)地址引用

2、函數(shù)聲明整體提升,變量的聲明提升到(一種理解得比較形象好記憶的方式,并非本質(zhì)原理,原理參考3)。
沒有聲明或直接賦值的變量會(huì)報(bào)錯(cuò):

console.log(a) //error

后面的變量聲明會(huì)提前到最前面

console.log(global); // undefined
var global = 'global';
console.log(global); // global

function fn () {
console.log(a); // undefined
var a = 'aaa';
console.log(a); // aaa
}
fn();

var聲明的變量,內(nèi)層變量可能會(huì)覆蓋外層變量,外層變量會(huì)作用的內(nèi)層;js中未經(jīng)聲明的變量歸window所有;js中全局變量都?xì)wwindow所有。

var tmp = new Date();

function f() {
console.log(tmp);
if (false) {
var tmp = 'hello world';
}
}

f(); // undefined

函數(shù)聲明有兩種:函數(shù)聲明式、函數(shù)字面量式(因?yàn)関ar定義的),后者無法函數(shù)提升,如下:
console.log(f1); // function f1() {}
console.log(f2); // undefined
function f1() {}
var f2 = function() {}

3、在程序執(zhí)行前的預(yù)編譯中(執(zhí)行上下文代碼執(zhí)行過程),一共有4個(gè)過程要完成:
(1)創(chuàng)建active object(OA)
(2)找形參和變量聲明,將形參和變量聲明做為OA的屬性名,屬性值為Undefine(此步就是變量提升的本質(zhì))
(3)將實(shí)參和形參統(tǒng)一
(4)在函數(shù)體中找函數(shù)聲明,值賦予函數(shù)體
變量作用域要理解執(zhí)行上下文的過程:創(chuàng)建變量對象、執(zhí)行(變量賦值、函數(shù)引用、其他代碼)。其中創(chuàng)建分三個(gè)步驟:創(chuàng)建arguments對象,檢查function聲明創(chuàng)建屬性,檢查Var變量聲明創(chuàng)建屬性。

1 var a = 10;
2 function aaa(){//step-4
3 alert(a);//step-5->執(zhí)行alert,此時(shí)只能找到外面的a=10故彈框10
4 }
5 function bbb(){//step-2
6 var a = 20;
7 aaa();//step-3
8 }
9 //定義了函數(shù)沒啥用,調(diào)用才是真格的所以這里是step-1
10 bbb();

作用域總結(jié):
(1)ES6之前的js沒有塊級(jí)作用域(你可以自己閉包或其他方法實(shí)現(xiàn)),只有函數(shù)級(jí)作用域,函數(shù)外面的變量函數(shù)里面可以找到,函數(shù)里面的變量外面找不到
(2) 變量的查找是就近原則,去尋找var定義的變量,當(dāng)就近沒有找到的時(shí)候就去查找外層。函數(shù)聲明比var聲明要優(yōu)先。
(3)當(dāng)參數(shù)跟局部變量重名時(shí),優(yōu)先級(jí)是等同的。傳參時(shí),基本類型傳值,引用類型傳引用。
(4) 理解執(zhí)行上下文:每個(gè)函數(shù)執(zhí)行時(shí)產(chǎn)生執(zhí)行上下文(EC),一個(gè)執(zhí)行上下文定義了一個(gè)函數(shù)執(zhí)行環(huán)境。

4、立即執(zhí)行函數(shù)(自執(zhí)行函數(shù))的理解:
先說說如下函數(shù)的執(zhí)行過程,聲明函數(shù)式makeCounter(),內(nèi)部定義變量i,返回一個(gè)函數(shù)體,該函數(shù)體區(qū)塊變量i和被返回到的函數(shù)體makeCounter中i存儲(chǔ)地址一致,直接上代碼比較結(jié)果分析(這里有點(diǎn)難理解):

function makeCounter() {
// i只是makeCounter函數(shù)內(nèi)的局部變量
var i = 0;

return function() {
console.log( ++i );
};
}
console.log("1----"+makeCounter().toString());
console.log("2----"+(makeCounter())());
console.log("3----"+makeCounter.toString());
console.log("4----"+parseInt(makeCounter()));
var a=makeCounter();
console.log("5----"+a);
a();
顯示結(jié)果如下:
1----function () {
console.log(++i);
}
1 //注意這個(gè)結(jié)果,是由步驟2中console.log產(chǎn)生
2----undefined
3----function makeCounter() {
// i只是makeCounter函數(shù)內(nèi)的局部變量
var i = 0;
return function () {
console.log(++i);
};
}
4----NaN
5----function () {
console.log(++i);
}
1

下面說明下為什么最后console.log的不同結(jié)果:
**每次當(dāng)控制器轉(zhuǎn)到可執(zhí)行代碼的時(shí)候,就會(huì)進(jìn)入一個(gè)執(zhí)行上下文。執(zhí)行上下文可以理解為當(dāng)前代碼的執(zhí)行環(huán)境,它會(huì)形成一個(gè)作用域。JavaScript中的運(yùn)行環(huán)境大概包括三種情況:全局環(huán)境(JavaScript代碼運(yùn)行起來會(huì)首先進(jìn)入該環(huán)境)、函數(shù)環(huán)境(當(dāng)函數(shù)被調(diào)用執(zhí)行時(shí),會(huì)進(jìn)入當(dāng)前函數(shù)中執(zhí)行代碼)、eval。

**函數(shù)中,遇到return能直接終止可執(zhí)行代碼的執(zhí)行,因此會(huì)直接將當(dāng)前上下文彈出棧。

(1)console.log("1----"+makeCounter().toString()) 對照1,顯示為function(){..},說明執(zhí)行makeCounter()后函數(shù)體,return了的真正值:一個(gè)函數(shù)體
(2)console.log("2----"+(makeCounter())()) 對照顯示數(shù)值1 和 2----undefined,因?yàn)楹瘮?shù)體function(){...}后加了(),那么函數(shù)就立即執(zhí)行了,所以打印了1。但是函數(shù)本身是沒有返回值的,所以會(huì)顯示undefine()
(3)console.log("3----"+makeCounter.toString()) 僅僅是輸出了這個(gè)名為makeCounter函數(shù)體中存儲(chǔ)的函數(shù)式全部代碼內(nèi)容
(4)非數(shù)返回也好理解
(5)同2理解,這里的實(shí)例化后然后用()執(zhí)行和2一個(gè)道理
,唯一不同是沒有console.log(a())

4、立即執(zhí)行函數(shù)的寫法:

// 最常用的兩種寫法
(function(){ / code / }()); // 推薦寫法
(function(){ / code / })();
//與運(yùn)算符相關(guān)聯(lián)后
var i = function(){ return 10; }();
true && function(){ / code / }();
0, function(){ / code / }();

// 一元運(yùn)算符
!function(){ / code / }();
~function(){ / code / }();
-function(){ / code / }();
+function(){ / code / }();

// 你也可以這樣
new function(){ / code / }
new function(){ / code / }() // 帶參數(shù)

6、let增加了塊級(jí)的作用,不在同一塊內(nèi)的變量相互不干擾,外層塊無法讀取內(nèi)層塊let定義變量:

function f1() {
let n = 5;
if (true) {
let n = 10;
}
console.log(n); // 5
}

零散的記錄了一些,后面會(huì)做梳理

當(dāng)前題目:ECMAScript學(xué)習(xí)筆記(2)--基本類型及語法相關(guān)
網(wǎng)站鏈接:http://muchs.cn/article32/ghghsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、軟件開發(fā)域名注冊、網(wǎng)站排名、定制網(wǎng)站、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司