script標(biāo)簽屬性
type
src
sync
async 異步執(zhí)行, script標(biāo)簽下載完就執(zhí)行
defer 異步執(zhí)行,html標(biāo)簽加載完才執(zhí)行
/**
*這種注釋方式可以放在方法前,會自動填充方法中的參數(shù)名等信息
*/
字符串
不可變
當(dāng)一個字符串重新賦值以后,原內(nèi)存空間的地址不會發(fā)生變化,要想重新賦值,就會重新分配一個內(nèi)存空間,會造成內(nèi)存的大量浪費(fèi)。
Boolean
何時為false:
空字符串、0、NaN、null、undefined
函數(shù)
調(diào)用函數(shù)時,會把函數(shù)的實(shí)參復(fù)制一份傳遞給函數(shù)的形參,改變形參的值不會改變實(shí)參。
函數(shù)和方法的區(qū)別:
函數(shù):直接調(diào)用的是函數(shù) alert()
方法:通過對象調(diào)用的是方法 girl.getName()
構(gòu)造函數(shù)
new后面調(diào)用的函數(shù),構(gòu)造函數(shù)本質(zhì)就是一個函數(shù),只不過構(gòu)造函數(shù)的目的是為了創(chuàng)建新對象,為新對象進(jìn)行初始化。
1. 內(nèi)存開辟空間,存儲新創(chuàng)建的對象
2. 會把this設(shè)置為當(dāng)前對象
3. 執(zhí)行函數(shù)內(nèi)部的代碼,設(shè)置對象的屬性和方法
4. 返回新創(chuàng)建的對象
函數(shù)提升
js會把當(dāng)前作用域的函數(shù)聲明提前到整個作用域的最前邊。
自調(diào)用函數(shù)
只能執(zhí)行一次
作用域
變量的作用域:變量在什么位置可以使用
全局作用域:在任何位置都可以訪問
局部作用域:在函數(shù)內(nèi)部聲明一個變量,只能在該函數(shù)內(nèi)部使用
不使用var聲明的變量是全局變量
當(dāng)變量超出作用域之后,變量會被銷毀;
js中沒有塊級作用域;
在其他語言中,在代碼塊中定義的變量,外部是訪問不到的,但是在js中沒有塊級作用域
eg:
if(true){
var name = ‘a(chǎn)bc’
}
console.log(name)
變量提升
定義變量的時候,變量的聲明會被提升到作用域的最上方,變量的賦值不會提升。
對象
無序?qū)傩缘募?,可以把對象看成鍵值對
引用對象的屬性兩種方法
o.name = ‘888’
o[“name”] = ‘888’
基本數(shù)據(jù)類型和引用數(shù)據(jù)類型
基本數(shù)據(jù)類型
number string Boolean undefined null
在棧中分配一塊內(nèi)存空間用來存儲數(shù)據(jù)
var a = 10;
var b = a;
a = 11;
console.log(a)
console.log(b)
輸出結(jié)果為11 10
在棧中分別分配了兩塊地址用來存儲a和b的數(shù)據(jù)
引用數(shù)據(jù)類型
object array dete 函數(shù)
在棧中分配一塊內(nèi)存空間用來存儲堆中的地址,在堆中分配一快內(nèi)存空間用來存儲數(shù)據(jù)
var s1 = new Student();
var s2 = s1;
在堆里面分配了一份內(nèi)存空間用來存儲對象s1,棧里邊分配了一份內(nèi)存空間用來存儲s1在堆中的地址,在棧里面復(fù)制了一份s1的地址給s2,此時s1和s2指向的堆中的對象是同一個。
值類型和引用類型在內(nèi)存中的存儲方式
值類型按值存儲
引用類型按引用存儲
值類型復(fù)制和應(yīng)用類型復(fù)制
值類型按值復(fù)制
引用類型按引用復(fù)制
值類型和引用類型參數(shù)傳遞
值類型按值傳遞
引用類型按引用傳遞
值類型和引用類型的差別
基本類型在內(nèi)存中占據(jù)固定大小的空間,因此被保存在棧內(nèi)存中;
從一個變量向另一個變量復(fù)制基本類型的值,復(fù)制的是值的副本;
引用類型的值是對象,保存在堆內(nèi)存中;
包含引用類型的變量實(shí)際上包含的并不是對象本身,而是一個指向該對象的指針;
從一個變量向另一個變量復(fù)制引用類型的值的時候,復(fù)制的是引用指針,因此兩個變量最終都指向同一個對象。