JavaScript高級程序設計 第3章 學習筆記

標識符 指變量、函數、屬性的名字.編程

關鍵字不能做爲標識符,ECMAScript3的JavaScript引擎中使用關鍵詞做標識符,會致使"Identifier Expected"錯誤.編程語言

ECMAScript中有5種簡單數據類型(也稱爲基本數據類型、原始數據類型):
Underfined、Null、Boolean、Number、String
1種複雜數據類型: Object函數

typeof 是操做符而不是函數,用於檢查變量的數據類型
"underfined" -> 若是這個值未定義
"boolean" -> 若是這個值是布爾值
"string" -> 若是這個值是字符串
"number" -> 若是這個值是數值
"object" -> 若是這個值是對象或null;
"function" -> 若是這個值是函數this

typeof例子:編碼

typeof underfined; // "underfined"
typeof Underfined; // "underfined"

typeof boolean; // "underfined"
typeof false; // "boolen"
typeof true; // "boolen"
typeof Boolean; // "function"

typeof "123"; // "string"
typeof ""; // "string"
typeof String; // "function"

typeof 123; // "number"
typeof 0.1; // "number"
typeof NaN; // "number"
typeof Infinity; // "number"
typeof -Infinity; // "number"
typeof Number.MIN_VALUE; // "number"
typeof Number.MAX_VALUE; // "number"
typeof Number.NEGATIVE_INFINITY; // "number"  -Infinity 負無窮 也是數值
typeof Number.POSITIVE_INFINITY; // "number"  Infinity 正無窮 也是數值

Number.NEGATIVE_INFINITY == -Infinity; // true
Number.POSITIVE_INFINITY == Infinity; // true

typeof number; // "underfined"
typeof Number; // "function"

typeof null; // "object"
typeof this; // "object"

//undefined值是派生自null值
alert(null == undefined); //true

var car;
if (car == null) {
    alert("undefined or null");   // 執行,由於 undefined == null
} 

3.4.4 Boolean類型
對任何數據類型的值調用 Boolean() 函數,總返回 false 或 true
false、""、0、NaN、undefined、null ---> 這6個調用Boolean()都是false,其他都是truespa

3.4.5 Number類型
Number 由 數值 和 非數值(NaN) 組成.
數值: -Infinity Number.MIN_VALUE 正常數值 Number.MAX_VALUE Infinity
非數值: NaN
八進制第1位必須是(0),範圍(0-7),超出範圍會以十進制解析.
十六進制前2位必須是(0x)不分大小寫, 範圍(0-9 | A-F)不分大小寫.prototype

var num = 70; // 70
var num = 070;   // 56
var num = 08; // 8

var num = 0xA; //10
var num = 0x1f; //31

浮點數值必須包含1個小數點,而且小點數點後面必須至少有1位數字
保存浮點數值的內存空間是保存整數值的兩倍.
數值範圍 (Number.MIN_VALUE - Number.MAX_VALUE)code

Number.MIN_VALUE == 5e-324; // true;
Number.MAX_VALUE == 1.7976931348623157e308; // true;
Number.MAX_VALUE + Number.MAX_VALUE; // Infinity(正無窮) 
Number.MAX_VALUE - Number.MAX_VALUE; // 0

Number.MIN_VALUE + Number.MIN_VALUE;  // 1e-323   ?不懂爲何我覺得是 -Infinity但不是
Number.MIN_VALUE - Number.MIN_VALUE;  // 0

Number.NEGATIVE_INFINITY == -Infinity; // true
Number.POSITIVE_INFINITY == Infinity; // true

isFinite()函數用於判斷一個數值是否是有窮的(位於最小和最大之間)對象

isFinite(-Infinity);  //false
isFinite(Number.MIN_VALUE);  // true
isFinite(100);  //true
isFinite(Number.MAX_VALUE); // true
isFinite(Infinity); //false
isFinite(NaN);  //false

