js的資料型別
基本資料型別js的全域性變數和區域性變數基本資料型別有五個
number 數字
string 字串
布林型別 true和false
null 沒有值
undefined 沒有值
引用資料型別
引用資料型別有兩種
陣列array
函式function
首先定義一行**,主要包括宣告和賦值,判斷乙個變數,首先看變數是否有宣告var,如果沒有就一定是全域性變數;如果有var,還要分兩種情況,如果變數定義在函式體裡面,就是函式的區域性變數,如果定義在函式的外面,說明他是乙個全域性變數。i++和++i的問題
var i=0;
var r1=i++
;var r2=
++i;
他們的含義分別是i++是先賦值再加一,++i是先加一再賦值,這裡的賦值是i的值賦予給r1,而加一是i本身自加一,在第二行**中,r1變為0,而i本身變為1,第三行**是i自身加一後再賦值給r2,r2變為2,i變為2,定義變數是否為函式的問題注意
這裡的i具有繼承性,即在第二行**執行後,i的值會發生變化,第三行**用的是變化後的i值,並不是第一行**中的i值。
functionf(
)var a=f(
);a(
);varb
=functiond(
)b()
;<
/script>
對於上面的**,定義的兩個變數分別是a和b,對於a來說,f()函式賦值給a,但是a並不是乙個函式,寫a()會報錯,a is not a function; a拿到的只是f()的值。等式的連對對於b來說,他可以當做乙個函式,執行b()會出結果「dd」
我的理解是a只是引用函式,拿到函式返回來的值,b是在定義函式的左邊,定義的時候就把函式賦予給了b,並不是引用函式。
var a = b =2;
var a =
2, b =
2;
第一行表示的結果是
var a =2;
b =2;
第二行表示的結果是
var a =2;
var b =
2;
函式的賦值
var a =12,
b =13,
// und
c =14;
// c = 200
function
fn(a)
b =fn(
);console.
log(a, b, c)
;functionf(
) console.
log(f(
));<
/script>
函式預設的值為undefined,b=fn()為賦值語句,fn()沒有返回值,所以預設為undefined,如果有返回值,就是返回值,不用管返回的是誰的值,只管接收就行。預編譯階段的提公升
fn(
);functionfn(
)fn()
;functionfn(
)fn()
;varfn=
function()
fn();
functionfn(
)fn()
;functionfn(
)fn()
;// 5 5 5 3 3 3
// 在js中,只要提公升過一次了,就不提公升2次
<
/script>
在預編譯階段,提公升的有帶var的變數和函式,本題中,第六行的變數fn被提公升,當第二行的函式被提公升時發現已經有變數fn了,所以函式的宣告就不提公升,只提公升函式體,這時的fn為當第四行的函式被提公升時,同樣發現已經有fn,也是只提公升函式體,把原來的給頂替。此時的fn為 ,當第六行函式提公升時,對之前的fn並沒有影響正常提公升,下面同理都按此提公升。在預編譯的最後fn為,到此預編譯階段結束;函式的提公升問題在執行階段,第一三五行的fn拿到的值都是,到第六行執行**,fn的值會變成,在此fn的值發生變化,往後的fn都是這個值,最終的結果就是 // 5 5 5 3 3 3。
console.
log(g)
;// undg(
);if(
"g"in window)
}// fn是全域性函式 也會掛載到go上
// 在判斷判斷中,如果有函式,此函式在預編譯期間並不會直接
// 提公升到**段的前面,僅僅是提公升了函式名
// 也就是說僅僅是提公升了函式的宣告,也就是提公升了fn
// 如果條件滿足,進入到條件裡面的第1件事就是給fn賦值
// fn 此時就已經是乙個函式了
<
/script>
在預編譯階段,函式在提公升時,如果沒有判斷語句if,函式整體就會提公升到**的最前端,當有判斷語句包裹時,函式只會提公升函式宣告到最前端,函式體不會提公升,在第一行的執行時,因為沒有函式體,就是undefined,函式宣告不是乙個函式 ,可以看做是變數,所以當個g()執行時會報錯,g is not a function。型別轉化中其他型別轉化為布林型別函式巢狀函式的情況,裡面的函式不會提公升到**的最前端,只會在該函式體的執行上下文中提公升到該函式體的最前端。
在js中,下面的值轉成false,其它值都轉成true:0 -0
" "undefiend
null
Js物件導向的個人理解 更新
1 字面量 var obj 2 建構函式 function obj var obj new obj 3 object.creat var o var obj object.create o new建構函式例項化乙個物件 建立乙個object物件並將其 proto 賦值為建構函式的prototype,...
指標的初級理解
本文純屬個人筆記類,大佬可自行跳過 1.1想要了解指標,首先應該知道資料再記憶體中是怎麼儲存的。記憶體分4類 第一類是 區,存放 第二類是全域性區,存放全域性變數,字串常量。第三類是棧區,存放函式裡的變數,棧區很小,一般只有5m到10m。第四類是堆區,記憶體最多,需要自己決定開闢多少記憶體,開闢什麼...
js閉包 closure ,個人理解
一 閉包概念理解 各種專業文獻上對js 閉包 closure 定義非常抽象,賊難看懂。我的理解是,閉包就是能夠讀取某函式內部變數的函式。由於在j ascript語言中只有在函式內部的函式才能讀取區域性變數,因此可以把閉包簡單理解成 定義在乙個函式內部的函式 所以,在本質上,閉包就是將函式內部和函式外...