目錄
1. 語句
2. 變量
3. 小結(jié)
JavaScript基本語法(一)是JavaScript核心知識點(ECMAScript)的基本語法的第一部分,主要介紹了:JavaScript語句、表達式、變量和數(shù)據(jù)類型(不包括函數(shù)類型)的基本知識點,函數(shù)類型將在下一章《JavaScript函數(shù)(二)》中詳細探討;
1.語句
JavaScript程序的執(zhí)行是由一條條語句組成的;
- 每一條語句是為完成特定任務而執(zhí)行的操作;
- 語句當中可以包含處理數(shù)據(jù)的表達式,表達式指可得到返回值的計算式;
- 語句結(jié)束的標志是
;;
var a = 1;
//執(zhí)行賦值操作的語句,結(jié)束標志的分號
var b = 1+1;
//執(zhí)行賦值操作的語句,賦值操作符右邊使用了表達式,返回值為2,結(jié)束標志是分號
2. 變量
JavaScript是一門弱類型語言,通過使用關鍵字var聲明變量,在賦值時變量的數(shù)據(jù)類型將根據(jù)值的類型動態(tài)轉(zhuǎn)變,從而體現(xiàn)弱類型的特征。
2.1 變量的聲明與賦值
-
聲明變量但為賦值
變量只聲明不賦值,則變量被賦一個特殊的值undefined;
var a;
a//undefined
-
聲明變量并賦值
變量既聲明又賦值,則產(chǎn)生變量提升,即js引擎在解析階段會將所有的聲明變量提升到當前作用域的頭部;
var a = 1;
//等價于
var a;
a = 1;
- 一次性聲明多個變量
var a=1,
b=2,
c=3;
2.2 標識符(identifier)
標識符即標識變量的名字,例如var a =1,標識符為a,標識符的命名規(guī)則如下:
- 第一個字符必須是任意Unicode字母、下劃線_或是美元符號$;
- 其他字符除了運算符外,基本都可以使用;
- 變量名通常采用camelCase;
- ECMA-262規(guī)定的關鍵字和保留字不能用作標識符;
2.3 數(shù)據(jù)類型
JavaScript的數(shù)據(jù)類型主要包括數(shù)值、字符串、布爾值、對象、undefined和null,ES6新增Symbol;
其中,數(shù)值、字符串和布爾值可稱為基本數(shù)據(jù)類型,因為所有的數(shù)據(jù)都是由這三種最基本的類型的值構(gòu)成;
對象可稱為復雜數(shù)據(jù)類型,這里的對象指的是廣義的對象,具體可細分為:
- 狹義的對象(object)
數(shù)組(array)
函數(shù)(function)
狹義的對象和數(shù)組本質(zhì)上是基本類型數(shù)據(jù)的集合,對象是一組無序鍵值對的集合,數(shù)組則是一組有序鍵值對(鍵名為從0開始的數(shù)字)的集合;
函數(shù)在JavaScript當中既是處理數(shù)據(jù)的方法,更是一種數(shù)據(jù)類型,既可賦值也能傳參;數(shù)值型
Number類型所有數(shù)字以64位浮點數(shù)形式存儲(相當于雙精度數(shù)值);
各種進制的數(shù)字的字面量表示
var a = 12//十進制,12
var b = 0B1//二進制,2
var c = 010 //八進制,8
var d = 0x10 // 十六進制,16
var e = 1.503e7 //科學計數(shù)法,15030000
【TIP】
在進行進制間的算術計算時,最終將轉(zhuǎn)換為十進制;
八進制在嚴格模式下是無效的,會報錯;
數(shù)值的范圍
js能表示的數(shù)值的最大、最小范圍保存在Number.MAX_VALUE和Number.MIN_VALUE當中;
無窮大的數(shù)值存儲在Number.POSITIVE_INFINITY,無窮小的數(shù)值Number.NEGEITIVE_INFINITY,可用isFinite()函數(shù)檢測一個數(shù)值是否是無窮數(shù)值;

NaN
NaN是一個特殊的數(shù)值,表示非數(shù)字,主要出現(xiàn)在本來要返回數(shù)值的操作數(shù)未返回數(shù)值的情況下最終拋出一個NaN替代,主要出現(xiàn)場景如下:
//在進行算術運算時,無法將該變量進行數(shù)據(jù)類型轉(zhuǎn)換為數(shù)值;
var a =1,b= "h"
a-b
//不符合算是運算法則
0/0

【TIP】
使用
typeof NaN會拋出"number",證明NaN是一個特殊的數(shù)值;NaN === NaN結(jié)果是false,證明,NaN不等于任何值;可使用
isNaN()判斷一個值是否為NaN數(shù)值類型轉(zhuǎn)換
js提供三個方法將數(shù)據(jù)轉(zhuǎn)換為數(shù)值類型,包括
Number()、parseInt()和parseFloat();Number()可將所有類型數(shù)據(jù)轉(zhuǎn)換為數(shù)值,parseInt()和parseFloat()能將字符串轉(zhuǎn)換為數(shù)值;
Number()除了值為undefined、字符串和對象無法轉(zhuǎn)換為數(shù)值的將轉(zhuǎn)換為NaN,其他都可轉(zhuǎn)換為數(shù)值;

