[心得] JavaScript權威指南學習筆記

tangchen2016發表於2016-11-13

JS作為5大語言之一,在前端領域應用廣泛。

當學習一門新的程式語言時,應當對照書中示例,邊學邊做,反覆演練以加深理解。

JS中兩種最重要的資料型別是物件和陣列。

物件是名值對的集合,或者字串到值的對映的集合。

陣列是以數字為索引的列表。

當函式和物件合寫在一起時,函式就變成了方法。

自定義方法,this關鍵字是對定義方法的物件的引用。
按慣例,建構函式均首字母大寫。
jQuery程式碼非常易於識別,因為它多次利用一個$()的函式。

以下是一些基本的JS示例

var x;
x = 0;
x

x = 1;
x = 0.01;
x = "Hello World;"

x = 'JavaScript';
x = true
x = false;
x = null;
x = undefined;

var book = {
    topic: "JavaScript";
    fat: true
};

book.topic;
bock["fat"];
book.author = "Flanagan";
book.contents = {};

var primes = [2, 3, 5, 7];
primes[0];
primes.length;

primes[primes.length - 1];
primes[4] = 9;

var points = {
    {x:0, y:0},
    {x:1, y:1}
};

function plus1(x){
    return x+1;
}

points.dist = function(){
    var p1 = this[0];
    var p2 = this[1];
    var a = p2.x - p1.x;
    var b = p2.y - p1.y;
    return Math.sqrt(a*a + b*b);
};

function abs(x) {
    if (x>=0){
        return x;
    }
    else {
        return -x;
    }
}

function factorial(n) {
    var product = 1;
    while(n>1){
        product *= n;
        n--;
    }
    return product;
}

function factorial2(n){
    var i, product = 1;
    for(i=2; i<=n; i++){
        product *= i;
    }
    return product;
}


function debug(msg) {
    var log = $("#debuglog");
    if (log.length == 0) {
        log = $("<div id='debuglog'><h1>Debug Log</h1></div>");
        log.appendTo(document.body);
    }
    log.append($("<pre/>").text(msg));
}
Math.pow(2,3)
Math.round(.6)
Math.ceil(.6)
Math.floor(.6)
Math.abs(-5)
Math.max(x,y,z)
Math.min(x,y,z)
Math.random()
Math.PI
Math.E
Math.sqrt(3)
Math.log(10)

var then = new Date(2016,11,14);
var later = new Date(2016,11,14,20,55,11);
var now = new Date();
var elapsed = noew - then;
later.getFullYear()
later.getMonth()
later.getDate()
later.getDay()
later.getHours()
later.getUTCHours()

var s = "Hello, JavaScript";
s.charAt(0)
s.charAt(s.length-1)
s.substring(1,4)
s.slice(1,4)
s.slice(-3)
s.indexOf('J')
s.lastIndexOf('J')
s.split(',')
s.replace('h', 'H')
s.toUpperCase()

var text = "testing: 1, 2, 3";
var pattern = /\d+/g
pattern.test(text)
text.search(pattern)
text.match(pattern)
text.replace(pattern, '#')
text.split(/\D+/);

JS語言標準ECMAScript,簡稱ES
JS區分大小寫,HTML不區分大小寫,JS在多數情況下忽略程式的空格和換行符。

直接量就是程式中的直接資料值。

數字不能首字元出現在變數名中。

只有在缺少了分號就無法正確解析程式碼的情況下,JS才會自動補分號。

涉及return,break和continue,以及++,–運算子時不能斷行。

JS的資料型別分為原始型別和物件型別。原始型別包括數字,字串和布林值。

JS變數是無型別的,JS不區分整數值和浮點數。

考慮相容性,最好不要使用以哦為字首的整型直接量。

Js中算術運算在上溢和下溢或被0整除是不會報錯,而是返回正或負的Infinity。0除0,結果不是一個數NaN。

Js中非數字值和它自身都不等。

RegExp是正則表達處理模組。

對null執行typeof運算。結果返回object,可認為null是一個特殊物件值,含義是非物件。

用來定義的值表示更深層次的空值。undefined是預定義的全域性變數。它的值是未定義。
給變數或屬性賦值,給函式傳參,最佳選擇是null。

全域性物件應該當作保留字來看待。
全域性屬性:undefined,Infinity,NaN
全域性函式:isNaN(),ParseInt(),eval()
建構函式:Date(),RegExp(),String(),Object(),Array()
全域性物件:Math,JSON

var s = “text”;
s.len =4;
var t = s.len;
t的值為undefined,因為臨時字串隨即被銷燬。

undefined,null,布林值,數字和字串是原始值,原始值不可更改,原始值的比較是值的比較,物件的比較是引用比較。當引用同一物件時,才相等。

所有物件繼承了兩個轉換方法:toString()和valueOf()

===也稱嚴等,用來檢測兩個運算元是否嚴格相等,==允許型別轉換。

eval()是一個函式,但它已被當成運算子來對待。

eval()只有一個引數,如果傳入非字串,它直接返回該引數,否則把字串當JS程式碼解析。
關於eval()最重要的是,它呼叫它的變數作用域環境。

delete是一元操作符,用來刪除物件屬性或陣列元素。

void用來忽略運算元的值。常用在客戶端的URL中。

throw expression;丟擲異常,用try/catch/finally進行捕獲異常。

with語句用於臨時擴充套件作用域,不推薦使用。

debugger用來產生一個斷點。

use strict;嚴格模式
主要3點:
1. 禁止with
2. 變數先宣告
3. 呼叫函式中的一個this值是undefined,而非嚴格模式中,this總是一個全域性物件。

empty相當於python的pass

原型繼承是JS的核心特徵。

物件最常用的用法是建立,設定,查詢,刪除,檢測和列舉它的屬性。
物件直接量是由若干名值對組成的對映表。
new運算子是由若干名值對組成的對映表。

沒有原型的物件不多,Object.prototyp就是其一,它不繼承任何屬性。
通過原型繼承來建立物件。

var o3 = object.create(object.prototype);

extend()函式把一個物件的屬性複製到另一個物件中,只簡單複製屬性名和值,沒有複製屬性的特性,也沒有複製存取器的getter和setter方法。

物件3屬性:原型,類,和可擴充套件性。

toLocaleString()返回一個表示這個物件的本地化字串。

Js並不真正支援多維陣列。


Array.join()
Array.reverse()
Array.sort()
Array.concat(4,5)
Array.slice()
Array.splice() //插入或刪除元素的通用方法
Array.push()
Array.pop()
Array.unshift()//當多個引數時,整體一次性插入
Array.shift()

forEach()方法從頭到尾遍歷陣列,沒有for迴圈的break,必須藉助異常.

map()將呼叫的陣列的每個元素傳遞給指定的函式,並返回一個陣列,它包含該函式的返回值.

filter()方法進行過濾

every()類似所有
some()類似存在

reduce()和reduceRight()使用指定的函式將陣列元素進行組合,生成單個值.
indexOf()
lastIndexOf()

JS函式可以巢狀在其他函式中定義,並訪問它們宿主函式作用域中的任何變數.

任何函式只要作為方法呼叫,實際上都會傳入一個隱式實參this.

當方法的返回值是一個物件,則可以呼叫它的方法.這種方式稱為鏈式呼叫.

可變實參列表用arguments引數,它並非真正陣列,而是一個實參物件.

callee指代當前正在執行的函式,caller指代呼叫者.

JS中函式並非原始值.而是一種特殊物件.

函式物件可以通過作用域鏈相互關聯起來,函式體內部的變數都可以儲存在函式作用域內,這種特性稱為閉包.

相關文章