《Javascript 高階程式設計(第三版)》筆記0x2 JavaScript基本概念(1)
目錄
-
語法
- 區分大小寫
- 識別符號:首字元為字母、下劃線或美元符,慣用駝峰命名(首字母小寫,其餘單詞首字母大寫)
- 註釋
//單行註釋
/*
* 多行
*/
4. 嚴格模式(strict mode)
嚴格模式是為 JavaScript 定義了一種不同的解析與執行模型。在嚴格模式下, ECMAScript 3 中的一些不確定的行為將得到處理,而且對某些不安全的操作也會丟擲錯誤。
function doSomething(){
"use strict";
//函式體
}
-
變數
鬆散型別,可以用來儲存任何型別的資料。
var message; message = “hello world”; var num=10; //用 var 操作符定義的變數將成為定義該變數的作用域中的區域性變數。 //可以像下面這樣省略 var 操作符,從而建立一個全域性變數 function test(){ message = "hi"; // 全域性變數 } test(); alert(message); // "hi" //可以使用一條語句定義多個變數 var message = "hi", found = false, age = 29;
-
資料型別
基本資料型別:Undefined、Null、Boolean、Number和 String
複雜資料型別:Object(本質上是由一組無序的名值對組成的)
typeof:
檢測給定變數的資料型別,返回值有:"undefined"、"boolean"、"string"、"number"、"object"、"function"。
var message = "some string";
alert(typeof message); // "string"
alert(typeof(message)); // "string"
alert(typeof 95); // "number"
//注意,typeof 是一個操作符而不是函式
Undefined型別
Undefined 型別只有一個值,即特殊的 undefined。
var message;
alert(message == undefined); //true
var message; // 這個變數宣告之後預設取得了 undefined 值
// 下面這個變數並沒有宣告
// var age
alert(typeof message); // "undefined"
alert(typeof age); // "undefined"
Null型別
只有一個值的資料型別,這個特殊的值是 null,表示一個空物件指標
var car = null;
alert(typeof car); // "object"
//undefined 值是派生自 null 值的,因此 ECMA-262 規定對它們的相等性測試要返回 true:
alert(null == undefined); //true
Boolean型別
ECMAScript 中使用得最多的一種型別,有兩個字面值: true 和 false(區分大小寫)
雖然 Boolean 型別的字面值只有兩個,但 ECMAScript 中所有型別的值都有與這兩個 Boolean 值等價的值。
資料型別 | 轉換為true的值 | 轉換為false的值 |
Boolean | true | false |
String | 任何非空字串 | ""(空字串) |
Number | 任何非零數字值(包括無窮大) | 0和NaN |
Object | 任何物件 | null |
Undefined | not applicable | undefined |
//強制轉換
var message = "Hello world!";
var messageAsBoolean = Boolean(message);
//自動轉換
var message = "Hello world!";
if (message){
alert("Value is true");
}
Number型別
使用 IEEE754 格式來表示整數和浮點數值
var intNum = 55; // 整數
var octalNum1 = 070; // 八進位制的 56
var octalNum2 = 079; // 無效的八進位制數值——解析為 79
var octalNum3 = 08; // 無效的八進位制數值——解析為 8
var hexNum1 = 0xA; // 十六進位制的 10
var hexNum2 = 0x1f; // 十六進位制的 31
//在進行算術計算時,所有以八進位制和十六進位制表示的數值最終都將被轉換成十進位制數值。
浮點數值
var floatNum1 = 1.1;
var floatNum2 = 0.1;
var floatNum3 = .1; // 有效,但不推薦
var floatNum1 = 1.; // 小數點後面沒有數字——解析為 1
var floatNum2 = 10.0; // 整數——解析為 10
var floatNum = 3.125e7; // 等於 31250000
浮點數值的最高精度是 17 位小數,但在進行算術計算時其精確度遠遠不如整數。例如, 0.1 加 0.2的結果不是 0.3,而是 0.30000000000000004。
數值範圍
Number.MIN_VALUE 5e-324
Number.MAX_VALUE 1.7976931348623157e+308
-Infinity(負無窮)
Infinity(正無窮)
//判斷是否無窮,是返回false
var result = Number.MAX_VALUE + Number.MAX_VALUE;
alert(isFinite(result)); //false
NaN
Not a Number
alert(isNaN(NaN)); //true,注意NaN不等於任何值,包括NaN
alert(isNaN(10)); //false( 10 是一個數值)
alert(isNaN("10")); //false(可以被轉換成數值 10)
alert(isNaN("blue")); //true(不能轉換成數值)
alert(isNaN(true)); //false(可以被轉換成數值 1)
數值轉換
Number()、 parseInt()和 parseFloat()。第一個函式,即轉型函式 Number()可以用於任何資料型別,而另兩個函式則專門用於把字串轉換成數值。
/*---------------------------Number()------------------------------------------------*/
var num1 = Number(true); //1
var num2 = Number(11); //11
var numVar = null;
var num3 = Number(numVar); //0
var num4 = Number(undefined);//NaN
var num5 = Number("001"); //1
var num6 = Number("1.1"); //1.1
var num7 = Number("0xa"); //10
var num8 = Number(""); //0
var num9 = Number("Hello world!"); //NaN
/*如果是物件,則呼叫物件的 valueOf()方法,然後依照前面的規則轉換返回的值。如果轉換的結果是 NaN,則呼叫物件的 toString()方法,
然後再次依照前面的規則轉換返回的字串值
*/
/*---------------------------parseInt()------------------------------------------------*/
var num1 = parseInt("1234blue"); // 1234
var num2 = parseInt(""); // NaN
var num3 = parseInt("0xA"); // 10(十六進位制數)
var num4 = parseInt(22.5); // 22
var num5 = parseInt("070"); // 56(八進位制數)
var num6 = parseInt("70"); // 70(十進位制數)
var num7 = parseInt("0xf"); // 15(十六進位制數)
//解決進位制分歧
var num1 = parseInt("AF", 16); //175
var num2 = parseInt("AF"); //NaN
var num1 = parseInt("10", 2); //2 (按二進位制解析)
var num2 = parseInt("10", 8); //8 (按八進位制解析)
var num3 = parseInt("10", 10); //10 (按十進位制解析)
var num4 = parseInt("10", 16); //16 (按十六進位制解析)
/*---------------------------parseFloat()----------------------------------------------*/
var num1 = parseFloat("1234blue"); //1234 (整數)
var num2 = parseFloat("0xA"); //0
var num3 = parseFloat("22.5"); //22.5
var num4 = parseFloat("22.34.5"); //22.34
var num5 = parseFloat("0908.5"); //908.5
var num6 = parseFloat("3.125e7"); //31250000
String型別
String 型別用於表示由零或多個 16 位 Unicode 字元組成的字元序列,即字串。
var firstName = "Nicholas";
var lastName = 'Zakas';
字元字面量
字面量 | 含義 |
\n | 換行 |
\t | 製表 |
\b | 空格 |
\r | 回車 |
\f | 進紙 |
\\ | 斜槓 |
\' | 單引號('),在用單引號表示的字串中使用。例如: 'He said, \'hey.\'' |
\" | 雙引號("),在用雙引號表示的字串中使用。例如: "He said, \"hey.\"" |
\xnn | 以十六進位制程式碼nn表示的一個字元(其中n為0~F)。例如, \x41表示"A" |
\unnnn | 以十六進位制程式碼nnnn表示的一個Unicode字元(其中n為0~F)。例如, \u03a3表示希臘字元Σ |
var text = "This is the letter sigma: \u03a3.";
alert(text.length); // 輸出 28
字串的特點
ECMAScript 中的字串是不可變的,也就是說,字串一旦建立,它們的值就不能改變。
var lang = "Java";
lang = lang + "Script";
/*首先建立一個能容納 10 個字元的新字串,然後在這個字串中填充"Java"和"Script",
最後一步是銷燬原來的字串"Java"和字串"Script"*/
轉換為字串
var age = 11;
var ageAsString = age.toString(); // 字串"11"
var found = true;
var foundAsString = found.toString(); // 字串"true"
/*按不同進位制數*/
var num = 10;
alert(num.toString()); // "10"
alert(num.toString(2)); // "1010"
alert(num.toString(8)); // "12"
alert(num.toString(10)); // "10"
alert(num.toString(16)); // "a"
var value1 = 10;
var value2 = true;
var value3 = null;
var value4;
alert(String(value1)); // "10"
alert(String(value2)); // "true"
alert(String(value3)); // "null"
alert(String(value4)); // "undefined"
Object型別
ECMAScript 中的物件其實就是一組資料和功能的集合。物件可以通過執行 new 操作符後跟要建立的物件型別的名稱來建立。Object 型別所具有的任何屬性和方法也同樣存在於更具體的物件中。
Object 的每個例項都具有下列屬性和方法:
constructor:儲存著用於建立當前物件的函式。對於前面的例子而言,建構函式(constructor)就是 Object()。
hasOwnProperty(propertyName):用於檢查給定的屬性在當前物件例項中(而不是在例項的原型中)是否存在。其中,作為引數的屬性名(propertyName)必須以字串形式指定(例如: o.hasOwnProperty("name"))。
isPrototypeOf(object):用於檢查傳入的物件是否是傳入物件的原型。
propertyIsEnumerable(propertyName):用於檢查給定的屬性是否能夠使用 for-in 語句來列舉。與 hasOwnProperty()方法一樣,作為引數的屬性名必須以字串形式指定。
toLocaleString():返回物件的字串表示,該字串與執行環境的地區對應。
toString():返回物件的字串表示。
valueOf():返回物件的字串、數值或布林值表示。通常與 toString()方法的返回值相同。