關於JavaScript你可能不知道的事 1 - 5


1. var關鍵字聲明的變量的作用域是整個函數.

var bar = 'global';
function foo () {
console.log(bar); // ==> undefined
var bar = 'local';
console.log(bar); // ==> local
}
foo();

按照我們的想法, 第一行應該打印global才對. 但是, 事實上, 因為var的作用域是整個函數, 而不是只作用於其后的內容, 所以,我們的函數定義其實和下面的這個定義是等價的

function foo () {
var bar;
console.log(bar);
bar = 'local';
console.log(bar);
}

這件事請告訴我們, 最好把var語句都放在函數的頂部, 這樣可以避免不必要的誤解, 以便增加程序的可讀性.

ps:

function foo () {
for (var s=0, i=0; i<10; i++) {
for (var j=0; j<10; j++) {
s = i*j;
}
}
console.log(s); // ==> 81
}
foo();

以上代碼中, s是在for循環內生成的,但並不妨礙它的作用域, 它的作用域還是整個函數.

2. 作用域鏈



3. || 運算符

|| 的求解順序是從左至右的. 並且, 如果左邊的值為真, 那么整個式子的值就一定是真了. 因此它不會再向右求解.

比如

var i = 1;
i || ++i;
console.log(i); // ==> 1
++i || i;
console.log(i); // ==> 2

在對 i || ++i 這個表達式求值時, 系統會從左到右求解, 因此會先看到i, i為1, 轉換成布爾值為真. 因此整個表達式的值為真, 也因此, 不會再執行++i.

|| 表達式還有一個特征, 它返回的值不一定是真或者假, 而是構成表達式的因子的值. 看代碼你就明白了.

console.log(42 || [1,2]); // ==> 42

實際上, || 運算符完全等價於以下函數

function _or_ (a, b) {
if (a) {
return a;
} else {
return b;
}
}

我知道你不相信,但是你可以實驗一下.

於是我們的一些代碼就可以寫的比較順暢了. 比如缺省參數, 要達到我們的目的可以這樣寫:

function sayTo(who) {
if (!who) {
who = 'Xiaochi';
}
...
}

但有更簡潔也更易讀的方式:

function sayTo(who) {
who = who || 'Xiaochi';
...
}

ps:

&& 運算符就相當於

function _and_ (a, b) {
if (a)
return b;
else
return a;
}

4. 數組的length可寫

給數組的length賦值, 如果值小於當前值, 將會切斷數組, 如果大於當前值, 將會擴充數組.
我不知道這個知識點有什么用...

var a = [1];
a.push(23);
console.log(a); // ==> [1, 23]
a.length = 5;
console.log(a); // ==> [1, 23, undefined, undefined, undefined]

5. 將參數轉化為數組

有的時候希望將函數轉化為數組對象, 這樣就可以利用數組對象的各種方便的方法了.方式如下:


var argsArray = [].slice.apply(arguments);




注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: