javascript
JS语言的基本构成、变量、数据类型
一、JS語言由三大部分組成
ECMAScript(核心):JavaScript 語言基礎(chǔ);
DOM(文檔對象模型):規(guī)定了訪問HTML和XML的接口;
BOM(瀏覽器對象模型):提供了獨立于內(nèi)容而在瀏覽器窗口之間進行交互的對象和方
二、變量
JS語言是弱類型語言,和其他強類型語言不通,JS中的變量是松散類型的,可以儲存任務(wù)任何類型的數(shù)據(jù),JS變量松散類型的本質(zhì),決定了變量只是在特定時間用于保存特定值的一個名字而已。由于不存在定義某個變量必須要保存何種數(shù)據(jù)類型值的規(guī)則,變量的值及其數(shù)據(jù)類型可以在腳本的生命周期內(nèi)改變。
用var關(guān)鍵字聲明的變量(塊級變量可使用let關(guān)鍵字),未經(jīng)初始化時,保存的是一個特殊的值——undefined。
可以在一條語句中聲明多個變量,初始化或不初始化皆可,變量之間用逗號隔開。
用var關(guān)鍵字聲明的變量是定義該變量的作用域中的局部變量,當(dāng)使用var關(guān)鍵字聲明了一個變量時,創(chuàng)建的這個變量是不可配置的,也就是說這個變量無法通過delete運算符刪除。
1 var num1 = 10; 2 (function num() { 3 var num2 = 10; 4 delete num2; 5 console.log(num2); //10 6 })(); 7 delete num1; 8 console.log(num1); //10在嚴(yán)格模式下,使用delete運算符刪除var關(guān)鍵字聲明的變量會導(dǎo)致SyntaxError.
省略var關(guān)鍵字會導(dǎo)致定義一個全局變量,但是不推薦這種做法。在嚴(yán)格模式下,給未聲明的變量賦值會導(dǎo)致ReferenceError。
JS是基于詞法作用域的語言:全局變量在整個程序中始終是有定義的,局部變量在聲明它的函數(shù)體內(nèi)以及其所嵌套的函數(shù)體內(nèi)始終是有定義的。
在函數(shù)體內(nèi),局部變量的優(yōu)先級高于同名的全局變量。
JS沒有塊級作用域,取而代之的是函數(shù)作用域:變量在聲明它們的函數(shù)體內(nèi)以及這個函數(shù)體嵌套的任何函數(shù)體內(nèi)都是有定義的。
函數(shù)內(nèi)部聲明的變量和函數(shù),要等到函數(shù)真正執(zhí)行過后,才能有定義。
二、JS中的變量類型分為兩種
1、基本類型
2、引用類型
基本類型有:Number、String、Boolean、Null、Undefiend;這5種基本數(shù)據(jù)類型是按值訪問的,因為可以操作保存在變量中的實際的值。
對于基本類型值,在復(fù)制變量的時候,會在新的變量上創(chuàng)建一個新值,這個新值是原值的一個副本,它們相互獨立。
基本類型值之間的比較,只是單純的值的比較。
?
引用類型值是保存在變量中的對象;引用類型值就是指對象。保存引用類型值的變量,實際上保存的是一個指向該對象的指針?!?/p>
當(dāng)復(fù)制保存著對象的某個變量時,復(fù)制的其實是指針;復(fù)制操作結(jié)束后,兩個變量指向同一個對象。
對于引用類型值,可以為其添加屬性和方法,也可以修改或者刪除其屬性和方法。
在為對象添加屬性和方法時,操作的是實際的對象,因此,改變?nèi)魏我粋€變量,都會影響另外一個變量
?
三、類型的檢測
typeof?操作符(和?instanceof?一起)或許是 JavaScript 中最大的設(shè)計缺陷, 因為幾乎不可能從它們那里得到想要的結(jié)果。
JavaScript 標(biāo)準(zhǔn)文檔只給出了一種獲取?[[Class]]?值的方法,那就是使用?Object.prototype.toString。
// IE8 Object.prototype.toString.call(null) // "[object Object]" Object.prototype.toString.call(undefined) // "[object Object]"// Firefox 4 Object.prototype.toString.call(null) // "[object Null]" Object.prototype.toString.call(undefined) // "[object Undefined]"
為了檢測一個對象的類型,強烈推薦使用?Object.prototype.toString?方法; 因為這是唯一一個可依賴的方式。正如上面表格所示,typeof?的一些返回值在標(biāo)準(zhǔn)文檔中并未定義, 因此不同的引擎實現(xiàn)可能不同。
除非為了檢測一個變量是否已經(jīng)定義,我們應(yīng)盡量避免使用?typeof?操作符。
四、全局變量
當(dāng)JS解析器啟動時,或者任何Web瀏覽器加載新頁面的時候,它將創(chuàng)建一個新的全局對象,并給他一組定義的初始屬性:
全局屬性:比如undefined、Infinite、NaN
全局函數(shù):比如isNaN()、parseInt()、eval()
構(gòu)造函數(shù),比如Date()、String()、Array()、Object()
全局對象:比如Math、Json
初次創(chuàng)建的時候,全局對象定義了JS中所有的預(yù)定義全局值。
如果代碼聲明了一個全局變量,這個全局變量就是全局對象的一個屬性。
全局變量作用于全局作用域,在JS代碼中的任何地方都是有定義的。
?
五、變量的聲明、定義與初始化
聲明——給變量一個名字,宣告它從此刻開始存在;
定義——給變量分配一個存儲空間;
初始化——給變量的存儲空間賦值。
由于JS是一種動態(tài)語言,其變量的類型是不固定的,可以隨著保存值的變化而變化,所以其定義變得無關(guān)緊要。
六、變量聲明提升
?
JS在執(zhí)行的時候,會把所有變量的聲明都提升到當(dāng)前作用域的最前面。
?
聲明提升,這步操作是在JS引擎“預(yù)編譯”階段實現(xiàn)的,是在代碼開始運行之前。
七、名字解析順序
JS中一個名字可能以4種方式進入作用域,其優(yōu)先級如下:
(1)語言內(nèi)置——所有作用域中都有arguments對象和this對象;
(2)以聲明的方式聲明的函數(shù)
(3)形式參數(shù)
(4)變量聲明——不會影響同名的函數(shù)聲明或者形式參數(shù)聲明
?
轉(zhuǎn)載于:https://www.cnblogs.com/LYL-8/p/9469290.html
總結(jié)
以上是生活随笔為你收集整理的JS语言的基本构成、变量、数据类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十二、dbms_logmnr(分析重做日
- 下一篇: Spring Cloud Eureka(