不一樣的JavaScript
js語法看起來是類c的,如果有c語言基礎,可以看懂一些js程式碼,尤其是類似這樣的程式碼:
for (i = 0; i < 10; i++) { // code }
只看這段程式碼,跟c的寫法甚至完全一樣。很容易讓你有種錯覺,簡單看下js語法,就能寫出優秀的js程式碼。
但是,不要被騙了,當你看到後面的程式碼時,就不會再這樣想了。下面就列舉一些js語法上感覺有趣或比較特別的例子
變數宣告可以放在使用之後
function foo() { a = 3;// 此處使用 console.log(a); var a;// 此處宣告 }
物件可以動態的增加屬性,不需要提前宣告
var o = {}; o.p1 = "good"; o.p2 = 35; console.log(o);// Object {p1: "good", p2: 35}
物件的屬性也可地動態的刪除
var o = {p1: "good", p2: 35}; delete o.p1; console.log(o);// Object {p2: 35}
函式也是物件,也有方法。如可以呼叫length,獲取引數個數
function myAdd(a, b) { return a + b; } console.log(myAdd.length);// 輸出2
也是支援自定義的方法新增的
函式定義時,可以不指定引數,但在使用時可以傳任意引數
function noParamFunc() { console.log(arguments) } noParamFunc(1, 2)// 輸出1, 2
可以動態決定函式的定義
if (condition) { function sayHi() { console.log("Hi"); } } else { function sayHi() { console.log("Hey"); } } sayHi();// 根據condition的值輸出Hi或Hey
函式可以這樣定義
var myAdd2 = x => x + 2; myAdd2(5);
這種寫法在定義簡短的函式以及閉包時會非常簡潔
如寫出如下簡潔實用的函式:
const longestConsec = (a, k) => (k < 1 || a.length < 1 || k > a.length) ? '' : a.map((_, i, a) => a.slice(i, i + k).join('')) .reduce((a, b) => a.length >= b.length ? a : b)
函式定義時將其賦值給其它變數,則函式名在外部不再可用
var foo = function bar() { console.log('good'); } bar();// 出錯,這兒只能通過foo()來呼叫 foo();// ok
但是,如下的寫法又是正確的:
function bar() { console.log('good'); } var foo = bar; bar();// ok foo();// ok
在for迴圈裡定義的變數,作用域是超出for的
for (var i = 0; i < 10; i++) { console.log(i); } console.log(i); // 仍然可以訪問,且是訪問的上面的這個i
一元加號,可以將字串轉為數字
+"10"// 就是數值10
陣列建立的歧義
// 看起來相同的寫法,但行為預期卻不一樣 var a1 = new Array(3, 4, 5); var a2 = new Array(3); console.log(a1);// [3, 4, 5] console.log(a2);// [] 長度為3的空陣列
作用域不注意,可能行為也是不可預期
// 全域性作用域 for(var i = 0; i < 10; i++) { subLoop(); } function subLoop() { for(i = 0; i < 10; i++) { console.log(i); } }
這段程式碼本來是想執行100次的迴圈,但實際只會執行10次
奇怪的相等判斷
0 ==""// true 0=="0"// true "" == "0"// false
奇怪但有效的表示式
[1,2,3][1,2];// 輸出3
++[[]][+[]]+[+[]];
這個也是有效的表示式,表示式的值是10。 具體原因可以參考ofollow,noindex">這篇文章
JS語法本身是需要分號的
var a = 5 var b = 6 // code
雖然寫的程式碼可以不加分號,在解釋執行時,直譯器會幫我們補上分號:
var a = 5; var b = 6; // code
但有時候依賴於直譯器加分號的話,行為可能不是預期的
參考資料
JavaScript-Garden/zh" target="_blank" rel="nofollow,noindex">JavaScript祕密花園