「36÷6」讀做「三十六除以六」,其意思也可說成「6除36」
其它編程語言中任何數值除以非數值會報錯,但ECMAScript中會返回NaN
任何涉及 NaN 的操做都等於 NaNblog

 

15/"steto"; // NaN  任何數值除以非數值都返回NaN
10/0;  // Infinity

0/"sdfowett";  // NaN
0/0;  // NaN

NaN == NaN; // false

0除以任何非零數都得0
0除以0沒有意義獲得 NaN

isNaN() 函數
isNaN()接受一個參數用於判斷這個參數是否是"非數值",isNaN()函數會調用Number()嘗試將這個參數轉換爲數值,結果是非數值就返回true,不然false

isNaN("");  // false   ""轉爲0
isNaN(null); // false  null 轉爲 0;
isNaN(undefined); // true  undefined轉爲NaN
isNaN(true); //false  true轉爲1
isNaN(false); //false  false轉爲0
isNaN(070); //false
isNaN("070"); //false
isNaN("070a"); //true
isNaN(Infinity); //false

4. 數值轉換
有3個函數能夠把非數值轉換爲數值: Number()、parseInt()和parseFloat()。
Number()能夠用於任何數據類型,而parseInt()和parseFloat()只能用於數值和字符串,傳入數值和字符串覺得的類型都會返回NaN,例如傳入underfined、null、Boolean、Function、Object
Number() 函數 與一元加操做符 + 功能相同.

Number(true); // 1
Number(false); // 0
Number(""); // 0
Number(null); // 0
Number(undefined); // NaN
Number(NaN); // Nan
Number(Infinity);  // Infinity

Number(Number.NEGATIVE_INFINITY);  // -Infinity
Number(Number.MIN_VALUE);  // 5e-324
Number(Number.MAX_VALUE);  // 1.7976931348623157e+308
Number(Number.POSITIVE_INFINITY);  // Infinity

Number(+10); //10
Number(-10); //-10
Number("10"); //10

Number(0x10);  //16
Number("0x10"); //16
Number("0xf"); //15
Number(070);  //56 由於070是八進制


Number("070"); //70
Number("01.1"); //1.1
Number("0x01.1"); //NaN
Number("0x1.1"); //NaN

Number("123a"); //NaN
Number(011);  //9  由於011是八進制
Number("011"); //11

Number(    99);  //99
Number("     99"); //99
Number("0     99"); //NaN
Number("1     99"); //NaN

var obj = {};
Number(obj); // NaN
isNaN(f); // true

var obj = {
    toString: function(){
        return 1;
    },
    valueOf: function(){
        return "2";
    }
}
Number(obj); // 2 有 valueOf()就用, 沒有就用  toString()
isNaN(obj); // false  由於 "2" 轉爲2

function f(){};
f.valueOf = function(){
    return "abc";
}
f.toString = function(){
    return 2;
}
Number(f);  // NaN  "abc" 轉 NaN
isNaN(f); // true "abc" 轉 NaN

Number()函數總結:
null、 "" 轉爲0
undefined、NaN、非純數值字符串轉爲 NaN
對於數值, 0開頭的把這個值看做八進制轉十進制, 0x開頭的把這個值看做十六進制轉十進制
對於純數字字符串, 八進制被忽略(即0開頭被忽略),0x開關的仍把這個值看做十六進制轉十進制
function和object若是有 valueOf調用valueOf()方法獲得的值進行轉換,沒有找toString再沒有結果就NaN

parseInt()函數只返回 整數數值 或 NaN 忽略小數點
parseInt()函數傳入的是對象的話,調用對象的toString()方法

parseInt()函數 接受2個參數,第1個參數只能是數值類型或字符串類型,若第1個參數傳入其它類型一概返回NaN,第2個參數指定進制基數,只能是2 8 10 16
parseInt()函數自動忽略字符串前面的空格直到查找第一位是否是數值字符或者正負號,若是不是直接返回NaN
對於字符串忽視8進制,即忽略前面的0, 對於字符串前面包含0x當16進制.
指定第2個參數表示進制時,第1個參數進制符號可忽略
示例:

