js基礎-類型、值和變量(上)

圖文無關.jpg

知識點比較多,篇幅有點長。。。。分上中下三篇了~
程序運行需要對值進行操作。比如

console.log('Hello World!') //Hello World!就是值

如果沒有值,程序運行時沒有意義的。在編程語言中。能夠表示并操作值得類型稱作數據類型。編程語言中最基本的特性就是能夠支持各種數據類型。當我們需要對值進行保存以備將來使用的時候,我們就需要用到變量。變量就是一個值得符號名稱,可以通過名稱來獲得對值的引用。我們引出了先引出本文要講的一些東西,下面我們會詳細來探究。

js的數據類型分為兩類:原始類型和對象類型(在《javaScript高級程序設計》中是將其分為基本類型和引用類型,本質是一樣的,只是叫法不一樣)。js的原始類型包括數字(Number)、字符串(String)、布爾值(Boolean)、null(空)和undefined(未定義)。其中null和undefined是特殊的兩個特殊的原始值,他們分別代表了各自特殊類型的唯一成員。

js除了原始類型之外就是對象了,對象(Object)是屬性的集合,每個屬性有“鍵/值對”構成。不同的的js對象是“鍵/值對”的無序集合。同樣也有有序集合的特殊對象就是數組(Array)表示帶編號的值的有序集合,數組具有專用的此法和特有的行為特性(函數方法)

var arr=['one','two','three'];
arr[0] //one 
arr[1] //twoarr
[2] //three

js還定義了另一種特殊對象,函數(Function);函數是具有與他相關聯的可執行代碼的對象,通過函數來運行可執行代碼,并返回運算結果。同樣,函數也專有的行為特性。js語言核心還定義了三種可供我們實例化的類型,日期(Date)、正則(RegExp)、和錯誤類型(Error);他們有自己獨立的運行。js有自己的內存管理機制,可以自動對內存進行垃圾回收。等等我們先大概過一遍js的一些最基礎的東西,我們現在來討論本文的主要內容。

具體內容

1.數字

js的類型同樣可以分為可變類型和不可變類型。可變類型的值是可以修改的,對象和數組屬于可變類型。數字、布爾值、null和undefined屬于不可變類型。比如修改一個數字內容本身就說不同了。js是不區分整數值和浮點數值的。js的所有數字都是采用浮點數值表示。JavaScript所能表示的數值范圍為正負1.7976931348623157乘以10的308次方,其最小所能表示的小數為正負5乘以10的負324次方,這兩個邊界值可以分別通過訪問Number對象的MAX_VALUE屬性和MIN_VALUE屬性來獲取。
console.log(Number.MAX_VALUE);console.log(Number.MIN_VALUE);

js能夠表示的整數范圍是從-~ 9007199254740992。如果使用了超過此范圍的煮熟,則數字計算是會出錯的;

var a=9007199254740992+3;
console.log(a);

正確的運算結果應該是9007199254740995,但JavaScript給出的計算結果卻是9007199254740996。嘗試改變計算公式后可以發現,只要整數大于9007199254740992,這種計算結果的錯誤將頻繁出現。當一個數字直接出現在js程序中,我們稱之為數字直接量。js支持多種格式的數字直接量。但是有個特殊情況要說下,就是在任何數字直接量錢加負號(-)例如-1;就可以得到他們的負值,但是負號是運算符(我們接下去會討論),并不是數字直接量的組成語言!

2.整型直接量

在js程序中,數值表示的是一個十進制整數,可能有人對進制不理解,這里簡單說一下:

進制也就是進位制,是人們規定的一種進位方法。 對于任何一種進制---X進制,就表示某一位置上的數運算時是逢X進一位。 十進制是逢十進一,十六進制是逢十六進一,二進制就是逢二進一,以此類推,x進制就是逢x進位。

除了是進制的整型直接量,js同樣能是被十六進制(以16為基數)的值,十六進制值是0-9和a(A)-f(F)之間表示的。其中a-f表示10-15,例如:

