JS 備忘錄

Number

js 數值只有 Number,唯一能判斷NaN的方法是通過 isNaN() 函數:

isNaN(NaN); // true

null和undefined

在其他語言中,也有類似JavaScript的null的表示,例如Java也用null,Swift用nil,Python用None表示。但是,在JavaScript中,還有一個和null類似的undefined,它表示“未定義”。

JavaScript的設計者希望用null表示一個空的值,而undefined表示值未定義。事實證明,這並沒有什麼卵用,區分兩者的意義不大。大多數情況下,我們都應該用null。undefined僅僅在判斷函數參數是否傳遞的情況下有用。

數組

數組是一組按順序排列的集合,集合的每個值稱爲元素。JavaScript的數組可以包括任意數據類型。例如:

var a = [1, 2, 3.14, 'Hello', null, true];

上述數組包含6個元素。數組用[]表示,元素之間用,分隔。

另一種創建數組的方法是通過Array()數組構造函數實現,調用item()方法來獲取數據:

new Array(1, 2, 3); // 創建了數組[1, 2, 3]

push()向Array的末尾添加若干元素,pop()則把Array的最後一個元素刪除掉:
如果要往Array的頭部添加若干元素,使用unshift()方法,shift()方法則把Array的第一個元素刪掉.

splice
splice()方法是修改Array的“萬能方法”,它可以從指定的索引開始刪除若干元素,然後再從該位置添加若干元素.

var arr = ['Microsoft', 'Apple', 'Yahoo', 'AOL', 'Excite', 'Oracle'];
// 從索引2開始刪除3個元素,然後再添加兩個元素:
arr.splice(2, 3, 'Google', 'Facebook'); // 返回刪除的元素 ['Yahoo', 'AOL', 'Excite']
arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']
// 只刪除,不添加:
arr.splice(2, 2); // ['Google', 'Facebook']
arr; // ['Microsoft', 'Apple', 'Oracle']
// 只添加,不刪除:
arr.splice(2, 0, 'Google', 'Facebook'); // 返回[],因爲沒有刪除任何元素
arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']

對象

JavaScript的對象是一組由鍵-值組成的無序集合,例如:

var person = {
    name: 'Bob',
    age: 20,
    tags: ['js', 'web', 'mobile'],
    city: 'Beijing',
    hasCar: true,
    zipcode: null
};

JavaScript對象的鍵都是字符串類型,值可以是任意數據類型。上述person對象一共定義了6個鍵值對,其中每個鍵又稱爲對象的屬性,例如,person的name屬性爲’Bob’,zipcode屬性爲null。

要獲取一個對象的屬性,我們用對象變量.屬性名的方式:

person.name; // 'Bob'
person.zipcode; // null

判斷有沒有屬性,用in來判斷
要判斷一個屬性是否是自身擁有的,而不是繼承得到的,可以用hasOwnProperty()方法。

刪除屬性,用delete關鍵字

delete person.zipcode;

這裏寫圖片描述

模板字符串

要把多個字符串連接起來,可以用+號連接.
ES6新增了一種模板字符串,表示方法和上面的多行字符串一樣,但是它會自動替換字符串中的變量,用反引號``表示:

var name = '小明';
var age = 20;
var message = `你好, ${name}, 你今年${age}歲了!`;
alert(message);

函數

javaScript還有一個免費贈送的關鍵字arguments,它只在函數內部起作用,並且永遠指向當前函數的調用者傳入的所有參數。arguments類似Array但它不是一個Array。

function foo(x) {
    console.log('x = ' + x); // 10
    for (var i=0; i<arguments.length; i++) {
        console.log('arg ' + i + ' = ' + arguments[i]); // 10, 20, 30
    }
}

由於JavaScript函數允許接收任意個參數,於是我們就不得不用arguments來獲取所有參數,還用rest來處理多餘參數

function foo(a, b, ...rest) {
    console.log('a = ' + a);
    console.log('b = ' + b);
    console.log(rest);
}

foo(1, 2, 3, 4, 5);
// 結果:
// a = 1
// b = 2
// Array [ 3, 4, 5 ]

foo(1);
// 結果:
// a = 1
// b = undefined
// Array []

使用數組,函數可以返回多個值。

function getSizewidthheightdepth){
    var area = width * height;
    var volume = width * height * depth;
    var sizes = [area  , volume];
    return sizes;
}

立即調用函數表達式稱作IIFE,通常用作一組代碼的封裝期。在此匿名函數種聲明的任何變量能夠非常有效的保護變量,防止其他腳本中可能出現同名變量。其中最後一對括號告訴解釋器馬上調用此函數。

var area = (function(){
    var width = 3;
    var height = 2;
    return width * height;
})();

方法

var xiaoming = {
    name: '小明',
    birth: 1990,
    age: function () {
        var y = new Date().getFullYear();
        return y - this.birth;
    }
};

xiaoming.age; // function xiaoming.age()
xiaoming.age(); // 今年調用是25,明年調用就變成26了

map

var fn = x => x * x; // 箭頭函數

function pow(x) {
    return x * x;
}
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var results = arr.map(pow); // [1, 4, 9, 16, 25, 36, 49, 64, 81]
console.log(results);

reduce

var arr = [1, 3, 5, 7, 9];
arr.reduce(function (x, y) {
    return x * 10 + y;
}); // 13579

返回函數而不是結果的寫法:

function lazy_sum(arr) {
    var sum = function () {
        return arr.reduce(function (x, y) {
            return x + y;
        });
    }
    return sum;
}
var f = lazy_sum([1, 2, 3, 4, 5]); // function sum()
f(); // 15

generator

generator和函數不同的是,generator由function*定義(注意多出的*號),並且,除了return語句,還可以用yield返回多次。

function* fib(max) {
    var
        t,
        a = 0,
        b = 1,
        n = 0;
    while (n < max) {
        yield a;
        [a, b] = [b, a + b];
        n ++;
    }
    return;
}

調用generator對象有兩個方法,一是不斷地調用generator對象的next()方法

var f = fib(5);
f.next(); // {value: 0, done: false}
f.next(); // {value: 1, done: false}
f.next(); // {value: 1, done: false}
f.next(); // {value: 2, done: false}
f.next(); // {value: 3, done: false}
f.next(); // {value: undefined, done: true}

第二個方法是直接用for … of循環迭代generator對象,這種方式不需要我們自己判斷done:

for (var x of fib(10)) {
    console.log(x); // 依次輸出0, 1, 1, 2, 3, ...
}

generator可以在執行過程中多次返回,還有另一個巨大的好處,就是把異步回調代碼變成“同步”代碼

window對象

window 對象的 location 屬性標記了當前頁面的 URL

document對象

在每個窗口種載入的當前web頁面使用document對象建模,可以訪問或修改用戶在頁面上看到的內容,並根據用戶與頁面的交互方式進行響應。html通過

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章