parseInt(null); // NaN
parseInt(undefined); // NaN
parseInt(NaN);  // NaN
parseInt(false); // NaN
parseInt(true); // NaN

parseInt(  22.5);  //22
parseInt("  22.5");  //22
parseInt("  22.5sse");  //22
parseInt(""); // NaN
parseInt("   -5"); //-5
parseInt("   +5"); //5
parseInt("   -5ss"); //-5
parseInt("   -55ss"); //-55
parseInt(070); //56  070當八進制
parseInt("070"); //70

parseInt("070",8); //56  070當八進制

parseInt(0x10);  // 16  0x10當16進制
parseInt("0x10");  //16  0x10當16進制
parseInt("   0x10");  //16  0x10當16進制
parseInt("   -0x10");  //-16  0x10當16進制
parseInt("   -0x10gggge");  //-16  0x10當16進制
parseInt("f");  // NaN
parseInt("f",16);  //15
parseInt("gf",16);  //NaN

parseInt("0     99");  //0
parseInt("     99");  //99
parseInt("1     99ss"); //1

var obj = {
    toString: function(){
        return 1;
    },
    valueOf: function(){
        return "2";
    }
}

parseInt(obj); // 1 調用toString()
var obj = {
   
    valueOf: function(){
        return "2";
    }
}

parseInt(obj); // NaN

 

parseFloat() 只接受1個參數,與parseInt()同樣,第1個參數只能是數值類型或字符串類型,若第1個參數傳入其它類型一概返回NaN
一樣忽略字符串前面的空格.
對於字符串忽視8進制16進制,即忽略前面的0, 對於0x, 都只當10進制解析 0x10 -> 0

parseFloat(""); // NaN
parseFloat("     1.25.2"); //1.25
parseFloat("     -1.25.2"); //-1.25
parseFloat("     +1.25.2"); //1.25
parseFloat(070); //56
parseFloat(0xf); //15
parseFloat("070"); //70
parseFloat("0xf");  // 0
parseFloat("0x10");  // 0
parseFloat(undefined); // NaN
parseFloat(null);  // NaN
parseFloat(0908.5); //908.5
parseFloat(10.0000);  //10
parseFloat("  10.000000000") // 10
parseFloat("    1234blue");  // 1234

3.4.6 String 類型
String數據類型包含一些特殊的字符字面量,也叫轉義序列, 這些字符字面量以下表示
\n 換行
\t 製表
\b 退格
\r 回車
\f 進紙
\\ 斜槓
\' 單引號
\" 雙引號
\xnn 以16進制代碼nn表示的一個字符(其中n爲0 - F) 例如 \x41 表示 "A"
\unnn 以16進制代碼nnn表示的一個Unicode字符(其中n爲0-F) 例如 \u03a3表示希臘字符 ∑

這些字符僅被做爲一個字符長度來解析,例如:

var text = "This is \u03a3.";
alert(text.length); //  10

var text = "This is \n.";
alert(text.length); //  10

var text = "This is \".";
alert(text.length); //  10

var text = "This is \"\r\n.";
alert(text.length); //  12

toString() 轉換爲字符串方法 可接受一個參數表示進制基數2 8 10 16
幾乎每種類型都有toString()方法 null 和 undefined 值沒有這個方法.

null.toString(); //報錯
undefined.toString(); //報錯;

var num;
num.toString(); //報錯

var num = null;
num.toString(); //報錯

var num = 10;
num.toString();  //"10"
num.toString(2); //"1010"  十進制10轉爲二進制獲得  1010
num.toString(8); //"12" 十進制10轉爲八進制獲得  12
num.toString(10); //"12" 十進制10轉爲十進制獲得  10
num.toString(16); //"a" 十進制10轉爲十六進制獲得  a

var num = true;
num.toString(); // "true";