2AF5換算成10進制:
用豎式計算:
第0位: 5 * 16^0 = 5
第1位: F * 16^1 = 240
第2位: A * 16^2= 2560
第3位: 2 * 16^3 = 8192

5 * 16^0 + F * 16^1 + A * 16^2 + 2 * 16^3 = 10997

我們要記得ECMAScript的標準是不支持八進制(以八位基數)直接量。在某些情況下是可以支持的,但是在嚴格模式下,八進制是明令禁止的。

關于嚴格模式:除了正常運行模式,ECMAscript 5添加了第二種運行模式:"嚴格模式"(strict mode)。顧名思義,這種模式使得Javascript在更嚴格的條件下運行。"嚴格模式"體現了Javascript更合理、更安全、更嚴謹的發展方向,包括IE 10在內的主流瀏覽器,都已經支持它,許多大項目已經開始全面擁抱它。另一方面,同樣的代碼,在"嚴格模式"中,可能會有不一樣的運行結果;一些在"正常模式"下可以運行的語句,在"嚴格模式"下將不能運行。掌握這些內容,有助于更細致深入地理解js,讓你變成一個更好的程序員。

3.浮點型直接量

浮點型直接量是可以含有小數點的。它們采用的是傳統的實數寫法。有一個整數部分、小數點、小數部分組成。還可以用指數記數法表示浮點型直接量例如

3.142435.321.3212236.02e23 //6.02*10的23次方

4.js中的算術運算

js是使用語言本身提供的算數運算符來進行數字計算的。這些常用數字運算符有加法運算符(+)減法運算符(-)乘法運算符(*)出發運算符(/)求余與運算符(%)。

還有其他很多運算符我們先不討論。除了上面基本的運算符外。js還支持更加復雜的算術運算。這些復雜運算符通過作為作為Math(算數)對象的屬性定義的函數和常量來實現的,具體可以參考W3school去做個demo測試下,以下是截圖

js中算數運算在溢出(overflow)、下溢(unoverflow)或被零整除時不會報錯。當數字超出了js所能表示的數字上限(溢出),結果是一個特殊值Infinity(無窮大),同樣的有正無窮大就有負無窮大。當負數超過了js所能表示的負數范圍,結果為-Infinty(負無窮大)。無窮大值的算數運算(+、-、*、/)結果還是無窮大值(當然還保留他們的正負號)。

下溢是當運算結果無限接近于零并比js所能表示的最小值還小的時候發生的一種情形。這種情況下,js將會返回0.當一個負數發生下溢時候,js會返回一個特殊的值“負零”。這個值和正常的0完全一樣。只是很少用到而已。
被零整除是不會保錯的,他只是簡單的返回負無窮大(-Infinity)或者無窮大(Infinity)。
var a=1/0;console.log(a); //Infinity

但是還有一種情況就是0/0,這種暈死是沒有什么意義的,它會返回一個非數字值(not-a-number),用NaN表示。有幾種運算情況下會返回NaN,無窮大除以無窮大、給負數做開方運算或者算術運算符與不是數字或無法轉換為數字的操作數一直使用時都會返回NaN.Nan和任何值都不相等,包括它本身

console.log(NaN==NaN) //false

要判斷一個值是不是NaN,可以用x!=X來判斷,當且僅當x是NaN的時候,表達式的結果是true.也有函數isNaN()的作用與之相似,如果參數是NaN或者一個非數字值(比如字符串和對象),則返回true.

