JavaScript 變數 概述 把一個具體的值存入到變數中。那麼此時這個變數就代表著我們這個具體的值。我們如果想要重新的使用這個值,不再需要重新的計算或者其他操作,直接使用變數就可以得到之前存儲的這個值。 簡單的說,變數就是一個保存數據的容器,調用變數就是調用保存在這個容器中的值。 變數之所以叫做 ...
JavaScript 變數
概述
把一個具體的值存入到變數中。那麼此時這個變數就代表著我們這個具體的值。我們如果想要重新的使用這個值,不再需要重新的計算或者其他操作,直接使用變數就可以得到之前存儲的這個值。
簡單的說,變數就是一個保存數據的容器,調用變數就是調用保存在這個容器中的值。
變數之所以叫做變數,是因為變數隨時可以根據我們的需要去改變其中存儲的值
註:變數本身沒有數據類型,只能根據存儲的值來判斷數據類型。
創建一個變數
聲明關鍵字,如:var、let
var
聲明一個變數,可選初始化一個值。
let
聲明一個塊作用域的局部變數,可選初始化一個值。
聲明變數的三種方式:
使用關鍵詞 var
var a = 42; // 可以用來聲明局部變數和全局變數。
直接賦值(不推薦)
b = 42;// JS 的小 bug,這樣寫會產生一個全局變數
這種方式在嚴格模式下會出錯,也沒人會用這種方式聲明變數,不建議使用這種方式。
使用關鍵詞 let
let c = 12; // 用來聲明塊作用域的局部變數。
聲明變數的底層原理
我們所寫的程式運行在記憶體中,當我們使用關鍵字聲明一個變數的時候,電腦會從記憶體中劃分一個空間,為我們存放不同類型的內容做準備
變數的命名規則
1. 由數字、字母、下劃線( _ )、$ 組成。
不能由數字開頭
不能包含星號 ( * )
不能包含加號
不能包含減號或者連詞線
字母可以是大寫,也可以是小寫。
2. 語義化,看其名知其意,首碼就可以表示出變數的類型
3. 不允許使用關鍵字和保留字。
4. 如果變數名由多個單片語成,要使用駝峰式命名法
大駝峰:從第一個單詞的首字母開始大寫。
小駝峰:從第二個單詞的首字母開始大寫。
註:JS 對大小寫敏感,a 和 A 是不同的。
var a = 1; var A = 2; console.log(a); // 1 console.log(A); // 2
變數也叫做標識符。
變數的存儲
重新存儲數據
當我們重新的向變數中存儲數據的時候,不需要再加 var
var a = 10; a = 20;
上面我們將變數 a 記憶體儲的數據由10變成了20,在重新存儲的過程中,我們並沒有使用 var,那麼上面的代碼就相當於我們將20的值存儲到之前創建的變數 a 中
重新聲明變數
如果在重新存儲數據的過程中,沒有在變數名前面加 var,那麼相當於是更改變數 a 中存儲的值,而如果前面加了 var,則相當於重新的創建了一個變數 a,並且存儲了這個數據。
var a = 10; // 第一次聲明變數 a var a = 20; // 再一次通過 var 聲明變數 a,並且使用了 var
雖然最後的結果和上面的列印結果相同,但是變數 a 本質上已經發生了變化 (存儲的地址變了)
如果採用以下方式,那麼重新創建的變數將會無效:
var x = 1; var x;
變數提升
JS 引擎的工作方式是,先解析代碼,獲取所有被聲明的變數,然後再一行一行地運行。這造成的結果就是所有的變數的聲明語句,都會被提升到代碼的頭部。
console.log(a); var a = 1;
上面代碼首先使用 console.log 方法,在控制台 (console) 顯示變數 a 的值。這時變數 a 還沒有聲明和賦值,所以這是一種錯誤的做法,但是實際上不會報錯。因為存在變數提升,真正運行的是下麵的代碼
var a; console.log(a); a = 1;
最後的結果是顯示 undefined,表示變數 a 已聲明,但還未賦值
關鍵字的介紹
關鍵字
關鍵字用於執行特定操作等。按照規則,關鍵字也是語言保留的,不能用做變數。
常見的關鍵字
break、do、instanceof、typeof、case、else、new、var、catch、finally、return、void、continue、 for、switch、while、debugger、function、this、with、default、if、throw、delete、in、try
保留字
未來可能做為關鍵字的存在
常見的保留字
abstract、enum、int、short、boolean、export、interface、static、byte、extends、long、super、 char、final、native、synchronized、class、float、package、throws、const、goto、private、 transient、implements、protected、volatile、double、import、public
基本上這些關鍵字和保留字都是一些語義強烈的詞語。
Java Script 數據類型
數據類型
什麼是數據類型?
變數用來臨時存儲數據(如果想要永久的存儲數據,需要通過資料庫)。而在任何一門編程語言當中,數據都是分為不同類型的。就如同人類也分為男人和女人一樣。
基本數據類型
基本數據類型也叫做 值類型、原始類型;有六種
String 字元型
1. 單引號字元串的內部,可以使用雙引號。雙引號字元串的內部,可以使用單引號
2. 如果要在單引號字元串的內部,使用單引號,就必須在內部的單引號前面加上反斜杠,用來轉義。雙引號字元串內部使用雙引號,也是如此。
'Did she say \'Hello\'?'
3. 如果長字元串必須分成多行,可以在每一行的尾部使用反斜杠
var longString = 'Long \ long \ long \ string'; // Long long long String
反斜杠後面必須是換行符
4. 字元串預設只能寫在一行內,分成多行將會報錯
5. 連接運算符(+)可以連接多個單行字元串,將長字元串拆成多行書寫,輸出的時候也是單行
6. 轉義字元: 反斜杠(\)在字元串內有特殊含義,用來表示一些特殊字元,所以又稱為轉義符,以下有幾種常見的轉義符:
\0 : null (\u0000) \b :後退鍵 (\u008) \f :換頁符 (\u000C) \n :換行符 (\u000A) \r :回車鍵 (\u000D) \t :製表符 (\u0009) \v :垂直製表符 (\u000B) \' :單引號 (\u0027) \" : 雙引號 (\u0022) \\ :反斜杠 (\u005C)
註:只要被引號包裹起來的就是字元('',"") -> "hello"
Number 數字型
JS 的64位浮點數之中,有一個二進位位是符號位。這意味著,任何一個數都有一個對應的負值,就連0也不例外,幾乎所有場合,正零和負零都會被當作正常的0,但是當0和-0被充當分母的時候,返回的值是不相等的,除以正零得到+Infinity,除以負零得到-Infinity
NaN
NaN 是 JS 的特殊值,表示“非數字”(Not a Number),主要出現在將字元串解析成數字出錯的場合
NaN不是獨立的數據類型,而是一個特殊數值,它的數據類型依然屬於Number(NaN本身是數字類型)
不是一個數字的數值型數據 -> 代表意外或非法轉換的數字
NaN不等於任何數值,包括它自己,即有NaN參與的計算都不會相等
檢查一個參數是否是非數字值
isNaN(x)函數用於檢查其參數是否是非數字值
如果 x 是特殊的非數字值 NaN(或者能被轉換為這樣的值),返回的值就是 true。如果 x 是其他值,則返回 false
true 不是一個數字 false 是一個數字
當值是0時,返回的值仍為 true
Number 中的全局方法
parseInt()、parseFloat()、isNaN、isFinite
parseInt
parseInt() /* 將字元串轉為整數 parseInt('123') // 123 如果字元串頭部有空格,空格會被自動去除 parseInt(' 81') // 81 如果parseInt的參數不是字元串,則會先轉為字元串再轉換 parseInt(1.23) // 1 // 等同於 parseInt('1.23') // 1 字元串轉為整數的時候,是一個個字元依次轉換,如果遇到不能轉為數字的字元,就不再進行下去,返回已經轉好的部分 如果字元串的第一個字元不能轉化為數字(後面跟著數字的正負號除外),返回NaN */
parseInt的返回值只有兩種可能,要麼是一個十進位整數,要麼是NaN
parseFloat
parseFloat() /* parseFloat方法用於將一個字元串轉為浮點數 parseFloat('3.14') // 3.14 如果字元串符合科學計數法,則會進行相應的轉換 parseFloat('314e-2') // 3.14 parseFloat('0.0314E+2') // 3.14 如果字元串包含不能轉為浮點數的字元,則不再進行往後轉換,返回已經轉好的部分 parseFloat('3.14more non-digit characters') // 3.14 parseFloat方法會自動過濾字元串前導的空格 parseFloat('\t\v\r12.34\n ') // 12.34 如果參數不是字元串,或者字元串的第一個字元不能轉化為浮點數,則返回NaN parseFloat([]) // NaN parseFloat('FF2') // NaN parseFloat會將空字元串轉為NaN parseFloat('') // NaN */
inFinite
isFinite() /* 返回一個布爾值,表示某個值是否為正常的數值 isFinite(Infinity) // false isFinite(NaN) // false 除了Infinity、-Infinity、NaN和undefined這幾個值會返回false,isFinite對於其他的數值都會返回true */
註:JS 中的數字類型,只有 Number
Boolean 布爾型
true、false
返回 boolean 的運算符
邏輯運算符、比較運算符
undefined 未定義
沒有被賦值的變數的類型就是 undefined
null 空值
null 只有一個值,就是它本身
null 類型為 Object、但是不能叫它空對象(這是 JS 中的一個 bug)
Symbol 一種實例 (ES6新增)
一種實例是唯一且不可改變的數據類型
引用類型
引用類型也稱之為對象類型、複雜數據類型
對象 Object、數組 Array、函數 Function
Object
一般是 {},標簽的數據類型都是 Object
Array
一組“成員”,一般是 []
Function
標誌是,function
數據類型轉換
自動類型轉換
轉換的規則
預期什麼類型的值,就調用該類型的轉換函數。比如,某個位置預期為字元串,就調用String函數進行轉換。如果該位置即可以是字元串,也可能是數值,那麼預設轉為數值
利用算術運算符
console.log(+str);
console.log(str - 0);
console.log(str * 1);
console.log(str / 1);
註:如果字元串無法全都轉為數字,則會變為 NaN
利用算術運算符的 +,進行字元串的拼接
由於自動轉換具有不確定性,而且不易除錯,建議在預期為布爾值、數值、字元串的地方,全部使用Boolean、Number和String函數進行顯式轉換
強制類型轉換
Number
規則:
嚴格轉換,能識別小數點,不能出現非數字,出現就會NaN
空字元串會轉為 0
自動過濾一個字元串前導和尾碼的空格
布爾值:true 轉成 1,false 轉成 0
undefined:轉成 NaN
Number方法的參數是對象時,將返回NaN,除非是包含單個數值的數組
Number方法的參數是對象時,將返回NaN,除非是包含單個數值的數組,如:
轉換對象:
Number({a: 1}) // NaN Number([1, 2, 3]) // NaN Number([5]) // 5
Number 示例:
轉換基本數據類型:
// 數值:轉換後還是原來的值 Number(324) // 324 // 字元串:如果可以被解析為數值,則轉換為相應的數值 Number('324') // 324 // 字元串:如果不可以被解析為數值,返回 NaN Number('324abc') // NaN // 空字元串轉為0 Number('') // 0 // 布爾值:true 轉成 1,false 轉成 0 Number(true) // 1 Number(false) // 0 // undefined:轉成 NaN Number(undefined) // NaN // null:轉成0 Number(null) // 0
其他方法:
parseInt()、parseFolat()、isNaN
isNaN
isNaN 方法可以用來判斷一個值是否為NaN isNaN(NaN) // true isNaN(123) // false isNaN(x) 如果 x 是特殊的非數字值 NaN(或者能被轉換為這樣的值),返回的值就是 true。如果 x 是其他值,則返回 false true 不是一個數字 isNaN("hello world"); -> true false 是一個數字 isNaN(123); -> false isNaN只對數值有效,如果傳入其他值,會被先轉成數值 isNaN('Hello') // true // 相當於 isNaN(Number('Hello')) // true isNaN為true的值,有可能不是NaN,而是一個字元串 比如,傳入字元串的時候,字元串會被先轉成NaN,所以最後返回true 由於 NaN 的意思是 not a numer ,所以isNaN判斷時,本身是雙重否定,true 也就代表著是 NaN,即不是一個數字 當值是0時,返回的值仍為 true
String
轉換基本數據類型:
數值:轉為相應的字元串。 字元串:轉換後還是原來的值。 布爾值:true轉為字元串"true",false轉為字元串"false"。 undefined:轉為字元串"undefined"。 null:轉為字元串"null"
轉換對象:
String方法的參數如果是對象,返回一個類型字元串;如果是數組,返回該數組的字元串形式
其他方法:
toString()
方式:直接轉換,相當於給數值添加兩個引號
var num1 = 123; var str1 = num1.toString(); console.log(str1); // 123 -> 字元串 var num2 = NaN; var str2 = num2.toString(); console.log(str2); // NaN -> 字元串
可以接受參數:
toString(8); toString(16); toString(32); ...
參數時進位,結果也是以進位表示的數字
toFixed()
主要作用是保留小數位,順帶著轉變數據類型
var num = 123.456; var str = num.toFixed(2); console.log(str); // 123.46 -> 字元串
保留 n 位小數的時候會自動四捨五入。
Boolean
可以將任何類型的值轉為 布爾值
規則:除了以下五個值的轉換結果為 false,其他的值全部為 true
undefined null 0(包含-0和+0) NaN "" ''(空字元串
true 和 false 這兩個布爾值不會發生變化
所有對象(包括空對象)的轉換結果都是true,甚至連 false 對應的布爾對象new Boolean(false)也是true
註意:" " 並不是空字元串,看不見的縮進和空格也是字元
JavaScript 運算符
算術運算符
+ 加法運算 - 減法運算 * 乘法運算 / 除法運算 % 取餘運算(求模運算) ** 指數運算符
加法運算符有字元串拼接的作用
規則:只要 + 兩邊出現一個字元,那麼就會將兩邊的值連在一起,成為字元串;只有 + 兩邊都是數字的時候才是加法運算
下麵是一些常見的 + 連接:
1 1 + null // 1 2 1 + true // 2 3 1 + false // 1 4 1 + NaN // NaN 5 1 + "hello" // 1hello 6 1 + undefined // NaN 7 1 + [3,4,5,6] // 13,4,5,6 8 + 如果跟 空字元串("")一起,那麼會成為0 9 1+ {} -> 1 + {name:"admin"} // 1[object Object]->只拿到了標誌,沒拿到值
賦值運算符
賦值運算符,是基於右值,給左值賦值。如:
var a = 10; var b = 11; console.log(a); // 10 console.log(b); // 11
把一個值賦給一個變數,為了把一個值賦給多個變數,可以以鏈式使用賦值運算符
一些常用的賦值運算符:
加賦值 x += y 加法運算,相當於 x = x + y 減賦值 x -= y 減法運算,相當於 x = x - y 乘賦值 x *= y 乘法運算,相當於 x = x * y 除賦值 x /= y 除法運算,相當於 x = x / y 模賦值 x %= y 取餘,相當於 x = x % y
賦值運算符的隱式數據類型轉換規則,參考算術運算符 (數據類型時會有 類型轉換的問題)。
自增和自減
++
++ 等價於 += 1
前自增
先運算,後賦值
var a = 1; ++a; // a = 2 console.log(a): // 2
前自增是先加1,再使用操作數的值
後自增
先使用最初值,後運算
var b = 2; b++; // b = 2; console.log(b); // 3
後自增是先使用操作數的值,再加1
--
自減的原理和自增相同,只是自減是減法。前自減和後自減參考自增。
小練習
var a = 12; var sum = a++ + ++a + ++a * 2 + a-- + a--; console.log(sum + "" + a); /* 算 sum 的值 a++ a 是 12 ++a ++13, 之後 a 是14 ++a * 2,15 * 2 a-- 15 -1 a -- 14 - 1 最後得出 a 是 13 sum = 12 + 14 + 15 * 2 + 15 + 14 == 85 輸出結果為 8513 */
比較運算符
等於 ==
如果兩邊操作數相等時返回 true
不等於 !=
如果兩邊操作數不相等時返回 true
全等 ===
兩邊操作數相等且類型相同時返回 true
不全等 !==
兩邊操作數不相等或類型不同時返回 true
大於 >
左邊的操作數大於右邊的操作數返回 true
大於等於 >=
左邊的操作數大於或等於右邊的操作數返回 true
小於 <
左邊的操作數小於右邊的操作數返回 true
小於等於 <=
左邊的操作數小於或等於右邊的操作數返回 true
註:
1. 一個字元和一個數值比較,會把字元轉換成數值,之後再比較
2. 當比較運算符的兩邊都是字元時,比較規則為字元的逐位比較
只比較字元中首位數字,後面的不再進行比較
邏輯運算符
邏輯運算符常用於布爾(邏輯)值之間; 當操作數都是布爾值時,返回值也是布爾值。 不過實際上 && 和 || 返回的是一個特定的操作數的值,所以當它用於非布爾值的時候,返回值就可能是非布爾值。
且 &&
如果第一個運運算元的布爾值為 true,則返回第二個運運算元的值(註意是值,不是布爾值);如果第一個運運算元的布爾值為 false,則直接返回第一個運運算元的值,且不再對第二個運運算元求值。
&& 的兩邊,只要有其中一個是 false ,就返回 false;只有當兩邊都是 true 時,才返回 true
或 ||
如果第一個運運算元的布爾值為 true,則返回第一個運運算元的值,且不再對第二個運運算元求值;如果第一個運運算元的布爾值為 false,則返回第二個運運算元的值
|| 的兩邊,只要有其中一個是 true,就返回 true
非 !
取一個值的反值。主要用於將一個布爾值變為相反值。即 true 變為 false,false 變為 true
不管什麼類型的值,經過取反運算後都會變成布爾值
如果使用取反運算符的值不是一個布爾值,那麼取反運算符就會將其變為一個布爾值,然後再取反
下麵的六個值使用取反運算符取反後都為 true,其他都為 false
undefined null false 0 NaN 空字元串('')
如果對一個值連續做兩次的取反運算,等於將其轉換為對應的布爾值。這是一種較為常見的類型轉換的方法,即 快速獲取一個值得布爾類型表示 !!值
邏輯與運算符可以多個連用,這時返回第一個布爾值為 false 的表達式的值。如果所有表達式的布爾值都為 true,則返回最後一個表達式的值
條件運算符
條件運算符也叫做 三元運算符、三目運算符
條件 ? 值1 : 值2
如果條件為真,則結果取值1。否則為值2。你能夠在任何允許使用標準運算符的地方使用條件運算符
逗號運算符
逗號操作符( , )
對兩個操作數進行求值並返回最終操作數的值。它常常用在 for 迴圈中,在每次迴圈時對多個變數進行更新
運算符優先順序
用於確定一個表達式的計算順序。在你不能確定優先順序時,可以通過使用括弧顯式聲明運算符的優先順序。