此外,還可以使用算術操作符實現(xiàn)數(shù)值類型轉(zhuǎn)換,作用相同于Number():

<pre>
在進行字符串轉(zhuǎn)換為數(shù)值時,通常使用parseInt(),該方法的處理原理是忽略字符串前的空格,直到找到第一個非空格字符,
如果第一個字符不是數(shù)字字符或負號,則返回NaN,也就是說parseInt('')和parseInt(null)與Number()的返回值不同;
</pre>

<pre>
可為parseInt()提供第二個參數(shù),指明要進行轉(zhuǎn)換的數(shù)值的進制
</pre>

<pre>
parseFloat()方法的處理原理基本和parseInt()類似,區(qū)別在遇到第一個小數(shù)點是有效的,第二小數(shù)點是無效的,并且直解析十進制;
</pre>
-
字符串型
字符串可以看做是放置在''或""內(nèi)的零個或多個字符的數(shù)據(jù);
字符串的多種處理方式
//可用單引號也可用雙引號;
var a = "H",
b = 'E';
//長字符串的表示,多適用于HTML模板的表示
var c = "
<template> \
<h1>JavaScript</h1> \
<p>Hello World!</p> \
</template>
"
//多個字符串的拼接,多適用于添加js代碼
var c = "hello"+"world"+document.getElementById('demo').innerHTML
轉(zhuǎn)移字符
string數(shù)據(jù)類型包含一些特殊的字符,用于表示非打印字符或是具有其他用途的字符;
\t:制表符
\n:換行符
\r:回車
\b:退格
\\:反斜杠
\':單引號
\":雙引號
\xnn:以十六進制代碼nn(n為0~F)表示一個字符,如\x41表示"A"
\unnnn:以十六進制代碼nnnn表示一個Unicode字符
字符串類型轉(zhuǎn)換
將其他類型數(shù)據(jù)轉(zhuǎn)換為字符串型有三種方法:
1.每個字符串均有toString()方法
var a = 11,b;
a.toString()//"11"
b.toString()//對于只聲明未賦值的變量或null,toString()將報錯

2.String()函數(shù)對于任何類型的數(shù)據(jù)均有效
String(null)//"null"
String(undefined)//"undefined"
String(true)//"true"
3.空字符串""+其他類型數(shù)據(jù)
""+undefined//"undefined"
""+null//"null"
字符串與數(shù)組
字符串可以看作字符數(shù)組并且具有length屬性,和真實數(shù)組不同的是該數(shù)組元素只能讀不能寫,并且沒有數(shù)組相應的方法;

-
布爾型
布爾型數(shù)據(jù)使用true和false表示,代表真或假,js中所有類型的數(shù)據(jù)都可以表示成布爾類型的數(shù)據(jù);
布爾類型數(shù)據(jù)轉(zhuǎn)換
可使用轉(zhuǎn)型函數(shù)Boolean()可將數(shù)據(jù)轉(zhuǎn)換為布爾型數(shù)據(jù);
除了以下六個數(shù)據(jù)外,其他類型的布爾值均為true;
0
NaN
undefined
null
""
false

** 布爾型的應用場景**
布爾型數(shù)據(jù)往往結(jié)合流程控制語句用于執(zhí)行條件代碼塊
var message = "hello world"
if(message){
alter(message)
}
-
對象類型
對象本質(zhì)上是由若干鍵值對構(gòu)成的無序數(shù)據(jù)的集合;
對象的創(chuàng)建
對象創(chuàng)建的方法包括以下3種:
1.字面量法
var a = {a:1,b:2};
2.Object構(gòu)造函數(shù)法
var b = new Object();
3.Object.create()法
var c = Object.create(null)
以上3種方法,字面量法最為簡潔,Object方法比較正式,Object.create()常用于原型繼承場景;
對象的讀寫操作
對象的鍵或值可看做對象的屬性和方法,屬性代表對象的特性,方法代表對象的能力;
//寫操作
1.直接賦值
var a = {
name:"teren",
age:18,
say:function(){
console.log('hi')
}
}
2.動態(tài)創(chuàng)建
a.height = 185
a.['weight'] = '60kg'
a.ability = function(){
return "talk"
}
//讀操作
a.name
a['age']
查看所有屬性
Object.keys(a)

delete命令
delete命令用于刪除對象的屬性,但delete只能刪除對象本身的屬性,無法刪除繼承的屬性;由var聲明的全局變量默認是無法刪除的;在Object.definedProperty方法的
configurable定義為false的也不能刪除;


