JS 基礎知識:JavaScript 的基本概述
表現力
BASIC、Python、C 等編程語言具有無聊的機器性質,這需要開發人員編寫與解決方案本身沒有直接關係的額外代碼。想想 BASIC 中的行號或 Java 中的接口、類和模式。
另一方面,JavaScript 繼承了純數學、LISP、C# 的最佳特性,從而帶來了極大的表現力(而且很有趣!)。
這篇文章中有關表達能力的更多信息:當提到編程語言時,“表達能力”是什麼意思?
Java 中典型的 Hello World 示例(請記住,Java 之於 JavaScript 就像 ham 之於倉鼠):
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
JavaScript 中的相同示例:
console.log('Hello World')
或在 HTML 頁面中:
<script>
document.write('Hello World')
</script>
JavaScript 允許程序員專注於解決方案/問題,而不是跳過障礙和 API 文檔。
鬆散的打字
自動類型轉換在大多數情況下都能很好地工作。這是一個很棒的功能,可以節省大量的時間和精力!只有幾個基元類型:
- 字符串
- 數字(整數和實數)
- 布爾值
- 未定義
- 空
其他一切都是對象,即可變鍵控集合。閱讀 Stackoverflow 上的 immutable 是什麼意思?
此外,在 JavaScript 中,還有 String、Number 和 Boolean 對象,其中包含用於原語的幫助器:
'a' === new String('a') //false
但是
'a' === new String('a').toString() //true
或
[旁注]
閱讀博客文章很好,但觀看視頻課程更好,因為它們更具吸引力。
許多開發人員抱怨 Node.js 上缺乏負擔得起的高質量視頻材料。觀看 YouTube 視頻會讓人分心,花 500 美元購買 Node 視頻課程很瘋狂!
去看看 Node University,它有關於 Node 的免費視頻課程:node.university。
[旁注結束]
'a' == new String('a') //true
順便說一句,==
===
時執行自動類型轉換 不是。
對象文字符號
對象表示法具有超級可讀性和緊湊性:
var obj = {
color: "green",
type: "suv",
owner: {
...
}
}
還記得函數是對象嗎?
var obj = function () {
// do something
};
obj.a =1;
console.log (obj.a); // prints 1
另一個看起來非常相似(但行為完全不同)的模式是當我們使用函數來構造/初始化對象時:
var Obj = function (ops) {
this.name = ops.name;
}
var obj = new Obj ({name: 'puppy'});
console.log(obj);
功能
函數是一等公民 ,我們將它們視為變量,因為它們是對象!是的,函數甚至可以有屬性/屬性。
創建函數
var f = function f () {
console.log('Hi');
return true;
}
或
function f () {
console.log('Hi');
return true;
}
具有屬性的函數(記住函數只是可以調用的對象,即初始化):
var f = function () {console.log('Boo');}
f.boo = 1;
f(); //outputs Boo
console.log(f.boo); //outputs 1
注意 :return 關鍵字是可選的。如果省略,函數將返回 undefined
調用時。
將函數作為參數傳遞
var convertNum = function (num) {
return num + 10;
}
var processNum = function (num, fn) {
return fn(num);
}
processNum(10, convertNum);
調用與表達式
函數定義:
function f () {};
調用:
f();
表達式(因為它解析為某個值,可能是數字、字符串、對像或布爾值):
function f() {return false;}
f();
聲明:
function f(a) {console.log(a);}
數組
數組也是具有從 Array.prototype 全局對象繼承的一些特殊方法的對象。然而,JavaScript 數組不是 真正的數組。相反,它們是具有唯一整數(通常從 0 開始)鍵的對象。
var arr = [];
var arr2 = [1, "Hi", {a:2}, function () {console.log('boo');}];
var arr3 = new Array();
var arr4 = new Array(1,"Hi", {a:2}, function () {console.log('boo');});
原型性質
沒有課程 在 JavaScript 中,因為對象直接從其他對象繼承,這稱為原型繼承: JS 中有幾種類型的繼承模式:
- 古典音樂
- 偽經典
- 功能性
函數繼承模式示例:
var user = function (ops) {
return { firstName: ops.name || 'John'
, lastName: ops.name || 'Doe'
, email: ops.email || '[email protected]'
, name: function() { return this.firstName + this.lastName}
}
}
var agency = function(ops) {
ops = ops || {}
var agency = user(ops)
agency.customers = ops.customers || 0
agency.isAgency = true
return agency
}
約定
這些約定中的大多數(分號除外)都是風格化的,並且是高度偏好的,並且不會影響執行。
分號
可選分號,兩種情況除外:
- 在for循環構造中:
for (var i=0; i++; i<n)
- 當新行以括號開頭時,例如,立即調用函數表達式 (IIFE):
;(function(){...}())
駝峰式
cameCase,除了類名是 CapitalCamelCase,例如,
var MainView = Backbone.View.extend({...})
var mainView = new MainView()
命名
_
,$
對於文字來說是完全合法的字符(jQuery 和 Underscore 庫經常使用它們)。
私有方法和屬性以 _ 開頭(自己什麼都不做!)。
逗號
逗號優先方法
var obj = { firstName: "John"
, lastName: "Smith"
, email: "[email protected]"
}
縮進
通常它是製表符、4 或 2 空格縮進,他們的支持者陣營幾乎在選項之間進行了宗教劃分。
空格
通常,=
前後都有一個空格 , +
, {
和 }
符號。調用時沒有空格,例如 arr.push(1);
, 但是我們定義匿名函數的時候有個空格:function () {}
.
沒有模塊
至少在 ES6 之前,一切都在全局範圍內,也就是 window
並通過 <script>
包含 標籤。但是,有一些外部庫可以解決問題:
- CommonJS
- AMD 和 Require.js
Node.js 使用類似 CommonJS 的語法和 has 對模塊的內置支持。
要在全局範圍內隱藏您的代碼,請讓私有屬性/方法使用閉包和立即調用的函數表達式(或 IIFE)。
立即調用函數表達式 (IIFE)
(function () {
window.yourModule = {
...
};
}());
這個片段展示了一個具有私有屬性和方法的對象的例子:
(function () {
window.boo = function() {
var _a = 1;
var inc = function () {
_a++;
console.log(_a);
return _a;
};
return {
increment: inc
};
}
}());
var b = window.boo();
b.increment();
現在試試這個:
b.increment();
b.increment();
b.increment();
關鍵字“這個”
變異/改變很多(尤其是在 jQuery 中)!
經驗法則是在嘗試使用 this
之前重新分配給本地範圍的變量 閉包內部:
var app = this
$('a').click(function(e){
console.log(this) //most likely the event or the target anchor element
console.log(app) //that's what we want!
app.processData(e)
})
如有疑問:console.log!
陷阱
JS 是程序員認為他們不應該學習的唯一語言。 ===
之類的東西 與 ==
、全局範圍洩漏、DOM 等可能會導致未來出現問題。這就是為什麼理解語言或使用諸如 CoffeeScript 之類的東西很重要的原因,這可以解決大部分問題。
進一步學習
如果您喜歡這篇文章並希望更多地探索 JavaScript,請查看這篇令人驚嘆的免費 資源:Eloquent JavaScript:A Modern Introduction to Programming。
當然,對於更高級的 JavaScript 愛好者和專業人士,還有我的書 Rapid Prototyping with JS 和強化編程學校 HackReactor,我在那裡兼職教授。