1. 程式人生 > 資訊 >Spotify 第一季度營收 28 億美元:同比增長 24%,月活躍使用者達 4.22 億

Spotify 第一季度營收 28 億美元:同比增長 24%,月活躍使用者達 4.22 億

在ECMAScript中,變數是鬆散型別的。所謂鬆散型別就是指變數可以用來儲存任何型別的資料。 

// 下面的操作是完全合法的
var message = "helloWorld";
message = 100;

但是在實際開發中,我並不推薦大家這樣使用變數。這種操作方法是會讓程式碼變得很不安全。為了規避這樣的問題,我在變數命名的時候對變數型別做了標明。

var strMessage = "helloWorld"; // String型別

var nMessage = 100; // Number型別
// 如果有必要數字型別我也會進行細分
var iMessage = 1; // int型別
var fMessage = 0.5; // float型別

var objMessage = null; // Object型別

var bMessage = false; // Boolean型別

ECMAScript中有5種簡單資料型別:Undefined、Null、Boolean、Number、String,還有1種複雜資料型別Object。

1、Undefined型別

 聲明後未賦值的變數,或者未宣告的變數,typeof的值都是Undefined。區別在於,未宣告的變數在呼叫時會報錯。

有鑑於此,變數宣告之初初始化會十分有用。這樣我們通過typeof測試變數型別,若變數為Undefined的話,則說明該變數是未賦值,而不是尚未初始化了。

2、Null型別

null值標識的是一個空指標物件,所以他的typeof值為“Object”。所以在初始化Object型別變數的時候,使用null作為初始化的值就可以了。

undefined派生自null。所以 alert(null == undefined); // true 。

3、Boolean型別

Boolean型別的true或者false,並不是單純就指1或者0。可以說不同的資料型別,都可以轉換成true或者false。

資料型別

轉換為true的值

轉換為false的值

Boolean

true

false

String

任何非空字串

""(空字串)

Number

任何非零數字值(包括無窮大)

0和NaN

Object

任何物件

null

Undefined

n/a(意思是“不適用”)

undefine

4、Number型別

 Number型別數值字面量格式有三種:十進位制(n)、八進位制(0 + n)、十六進位制(0x + n)。

var iNum = 55; // 十進位制
var octalNum = 070; // 八進位制
var hexNum = 0xA; // 十六進位制

需要注意的是,八進位制字面量在嚴格模式下是無效的,謹慎使用。

(1)浮點數

由於儲存浮點數的記憶體空間是儲存整數的兩倍,所以凡是可以表示為整數的浮點數都會自動轉化為整數。例如 1.、10.0 等。

對於極大或者極小的數值可以表示為浮點數,即科學計數法,例如 3.125e7 == 3.125*107 、 3e-7 == 3*10-7 等。

需要注意的是,浮點數的最高進度是17位小數,在進行計算的時候其精確度遠不如整數。例如雖然 0.15 + 0.15 = 0.3 ,但是 0.1 + 0.2 = 0.30000000000000004 ,由此造成 0.1 + 0.2 == 0.3; // false 。所以不要用浮點數做比較。

 1 <!DOCTYPE html>
 2 <html lang="zh-cn">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>testDocument</title>
 6     <style>
 7         html,body{width: 100%;height: 100%;}
 8         html,body,p{padding: 0;margin: 0;}
 9         div{box-sizing: border-box;}
