javascript
JavaScript的类型、值和变量
計算機程序的運行需要對值進行操作,在編程語言中,能夠表示并操作的值得類型稱為數據類型。變量用來將值存儲起來,變量是值得符號名稱。
一、數據類型
JavaScript的數據類型可以分為兩類,原生類型和對象類型,JavaScript的原始類型包括數字、字符串和布爾值,JavaScript還有兩個特殊的原始值null(空)和undefined(未定義),它們不是數字、字符串和布爾值。對象類型包含普通對象、數組、函數、日期、正則、錯誤對象。
JavaScript的類型也可以按有無方法分,除了null和undefined,其他的類型都是擁有方法的值,字符串、數字、布爾值在使用方法時,會臨時轉化為對應的對象。
JavaScript的類型也可以可變類型和不可變類型,只有對象和數組屬于可變類型,其他的都是不可變類型,包括字符串。
二、JavaScript的內存管理機制
JavaScript解釋器有自己的內存管理機制,可以自動對內存進行垃圾回收。這意味著程序員可以按需創建對象,程序員則不必擔心這些對象的銷毀和內存回收,當不再有任何引用指向一個對象,解釋器就會知道這個對象沒用了 ,然后就自動回收它所占的內存資源。
三、數值
a、JavaScript中數值有整型和浮點型
整型可以用十進制和十六進制(0xff).
浮點型可以包含小數點,可以采用傳統寫法,還可以使用指數計數法。
3.14
6.02e23? //6.02x1023
6.02E-23? //6.02x10-23
b、JavaScript中的算術運算
JavaScript運算符包括+、-、*、/、%(求余).除了基本的運算符外,Javascript還支持更復雜運算。這些運算和Math對象的屬性和方法有關。
Math對象的屬性
Math對象的方法
?例子:
? ? ?Math.round(Math.random()*10)? ? ? ? ? ?//返回0到10(包含0和10)的整數
溢出:當數值超出了JavaScript所能表示的數字上限(溢出),結果為一個無窮大值。表示為Infinity。
當負數超出了JavaScript所能表示的負數范圍,結果為負無窮大。表示為-Infinity。
基于無窮大的加減乘除讓是無窮大,保留其原來的符號。
下溢:當運算結果無限接近0且比JavaScript所能表示的最小值還小時發生下溢。這種情況下JavaScript返回0。正數下溢返回0;負數下溢返 回-0;0和-0幾乎沒有區別(除了作為除數)。
1 var a=0; 2 var b=-0; 3 console.log(a===b); //true 4 console.log(1/a===1/b) //false?
被0整除并不會報錯。
1 var a=1; 2 console.log(a/0); //Infinity 3 console.log(a/-0); //-Infinity 4console.log(0/0) //NaNNaN(not -a-number)://表示不是一個數字
0/0、無窮大除無窮大、給負數開偶次方、算術運算符的操作數不是一個數字或者無法轉化成數字(+運算符特殊)。
1 console.log(0/0); //NaN 2 console.log(Infinity/Infinity); //NaN 3 console.log(Math.sqrt(-3)) //NaN 4 console.log('a2'-3); //NaNInfinity和NaN是JavaScript中定義的全局變量。
NaN和任何值都不相等,包括自身。所以判斷一個值x是不是NaN,應使用x!=x。
isNaN是一個全局函數。可以用來判斷一個數字是不是NaN,如何一個是NaN或者不能轉換成一個數字,返回true.
1 console.log(isNaN([])); //false 2 console.log(isNaN('3')) //fase 3 console.log(isNaN('ab')) //trueisFinity()也是一個全局函數。當參數是NaN(轉化成數字),-Infinity,Infinity的時候,返回false.其他時候都是返回true.
1 console.log(isFinite(Infinity)); //false 2 console.log(isFinite(NaN)) //false 3 console.log(isFinite('ab')) //false?
四、字符串
字符串一個一組不可變字符組成的序列,字符串的字符索引從0開始,字符串的長度是其所包含的字符的個數,空字符的長度為0.
字符串直接量要用單引號或者雙引號括起來,字符換換行用反斜線\連接。
‘’\'在字符串中有著特殊用途,'\'+字符會改變字符原來的意思。'\n'代表換行,這類字符稱作轉義字符。
五、布爾值
布爾值指代真或假,只有兩個值true和false。JavaScript中比較運算通常返回的都是布爾值。
a=1;b=2;
a==b;//返回false
六、null和undefined
null是JavaScript中的關鍵字。常用來表示空值。typeof null會返回"object".實際上null是它自有類型的唯一值。他表示數字、字符串、對象是無值的。
undefined是JavaScript中的全局變量,表示變量的值沒有初始化。typeof undefined返回"undefined"。是它自有類型的唯一成員。
1 console.log(typeof null); //object 2 console.log(typeof undefined); //undefined?==運算符認為他兩個是相等。
七、全局對象
全局對象的屬性是全局定義的符號,JavaScript可以直接使用。當JavaScript解釋器啟動時,他會創建一個新的全局對象,并給他一組定義的初始屬性。
全局屬性:undefined、Infinity、NaN等
全局函數:isNaN()、eval()等
構造函數:Date()、Array()等
全局對象:Math、JSON
全局對象的初始屬性不是保留字,但是應該當做保留字對待。
在最頂級代碼中,可以使用this關鍵字引用全局對象。全局對象定義了JavaScript中的所有的預定義全局值。這個特殊對象同時包含了程序定義的全局值(用戶自定義的全局變量)。
?八、包裝對象
JavaScript中的數字、字符串、布爾值也可以調用方法。這些原始值在調用方法之前會通過對應的構造函數轉化成對象,調用對象的方法(屬性),對象會自動銷毀。
1 var s="s"; 2 s.len=4;//給它設置屬性 3 console.log(s.len);//undefinednull和undefined沒有包裝對象。訪問它們的屬性會報錯。
==認為包裝對象是相等的,而===認為他們是不等。
typeof可以看出其中的差別。
1 var s="s"; 2 var S=new String(s) 3 console.log(typeof s);//"string" 4 console.log(typeof S);//"object"?
九、不可變的原始值和可變的對象引用
原始值是不可變的。通過字符串的方法修改字符串返回一個新的字符串,而字符串的原始值并沒改變。
1 var s="sdasd"; 2 console.log(s.toUpperCase());//"SDASD"3 console.log(s);//"sdasd"
?
原始值得比較是值得比較。例如字符串只要長度相等,對應位置的字符相等,則認為它們是相等。
對象和原始值不同,對象的值是可變的。
1 var obj={ 2 a:1, 3 b:2 4 } 5 obj.a=3; 6 console.log(obj.a); //3對象的比較不能通過值來比較,即使兩個對象同樣的值屬性且屬性值相等。它們也是不相等。
變量存儲的是對象的引用值,即對象在堆中的地址。只有引用值相等。才能認為兩個對象是相等。
十、類型轉換
a.隱式類型轉化
JavaScript中的取值類型非常靈活,可以根據需要自動轉化類型。
對象轉換成布爾值:所有的對象都會轉換成true;new Boolean(false)對象也會轉換成true.
對象轉換成數字和對象轉換成字符串:這里提到到轉換方法只適合于本地對象(宿主對象(Web瀏覽器定義的對象)有自己的轉換規則)。所有的對象都繼承了兩個轉化方法。
第一個是toString()方法:默認的toString()方法用來返回對象的類型。
1 var obj={ 2 a:1, 3 b:2 4 } 5 console.log(obj.toString()); //[object object]日期對象、數組、函數、正則對象的toString()方法。
1 console.log([1,2,3].toString()); //1,2,3 2 console.log(new Date().toString()) //Wed Mar 07 2018 02:01:18 GMT+0800 (中國標準時間) 3 console.log(function(){return 0;}.toString()) //function (){return 0;} 4 console.log(/\d+/i.toString()) // /\d+/i第二個方法時valueOf().如果對象存在原始值。則這個方法返回原始值,大多數對象無法還原成原始值,valueOf()簡單返回對象本身。數組、函數、正則對象的valueOf()方法返回對象本身。而日期對象的valueOf()返回的是1970.1.1到現在的毫秒數。
1 console.log(new Date().valueOf()) //1520359837257JavaScript中的對象轉換成字符串:--如果對象有toString()方法,調用這個方法返回一個原始值,再把原始值轉換成字符串。
? --如果對象沒有toString()方法,或者這個方法返回的不是一個原始值,則調用valueOf(),調用這個方法返回一個原始值,再把原始值轉換成字符串。
? --如果不能通過上述的兩個方獲得原始值,則拋出一個類型錯誤。
JavaScript對象轉換成數字:和轉發成字符串的方法類似,不過先調用valueOf()方法獲得原始值,轉換成數字。
+、==、!=、關系運算符(>、<)中對象到原始值的轉換:先調用valueOf(),在調用toString()。得到的原始值直接使用。
+、==操作日期對象時轉化成數字、字符串:先調用toString(),在調用valueOf(),得到原始值直接使用。
1 var now=new Date(); 2 console.log(now==now.toString());//true 先調用toString() 3 console.log(now+1) //Wed Mar 07 2018 02:37:30 GMT+0800 (中國標準時間)1 先調用toString() 4 console.log(now>now-1) //true 先調用valueOf()b、顯示類型轉換
轉換成數字:Number()函數、ParseInt()、ParseFloat()
Number()只能基于10進制進行轉換,不能出現非法的尾隨字符:
ParseInt()用于整型:可以忽略前導空格、盡可能多的解析更多數值,忽略后面的內容,不能轉換返回NaN
ParseFloat()整型和浮點型?可以忽略前導空格、盡可能多的解析更多數值,忽略后面的內容,不能轉換返回NaN
parseInt可以接受第二個參數,這個參數指定數字的基數(2~36)。
轉換成字符串:String()、toString()
String()函數會把null、undefined轉換成空對象,而toString()方法會報錯。
toString()在用于數字到字符串的轉換時,可以在參數中輸入數的基數,表示數字是幾進制的。
1 var n=12; 2 console.log(n.toString(16));//c?
toFixed()、toExponential()、toPrecision()也可以用于數字到字符串的轉換;
toFixed(arg):參數用來指定小數的位數
toExponential(arg):使用指數計數法表示數字,小數點前只有一位,參數指定了小數點后的位數
toPrecision(arg):arg指定有效數字的位數,如果有效數字的位數少于整數部分的位數,則使用指數表示。
以上的三個方法會進行四舍五入和補0操作。
1 var a=123456.789 2 console.log(a.toFixed(0)) //"123457" 3 console.log(a.toFixed(1)) //"123456.8" 4 console.log(a.toFixed(5)) //"123456.78900" 5 console.log(a.toExponential(2)) //"1.23E5" 6 console.log(a.toExponential(3)) //"1.235E5" 7 console.log(a.toPrecision(3)) //"1.23e5" 8 console.log(a.toPrecision(7)) //"123456.8"轉換成對象:Object()
轉換成布爾值:Boolean()
十一、變量聲明
a、用var關鍵字聲明變量:
var x,y;? var x=1,y=2;
聲明的變量沒有初始化之前的值是undefined.
可以使用聲明一個變量多次,但是不能使用未聲明的變量。不使用var關鍵字聲明的變量是全局變量,無論位置。不用var聲明的變量可以用delete 刪除。
b、全局變量和局部變量
全局變量擁有全局作用,局部變量只在函數內可見,函數體局部變量的優先級高于全局變量。
c、變量聲明提前
在函數中變量的聲明前就可以用,變量的聲明就好像放在函數的最前面一樣。
1 (function(){ 2 console.log(a);//undefined 3 var a=0; 4 console.log(a);//0 5 })();?十二、作用域鏈
JavaScript中規定全局變量是全局對象的屬性,可以通過this關鍵字引用全局變量。而局部變量是與函數調用相關的某個對象的屬性,JavaScript中沒有辦法引用該對象。作用域鏈是一個鏈表,上面存放了當前位置代碼可訪問的變量的保存對象。JavaScript需要訪問某個變量時,它會在作用域鏈的對象上查找是否有該屬性,直到找到該屬性,否則會報錯。
函數在定義的時候保存一個作用域鏈,當函數調用的時候,創建一個對象用來保存函數內部的局部變量,然后把對象添加到作用域鏈上,同時創建一個新的更長的函數調用鏈。當函數有嵌套函數時,函數每次調用時內部函數的作用域鏈都是不同的。?
轉載于:https://www.cnblogs.com/yiluhuakai/p/8505066.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的JavaScript的类型、值和变量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL优化(二)-- 慢查询
- 下一篇: Spring学习笔记15--注解Bean