in運算符
in運算符可用來判斷對象的某個屬性是否存在,但in無法判斷這個屬性是屬于自身的還是繼承的,可用
Object.hasOwnProperty()去判斷屬性;
-
數(shù)組
數(shù)組是按照一定次序(起始編號為0的數(shù)字序列)的一組數(shù)據(jù)集合;
數(shù)組的讀寫操作
數(shù)組的length屬性
length屬性是一個動態(tài)值,根據(jù)數(shù)組元素成員個數(shù)而發(fā)生變化;
length屬性是可寫的,當length屬性的長度大于當前長度,則會向數(shù)組添加undefined值,若小于當前長度則會刪減值,可利用這一特性清空數(shù)組;
數(shù)組的遍歷
數(shù)組的遍歷最常用方法為for循環(huán),此外還有forEach、for in和Object.keys();
var arr = [1,2,3,4]
for(var i=0;i<arr.length;i++){
console.log(arr[i])
}
var arr = [1,2,3,4]
arr.foo = true;
for(var key in arr){
console.log(key)
}
//0
//1
//2
//3
//4
//foo
[注]for...in循環(huán)不僅遍歷數(shù)組的數(shù)字鍵,還會遍歷非數(shù)字鍵,所以一般數(shù)組的循環(huán)遍歷都采用for循環(huán);
var arr = [1,2,3,4]
arr.forEach(function(value,key){
console.log(key+"."+value)
})
var arr = [1,2,3]
console.log(Object.keys(arr))

類數(shù)組對象
js中有些對象被稱作“類數(shù)組對象”,樣子看上去很像數(shù)組,實際是個對象,并且沒有數(shù)組的相關屬性和方法,例如函數(shù)的
arguments對象、DOM元素集和字符串;

可以使用
Array.prototype.slice.call(likeArrayObject)使得類數(shù)組對象變成真實的數(shù)組;
3.小結(jié)
通過整篇文章,我們可以了解到:
- JavaScript的代碼是由一條條語句組成的,分號表示一條語句的結(jié)束;
- 語句當中包含處理數(shù)據(jù)的表達式,表達式是可以得到返回值的計算式;
- JavaScript是一門弱類型語言,使用
var聲明變量是,變量的數(shù)據(jù)類型將根據(jù)具體值而動態(tài)轉(zhuǎn)變; - JavaScript的數(shù)據(jù)類型主要包括數(shù)值、字符串、布爾型、對象(狹義的對象、數(shù)組和函數(shù))、undefined和null六種;
- 數(shù)值、字符串、布爾型又稱為基本數(shù)據(jù)類型,所有的數(shù)據(jù)都是由這三種最基本的數(shù)據(jù)類型構(gòu)成,對象、數(shù)組和函數(shù)可稱為復雜數(shù)據(jù)類型,由基本數(shù)據(jù)類型構(gòu)成;
- 數(shù)值類型的數(shù)據(jù)可通過不同的前綴表示不同進制的數(shù)值,也可用科學計數(shù)法表示,存在最值和無窮值;
NaN是一個特殊的數(shù)值,常出現(xiàn)在不符合算術運算法則和無法將變量進行數(shù)據(jù)類型轉(zhuǎn)換為數(shù)值的運算場景;數(shù)值類型轉(zhuǎn)換的方法包括Number(),parseInt(),parseFloat()和+; - 字符串可以看做是放在引號內(nèi)的零個或多個字符的數(shù)據(jù);部分特殊字符需要轉(zhuǎn)移符號反斜杠才能表示出來;字符串可以看做是類數(shù)組數(shù)據(jù),可使用
Array.prototype.slice.call(str)將其轉(zhuǎn)變?yōu)檎鏀?shù)組;字符串類型轉(zhuǎn)換方法包括String(),toString()和""; - 布爾型的值只有
true和false,js中所有類型的數(shù)據(jù)都可以表示成布爾類型的數(shù)據(jù);布爾類型的數(shù)據(jù)轉(zhuǎn)換方法有Boolean()和!!;除了false,null,undefined,0,NaN,""外,其他所有類型的數(shù)據(jù)的布爾值都是true; - 對象本質(zhì)上是若干鍵值對構(gòu)成的無序數(shù)據(jù)的集合;對象的創(chuàng)建方法包括
{},new Object和Object.create(null);對象的讀寫操作可使用點操作和方括號操作;遍歷對象的方法有for...in和Object.keys();可使用delete命令刪除對象的自身屬性,繼承的屬性、var聲明的變量以及在Object.definedProperty({},"name",{value:"teren",configurable:false})也無法刪除; - 數(shù)組是按照一定次序(起始編號為0的數(shù)字序列)的一組數(shù)據(jù)集合;數(shù)組的讀寫操作只能使用方括號操作;遍歷數(shù)組的方法包括
for,forEach,Obeject.keys;類數(shù)組對象包括HTMLCollection對象、函數(shù)的arguments對象以及字符串,可以使用Array.prototype.slice.call(likeArrayObject)使得類數(shù)組對象變成真實的數(shù)組;
參考資料
- 《JavaScript高級程序設計(第3版)》
- 《JavaScript標準參考教程》——阮一峰