10         .container{width: 100%;height:100%;padding-left: calc((100vw - 600px) * .5);background-color: #006699;overflow: auto;}
11         .contentContainer{background-color: #fff;width: 600px;height: 100%;}
12     </style>
13 </head>
14 <body>
15     <div class="container">
16         <div class="contentContainer">
17             <select name="a" id="numA">
18                 <option value="0.05">0.05</option>
19                 <option value="0.15">0.15</option>
20                 <option value="0.1">0.1</option>
21             </select>
22             +
23             <select name="b" id="numB">
24                 <option value="0.25">0.25</option>
25                 <option value="0.15">0.15</option>
26                 <option value="0.2">0.2</option>
27             </select>
28             = 
29             <span id="numC">?</span>
30             <p>a + b == c ? <span id="isEqual"></span></p>
31         </div>
32     </div>
33     <script>
34         document.getElementById("numA").addEventListener("change", plusAB, false);
35         document.getElementById("numB").addEventListener("change", plusAB, false);
36 
37         function plusAB() {
38             var objA = document.getElementById("numA");
39             var fA = parseFloat(objA.options[objA.selectedIndex].value);
40             var objB = document.getElementById("numB");
41             var fB = parseFloat(objB.options[objB.selectedIndex].value);
42 
43             var fC = fA + fB;
44             document.getElementById("numC").innerHTML = fC;
45 
46             document.getElementById("isEqual").innerHTML = (fC == 0.3);
47         }
48     </script>
49 </body>
50 </html>

效果如下:

(2)數值範圍

查詢瀏覽器數值上限使用 Number.MAX_VALUE ,下限使用 Number.MIN_VALUE 。

基本上所有瀏覽器的上限均為 1.7976931348623157e+308 ,下限均為 5e-324 。

超出數值範圍,數值將被自動轉換為特殊的Infinity(無窮)值。要想確定數值是否有窮,即是否位於數值範圍內,可以使用 isFinite() 函式。

var nResult = Number.MAX_VALUE + Number.MAX_VALUE;
alert(isFinite(result)); // false超出數值範圍

(3)NaN(Not a Number)

首先要明確這個數值的應用。它是用於表示一個本來要返回數值的運算元未返回數值的情況。例如,任何數值除以0都會返回NaN。

NaN本身有兩個特點:①任何涉及NaN的操作都會返回NaN;②NaN與任何值都不相等,包括其本身NaN,即 NaN == NaN; // false 。

ECMAScript定義了 isNaN() 函式,用來測定引數是否為NaN。這個函式會將引數自動轉為數值,然後再進行測試。對於物件,該函式會自動呼叫物件的 valueof() 方法進行測試,如果不能,則繼續呼叫物件的 toString() ,進行測試。

 1 <!DOCTYPE html>
 2 <html lang="zh-cn">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>testDocument</title>
 6     <style>
 7         html,body{width: 100%;height: 100%;}
 8         html,body,p{padding: 0;margin: 0;}
 9         div{box-sizing: border-box;}
10         .container{width: 100%;height:100%;padding-left: calc((100vw - 600px) * .5);background-color: #006699;overflow: auto;}
11         .contentContainer{background-color: #fff;width: 600px;height: 100%;}
12     </style>
13 </head>
14 <body>
15     <div class="container">
16         <div class="contentContainer">
17             <p>NaN == NaN?<span id="nan"></span></p>
18             <p>10 == NaN?<span id="num"></span> (10是一個數值)</p>
19             <p>"10" == NaN?<span id="numStr"></span> (可以被轉換成數值10)</p>
20             <p>"blue" == NaN?<span id="str"></span> (不能轉換為數值)</p>
21             <p>true == NaN?<span id="boolean"></span> (可以被轉換成數值1)</p>
22             <p>obj(<span id="objValue">{"num1":1,"num2":2}</span>) == NaN?<span id="obj"></span></p>
23             <button type="button" onclick="changeObjFun();">改變object的toString方法</button>
24         </div>
25     </div>
26     <script>
27         var numList = {
28             "num1":1,
29             "num2":2
30         };
31 
32         document.getElementById("nan").innerHTML = isNaN(NaN);
33         document.getElementById("num").innerHTML = isNaN(10);
34         document.getElementById("numStr").innerHTML = isNaN("10");
35         document.getElementById("str").innerHTML = isNaN("blue");
36         document.getElementById("boolean").innerHTML = isNaN(true);
37         document.getElementById("obj").innerHTML = isNaN(numList);
38 
39         function changeObjFun(){
40             numList.toString = function(){
41                 return "100";
42             }; // 重寫物件的toString方法,使其返回一個數值
43 
44             document.getElementById("objValue").innerHTML = "100";
45             document.getElementById("obj").innerHTML = isNaN(numList); // 由於物件的toString方法返回了一個數值,所以這裡變成了false
46         }
47     </script>
48 </body>
49 </html>

效果圖:

(4)數值轉換

有三個函式可以把非數值轉換為數值: Number() 、 parseInt() 、 parseFloat() 。第一個可以用於任何資料型別,而後兩個專用於字串的轉換。

使用一元加操作符也可以實現與 Number() 同樣的效果: +value 。

 1 <!-- parseInt()函式轉換規則 -->
 2 <!DOCTYPE html>
 3 <html lang="zh-cn">
 4 <head>
 5     <meta charset="UTF-8">
 6     <title>testDocument</title>
 7     <style>
 8         html,body{width: 100%;height: 100%;}
 9         html,body,p{padding: 0;margin: 0;}
10         div{box-sizing: border-box;}
11         .container{width: 100%;height:100%;padding-left: calc((100vw - 600px) * .5);background-color: #006699;overflow: auto;}
12         .contentContainer{background-color: #fff;width: 600px;height: 100%;}
13     </style>
14 </head>
15 <body>
16     <div class="container">
17         <div class="contentContainer">
18             <p>"Hello World!" == <span id="str1"></span></p>
19             <p>"" == <span id="str2"></span></p>
20             <p>"hello123" == <span id="strNum"></span></p>
21             <p>null == <span id="rNull"></span></p>
22             <p>undefined == <span id="rUndefined"></span></p>
23             <p>true == <span id="boolean"></span></p>
24             <p>10 == <span id="num1"></span></p>
25             <p>10.5 == <span id="num4"></span></p>
26             <p>0xf == <span id="num2"></span></p>
27             <p>010 == <span id="num3"></span></p>
28             <p>"000010" == <span id="numStr"></span></p>
29             <p>" 10" == <span id="nullNum"></span></p>
30             <p>" 123blue" == <span id="nullNumStr"></span></p>
31             <p>obj == <span id="obj"></span></p>
32         </div>
33     </div>
34     <script>
35         var numList = {
36             "num1":1,
37             "num2":2
38         };
39         numList.toString = function(){
40                 return "100";
41             };
42 
43         document.getElementById("str1").innerHTML = parseInt("Hello World!"); // 非空字串返回NaN
44         document.getElementById("str2").innerHTML = parseInt(""); // 空字串返回NaN
45         document.getElementById("strNum").innerHTML = parseInt("hello123"); // 第一個非空字元非數字返回NaN
46         document.getElementById("rNull").innerHTML = parseInt(null); // null返回NaN
47         document.getElementById("rUndefined").innerHTML = parseInt(undefined); // undefined返回NaN
48         document.getElementById("boolean").innerHTML = parseInt(true); // 布林值返回NaN
49         // 由此可見parseInt()只處理第一個非空字元為數字的值
50         document.getElementById("num1").innerHTML = parseInt(10); // 數值返回該數值
51         document.getElementById("num4").innerHTML = parseInt(10.5); // 浮點數返回去掉小數的整數
52         document.getElementById("num2").innerHTML = parseInt(0xf); // 十六進位制返回十進位制
53         document.getElementById("num3").innerHTML = parseInt(010); // 八進位制返回十進位制,嚴格模式下八進位制無效,會解析為10
54         document.getElementById("numStr").innerHTML = parseInt("000010"); // 去掉多餘的0返回數值
55         document.getElementById("nullNum").innerHTML = parseInt(" 10"); // 去掉前面的空格返回數值
56         document.getElementById("nullNumStr").innerHTML = parseInt(" 123blue"); // 第一個非空字元為數字返回數值
57         document.getElementById("obj").innerHTML = parseInt(numList); // 呼叫物件的valueOf()或者toString()方法
58     </script>
59 </body>
60 </html>

顯示效果:

 1 <!-- parseFloat()函式轉換規則 -->
 2 <!DOCTYPE html>
 3 <html lang="zh-cn">
 4 <head>
 5     <meta charset="UTF-8">
 6     <title>testDocument</title>
 7     <style>
 8         html,body{width: 100%;height: 100%;}
 9         html,body,p{padding: 0;margin: 0;}
10         div{box-sizing: border-box;}
11         .container{width: 100%;height:100%;padding-left: calc((100vw - 600px) * .5);background-color: #006699;overflow: auto;}
12         .contentContainer{background-color: #fff;width: 600px;height: 100%;}
13     </style>
14 </head>
15 <body>
16     <div class="container">
17         <div class="contentContainer">
18             <p>"Hello World!" == <span id="str1"></span></p>
19             <p>"" == <span id="str2"></span></p>
20             <p>"hello123" == <span id="strNum"></span></p>
21             <p>null == <span id="rNull"></span></p>
22             <p>undefined == <span id="rUndefined"></span></p>
23             <p>true == <span id="boolean"></span></p>
24             <p>10 == <span id="num1"></span></p>
25             <p>10.5 == <span id="num4"></span></p>
26             <p>0xf == <span id="num2"></span></p>
27             <p>010 == <span id="num3"></span></p>
28             <p>"000010" == <span id="numStr1"></span></p>
29             <p>"10.5.23" == <span id="numStr2"></span></p>
30             <p>" 10" == <span id="nullNum"></span></p>
31             <p>" 123.23blue" == <span id="nullNumStr"></span></p>
32             <p>obj == <span id="obj"></span></p>
33         </div>
34     </div>
35     <script>
36         var numList = {
37             "num1":1,
38             "num2":2
39         };
40         numList.toString = function(){
41                 return "100";
42             };
43 
44         document.getElementById("str1").innerHTML = parseFloat("Hello World!"); // 非空字串返回NaN
45         document.getElementById("str2").innerHTML = parseFloat(""); // 空字串返回NaN
46         document.getElementById("strNum").innerHTML = parseFloat("hello123"); // 第一個非空字元非數字返回NaN
47         document.getElementById("rNull").innerHTML = parseFloat(null); // null返回NaN
48         document.getElementById("rUndefined").innerHTML = parseFloat(undefined); // undefined返回NaN
49         document.getElementById("boolean").innerHTML = parseFloat(true); // 布林值返回NaN
50         // 由此可見parseFloat()只處理第一個非空字元為數字的值
51         document.getElementById("num1").innerHTML = parseFloat(10); // 數值返回該數值
52         document.getElementById("num4").innerHTML = parseFloat(10.5); // 浮點數返回去掉小數的整數
53         document.getElementById("num2").innerHTML = parseFloat(0xf); // 十六進位制返回十進位制
54         document.getElementById("num3").innerHTML = parseFloat(010); // 八進位制返回十進位制,嚴格模式下八進位制無效,會解析為10
55         document.getElementById("numStr1").innerHTML = parseFloat("000010"); // 去掉多餘的0返回數值
56         document.getElementById("numStr2").innerHTML = parseFloat("10.5.23"); // 多餘的小數點後面的值都會去掉
57         document.getElementById("nullNum").innerHTML = parseFloat(" 10"); // 去掉前面的空格返回數值
58         document.getElementById("nullNumStr").innerHTML = parseFloat(" 123.23blue"); // 第一個非空字元為數字返回數值
59         document.getElementById("obj").innerHTML = parseFloat(numList); // 呼叫物件的valueOf()或者toString()方法
60     </script>
61 </body>
62 </html>

顯示效果:

注: parseInt() 和 parseFloat() 都是由兩個引數的,第一個引數是需要轉換的值,第二個引數是轉換使用的基數(即多少進位制),為了防止轉換出現問題,使用多進位制轉換的時候可以制定基數,避免不必要的錯誤。

 5、String型別

在ECMAScript中字串用雙引號(")或者單引號(')都是可以的,但是為了做一個全方面發展的好程式設計師,還是區分對待比較好。就目前我學過的語言來說,雙引號(“)多用於合法的字串符號。

(1)字元字面量

這個就是String型別所說的轉義字元的,對照表網上一搜一大堆,我就不特別列舉了。需要注意的是一個轉義字元就表示1個字元。

(2)字串的特點

字串是不可變的,也就是說一旦建立不可改變。這就使得修改字串成為了一個先破後立的過程。

(3)轉換為字串

數值轉換字串都會轉換成十進位制,然後輸出字串。

轉換字串除了以下兩個傳統方法以外,使用 value + "" 也能達到轉換字串的效果。

 ① toString() 方法

null和undefined沒有 toString() 方法,如果使用會報錯。

 1 <!-- toString()函式轉換規則 -->
 2 <!DOCTYPE html>
 3 <html lang="zh-cn">
 4 <head>
 5     <meta charset="UTF-8">
 6     <title>testDocument</title>
 7     <style>
 8         html,body{width: 100%;height: 100%;}
 9         html,body,p{padding: 0;margin: 0;}
10         div{box-sizing: border-box;}
11         .container{width: 100%;height:100%;padding-left: calc((100vw - 600px) * .5);background-color: #006699;overflow: auto;}
12         .contentContainer{background-color: #fff;width: 600px;height: 100%;}
13     </style>
14 </head>
15 <body>
16     <div class="container">
17         <div class="contentContainer">
18             <p>null == <span id="rNull"></span></p>
19             <p>undefined == <span id="rUndefined"></span></p>
20             <p>true == <span id="boolean"></span></p>
21             <p>255 == <span id="num1"></span></p>
22             <p>255 == <span id="num1_2"></span> (二進位制)</p>
23             <p>255 == <span id="num1_8"></span> (八進位制)</p>
24             <p>255 == <span id="num1_16"></span> (十六進位制)</p>
25             <p>10.5 == <span id="num4"></span></p>
26             <p>0xf == <span id="num2"></span></p>
27             <p>010 == <span id="num3"></span></p>
28             <p>obj == <span id="obj"></span></p>
29         </div>
30     </div>
31     <script>
32         var n1 = 255;
33         var n2 = 0xf;
34         var n3 = 010;
35         var n4 = 10.5;
36         var rNull = null;
37         var rUndefined = undefined;
38         var rBoolean = true;
39         var numList = {
40             "num1":1,
41             "num2":2
42         };
43 
44         // document.getElementById("rNull").innerHTML = rNull.toString(); // null轉字串,沒有toString()方法,所以不能用toString轉換
45         // document.getElementById("rUndefined").innerHTML = rUndefined.toString(); // undefined轉字串,沒有toString()方法,所以不能用toString轉換
46         document.getElementById("boolean").innerHTML = rBoolean.toString(); // Boolean轉字串
47         document.getElementById("num1").innerHTML = n1.toString(); // 整數轉字串
48         // toString()方法的引數是輸出基數,即進位制
49         document.getElementById("num1_2").innerHTML = n1.toString(2); // 整數轉字串,二進位制
50         document.getElementById("num1_8").innerHTML = n1.toString(8); // 整數轉字串,八進位制
51         document.getElementById("num1_16").innerHTML = n1.toString(16); // 整數轉字串,十六進位制
52         document.getElementById("num4").innerHTML = n4.toString(); // 浮點數轉字串
53         document.getElementById("num2").innerHTML = n2.toString(); // 十六進位制整數轉字串,會先轉換成十進位制
54         document.getElementById("num3").innerHTML = n3.toString(); // 八進位制整數轉字串,會先轉換成十進位制
55         document.getElementById("obj").innerHTML = numList.toString(); // 物件轉字串
56     </script>
57 </body>
58 </html>

 顯示效果:

 ② String() 方法

 1 <!-- String()函式轉換規則 -->
 2 <!DOCTYPE html>
 3 <html lang="zh-cn">
 4 <head>
 5     <meta charset="UTF-8">
 6     <title>testDocument</title>
 7     <style>
 8         html,body{width: 100%;height: 100%;}
 9         html,body,p, pre{padding: 0;margin: 0;}
10         div{box-sizing: border-box;}
11         .container{width: 100%;height:100%;padding-left: calc((100vw - 600px) * .5);background-color: #006699;overflow: auto;}
12         .contentContainer{background-color: #fff;width: 600px;height: 100%;}
13     </style>
14 </head>
15 <body>
16     <div class="container">
17         <div class="contentContainer">
18 <!--             <p>null == <span id="rNull"></span></p>
19             <p>undefined == <span id="rUndefined"></span></p>
20             <p>true == <span id="boolean"></span></p>
21             <p>255 == <span id="num1"></span></p>
22             <p>10.5 == <span id="num4"></span></p>
23             <p>0xf == <span id="num2"></span></p>
24             <p>010 == <span id="num3"></span></p>
25             <p>obj == <span id="obj"></span></p> -->
26             <pre>
27 <script>
28 var n1 = 255;
29 var n2 = 0xf;
30 var n3 = 010;
31 var n4 = 10.5;
32 var rNull = null;
33 var rUndefined = undefined;
34 var rBoolean = true;
35 var numList = {
36     "num1":1,
37     "num2":2
38 };
39 
40 document.writeln("null == " + String(rNull)); // null轉字串
41 document.writeln("undefined == " + String(rUndefined)); // undefined轉字串
42 document.writeln("true == " + String(rBoolean)); // Boolean轉字串
43 document.writeln("255 == " + String(n1)); // 整數轉字串
44 document.writeln("10.5 == " + String(n4)); // 浮點數轉字串
45 document.writeln("0xf == " + String(n2)); // 十六進位制整數轉字串,會先轉換成十進位制
46 document.writeln("010 == " + String(n3)); // 八進位制整數轉字串,會先轉換成十進位制
47 document.writeln("obj == " + String(numList)); // 物件轉字串
48 
49 
50 // document.getElementById("rNull").innerHTML = String(rNull); // null轉字串
51 // document.getElementById("rUndefined").innerHTML = String(rUndefined); // undefined轉字串
52 // document.getElementById("boolean").innerHTML = String(rBoolean); // Boolean轉字串
53 // document.getElementById("num1").innerHTML = String(n1); // 整數轉字串
54 // document.getElementById("num4").innerHTML = String(n4); // 浮點數轉字串
55 // document.getElementById("num2").innerHTML = String(n2); // 十六進位制整數轉字串,會先轉換成十進位制
56 // document.getElementById("num3").innerHTML = String(n3); // 八進位制整數轉字串,會先轉換成十進位制
57 // document.getElementById("obj").innerHTML = String(numList); // 物件轉字串
58 </script>
59             </pre>
60         </div>
61     </div>
62 </body>
63 </html>

 顯示效果:

6、Object型別

物件其實就是一組資料和功能的集合。

var obj = new Object(); // 可以建立一個物件

Object的每個例項都具有一下屬性和方法:

① constructor :建構函式;

② hasOwnProperty :用以檢查給定屬性是否存在於當前物件例項中;

③ isPrototypeOf :用以檢查傳入的物件是否是傳入物件的原型;

④ propertyIsEnumerable :用以檢查給定的屬性是否能夠用for-in語句來列舉;

⑤ toLocaleString() :返回物件的字串表示,該字串與執行環境的地區相對應;

⑥ toString() :返回物件的字串表示;

⑦ valueOf() :返回物件的字串、數值或布林值表示。通常與 toString() 方法的返回值一致。


本文內容包含學習過程中的認識和實際應用時的經驗,會不斷補充更新。最新更新時間(2018-02-01 16:43:26)。