在不知道要轉換的值是否是null或nudefined的狀況下,可使用轉型函數String(),這個函數
可以將任何類型的值轉換爲字符串,String()函數遵循下列轉換規則:
若是值有toString()方法,則調用該方法(沒有參數)並返回相應的結果;
若是值是null, 則返回 "null"
若是值是undefined, 則返回"undefined"

String(10); // "10"   調用 .toString()
String(true); //"true"  調用 .toString()
String(null); // "null"  
String(undefined); // "undefined"
var num = null;
String(num); // "null"
var num1;
String(num1); // "undefined"

null 和 undefined 沒有.toString()方法,因此String()返回這兩個值的字面量

技巧: 要把某個值轉換爲字符串,可使用加號操做符+ 把它與一個空字符串 "" 加在一塊兒.原理是一個類型與字符串相加,這個類型會先被轉爲字符串.

true + ""; // "true" 
null + ""; // "null"
undefined + ""; //"undefined"

var a;
a + ""; //"undefined"
var b=null;
b + ""; // "null"

3.4.7 Object 類型
Object是全部對象的基礎,Object的每一個實例都具備下列屬性和方法:

constructor: 屬性 保存着用於建立當前對象的函數.
hasOwnProperty(propertyName): 檢查給定的屬性在當前對象實例中(而不是在實例的原型中)是否存在.參數名(propertyName)必須是字符串.
isPrototypeOf(object): 檢查傳入的對象是不是當前對象的原型.
propertyIsEnumerable(propertyName): 檢查給定的屬性(必須是字符串)是否可以使用for-in語句來枚舉.
toLocaleString():返回對象的字符串表示,該字符串與執行環境的地區對應.
toString():返回對象的字符串表示.
valueOf():返回對象的字符串,數值或布爾值表示.一般與toString()方法的返回值相同.

示例:

var o = new Object();
o.age = 27;
o.year = "2017";
o.constructor;   //  function Object() { [native code] }
o.hasOwnProperty("name");  // false
o.hasOwnProperty("age"); //true
Object.isPrototypeOf(o); //false  Object是function
Object.prototype.isPrototypeOf(o);  //true
o.propertyIsEnumerable("age");  //true;
o.propertyIsEnumerable("toString"); //false
o.toLocaleString();  // "[object Object]"
o.toString();  // "[object Object]"
o.valueOf(); // Object {age: 27, year: "2017"}

操做符:
++ -- + - 對非數值應用這4個操做符時,會調用Number()把它們轉爲數值

短路操做符 && ||

3.5.4 乘性操做符
ECMAScript定義3個乘性操做符: * / % , 若是參與的某個操做數不是數值,則調用Number()轉爲數值.

5 * "";  // 0
5 * true; // 5

加法減法 + -
字符串優先
從左至右,操做數(字符串)前按算術運算執行,碰到字符串自身就轉成字符串,字符串後面都按字符串處理
操做數(字符串)後面的其他操做數都會被調用String()轉爲字符串
若是沒碰到操做數(字符串),則執行算術運算,非數值都被調用Number()轉爲數值.

undefined + 2; // NaN
undefined + "2"; // "undefined2"
null + null + "2"; // "02"
"2" + null + null + 1; // "2nullnull1"
true + "2" + null + 1; // "true2null1"
true + 2 + "2" + null + 1; //"32null1"
null + null + 2; //2
null + null + 2 + "1";  // "21"

關係操做符 < > <= >= ==
數值優先,只要操做數出現數值,其它就被Number()轉爲數值.
對於全部操做數都是字符串,按字母表位置比較,大寫字母字符編碼所有小於小寫字母的字符編碼

50 < "6"; // false  "6"被轉爲6
"50" < 6;  // false "50"被轉爲 50
"50" < "6"; //true  "50" 和 "6" 字母表靠前

0 == "";  //true
"" == 0; //true
"" == "0"; //false
"Brick" < "alphabet"; //true
相關文章
相關標籤/搜索