console.log(isNaN(123)) //false
console.log(isNaN(0/0)) //true
console.log(isNaN(NaN) //true

類似的方法還有isFinite(),在參數不是NaN、Infinite或-Infinite的時候才返回true.

5.二進制浮點數和四舍五入錯誤

var a=0.1;
var b=0.2;
var c=0.3;
var d=a+b;
console.log(c==d) //?console.log(d) //?

大家可以試一下,印象最深刻了,為什么會出現上面這種情況呢,眾所周知,計算機的內存是有限的,目前是沒有存在說有無限存儲空間的計算機的。js也是如此,實數有無數個,但js通過浮點數的形式只能表示其中有限的個數(大概有18437736874454810627個)也就是說,當在js中使用實數的時候,常常只是真實值的一個近似表示而已。
js采用了IEEEE-754浮點數表示法(幾乎所有語言都用這個表示法)。

這是二進制表示法,可以精準表示分數(1/2、1/8、1/1024)。但是我們常用的分數都是十進制分數(1/10、1/100之類),所以二進制浮點數并不能靳準表示類似于0.1這樣類型的數字。要記住在所有采用這個浮點數表示法的語言中都會出現這種問題,這不是js獨有的問題。要注意的是。我們的金融計算涉及到的這些計算都是基于整數“分”來進行貨幣單位的計算的。

6.日期和時間

js的語言合興包括Date()構造函數,用來表示或者創建時間和日期的對象。這些對象為日期計算提供了很多有用的API(應用程序接口,簡單來說就是怎么用的方法)。例如我要獲取當前的時間

var t=new Date() //實例化一個日期對象,我們先不搞復雜的,只需要只是實例化就是把抽象的一類東西變成具象的對象操作就可以了。
console.log(t.getFullYear()) //今年是2017 所以返回2017

類似的很多方法可以查閱 js Date()

7.字符串直接量

字符串直接量是有單引號或者雙引號括起來的字符序列。記住,有單引號定界的字符串中可以包含雙引號,有雙引號定界的字符串也可以包含單引號

“” //空字符串
“text”
'text'
"123"
"age:'18'"
"hello world"

js中,使用單引號和雙引號是沒有什么區別的,只不過在HTML中用的是雙引號,所以就我個人喜好用單引號。當然了,在有些情況下比如can't和your's等英文縮寫和所有格中,因為撇號和單引號是同一個字符,我們使用單引號的話,必須用反斜線(\)來轉譯所有的撇號。

js的內置功能之一就是字符串的鏈接了。如果將(+)號運用于數字,表示兩數相加,如果用于字符串中,則表示字符串拼接。例如

var a="1";
var b="2";
console.log(a+b) //12

要確定一個字符串的長度,可以使用字符串的length屬性

var str="123abc";
console.log(str.length) //6

除了length屬性了,字符串還有許多調用的方法,這里只簡單介紹下,以后會詳細的討論。

var str="abc123123"; 
str.charAt(0) //“a” 得到字符串str位置0的字符,主要字符串數組等最開始是0而不是1
str.charAt(str.lenght-1) //“3” 得到str最后一個字符
str.substring(1,4) //"bc1" 得到第2~4個字符
str.slice(1,4) //"bc1" 同上
str.slice(-3) //"132" 得到最后三個字符
str.indexOf(”1“); //3 字符1在字符串str首次中出現的位置 
str.lastIndexOf("1") //6 字符1在字符串str最后一次中出現的位置 
str.indexOf("3",4) //5 在位置4以及之后首次出現字符3的位置......

更多字符串的屬性和方法,可以參考W3C的http://www.w3school.com.cn/jsref/jsref_obj_string.asp

8.轉義字符

上面提到轉移,在js中反斜線(/)有著特別用處,反斜線(/)后加一個字符,就不再表示它們的字面含義了。比如\n,就是一個轉義字符,表示的是換行符。上面中的'中,當需要在一個單引號定界的字符串中使用撇號的時候,就是轉義字符登場的時候了。因為反斜線可以避免使用常規方式解釋單引號。js中常見的轉義字符有

image.png

知識內容比較多,為了方便閱讀,我分成上中下篇來回顧了!
如有錯誤,歡迎批評,對本文有什么不理解的地方話也可以留言評論交流!!!
原創文章by zhengyepan
歡迎訪問我的個人網站zhengyepan.com
歡迎討論交流~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容