js容易被忽略的內容(一)

  • JavaScript的函數在查找變量時從自身函數定義開始,從“內”向“外”查找。所以作用域頂端是從“內”部開始的。
  • 1 / 3 === (1 - 2 / 3); // false

    • 計算機無法精確表示無限循環小數,所以有誤差
  • isNaN(NaN); // true

    • 唯一能判斷NaN的方法是通過isNaN()函數
  • 多數情況,應該用null。undefined僅僅在判斷函數參數是否傳遞的情況下有用。

  • ‘use strict’
    • 變量未使用var錯誤
    • 等號必須要===
    • 在strict模式下函數的this指向undefined
  • 對象:如果屬性名包含特殊字符,就必須用單引號(雙引號也行,不過json也是雙引號,不太好)括起來。訪問這個屬性也無法使用.操作符,必須用[”]來訪問
var obj = {
    name: 'liu',
    'eat-food': 'food'
}
console.log(obj['eat-food']) // food

// 判斷屬性是否屬於對象,繼承了來的也包含在內
console.log('name' in obj)  // true
console.log('toString' in obj)  // true

// 判斷屬性是否屬於對象,不包含繼承來的
console.log(obj.hasOwnProperty('name'))  true
console.log(obj.hasOwnProperty('toString'))  // false
  • 條件: if () {} else {}

    • 不支持:if(3<d<7){} 支持:if(d>3 && d<7){}
    • 隱士轉換:null、undefined、0、NaN和空字符串''轉化爲false,其他爲true
  • for…in 遍歷對象屬性

var o = {
    name: 'liu',
    age: 20,
    city: 'Beijing'
};
for (var key in o) {
    alert(key); // 'name', 'age', 'city'
}

// 過濾繼承屬性
for (var key in o) {
    if (o.hasOwnProperty(key)) {
        alert(key); // 'name', 'age', 'city'
    }
}

for … in 存在的問題:遍歷屬性名稱,數組的每個元素的索引被視爲一個屬性,當手動給數組添加額外的屬性後


var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x in a) {
    alert(x); // '0', '1', '2', 'name'
}
  • for …each : ES5.1標準引入,注意瀏覽器是否支持
var a = ['A', 'B', 'C'];
a.forEach(function (element, index, array) {
    // element: 指向當前元素的值
    // index: 指向當前索引
    // array: 指向Array對象本身
    alert(element);
});
  • 即使函數沒有return語句,函數執行完後也會返回結果,只是結果爲undefined。
  • arguments,只在函數內部起作用,並且永遠指向當前函數的調用者傳入的所有參數。即使沒定義形參,也可用arguments[i]訪問。
function abs() {
    console.log(arguments[0]);
}
abs(10);   // 10

// 利用arguments實現傳入不同參數的執行情況
function foo(a, b, c) {
    if (arguments.length === 2) {
        // 實際拿到的參數是a和b,c爲undefined
        c = b; // 把b賦給c
        b = null; // b變爲默認值
    }
    // ...
}
  • 申明提升

語句var x = ‘Hello, ’ + y;並不報錯,原因是變量y在稍後申明瞭。但是alert顯示Hello, undefined,說明變量y的值爲undefined。這正是因爲JavaScript引擎自動提升了變量y的聲明,但不會提升變量y的賦值。

function foo() {
    var x = 'Hello, ' + y;
    alert(x);
    var y = 'Bob';
}
foo()

最常見的做法是用一個var申明函數內部用到的所有變量

function foo() {
    var
        x = 1, 
        y = x + 1,
        z, i;
    for (i=0; i<100; i++) {
        ...
    }
}
  • apply: 函數本身的apply方法,接收兩個參數,第一個參數就是需要綁定的this變量,第二個參數是Array,表示函數本身的參數。
obj.apply(obj1,[])
obj.call(obj1,[]);

// apply()把參數打包成Array 
// call()把參數按順序傳入。
Math.max.apply(null, [3, 5, 4]); // 5
Math.max.call(null, 3, 5, 4); // 5

// 對普通函數調用,我們通常把this綁定爲null
// 利用apply(),可以動態改變函數的行爲。JavaScript的所有對象都是動態的,即使內置的函數,我們也可以重新指向新的函數.

// 統計一下代碼一共調用了多少次parseInt()
var count = 0;
var oldParseInt = parseInt; // 保存原函數
window.parseInt = function () {
    count += 1;
    return oldParseInt.apply(null, arguments); // 調用原函數
};
parseInt('10');
// count; // 1
  • 浮點數誤差
num = 0.1 + 0.2;   // 0.300000000000000004

處理方式:

num = (1 + 2) / 10  // 0.3
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章