JavaScript >> Javascript 文檔 >  >> JavaScript

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 文檔。

鬆散的打字

自動類型轉換在大多數情況下都能很好地工作。這是一個很棒的功能,可以節省大量的時間和精力!只有幾個基元類型:

  1. 字符串
  2. 數字(整數和實數)
  3. 布爾值
  4. 未定義

其他一切都是對象,即可變鍵控集合。閱讀 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
}

約定

這些約定中的大多數(分號除外)都是風格化的,並且是高度偏好的,並且不會影響執行。

分號

可選分號,兩種情況除外:

  1. 在for循環構造中:for (var i=0; i++; i<n)
  2. 當新行以括號開頭時,例如,立即調用函數表達式 (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,我在那裡兼職教授。


Tutorial JavaScript 教程
  1. 如何檢查 Javascript 函數是否是構造函數

  2. 使用回車鍵阻止表單提交

  3. React中字符串的正則表達式

  4. 如何縮小 JavaScript - 推薦的工具和方法

  5. 在 Javascript 中仍然可以看到噱頭

  6. 通過構建聊天前端來學習 ReactJs

  7. Javascript:使用元組作為字典鍵

  1. 困惑?? &||在 JS 中

  2. 使用代碼學習負載平衡。

  3. 5 場技術講座改變了我接觸軟件工程的方式

  4. 在哪里托管 Node.js 應用程序

  5. 使用 KendoReact StockChart 渲染股市數據

  6. 像 PRO 一樣在 Node 中使用多線程

  7. 如何有效地比較 JavaScript 中的數組

  1. 讓我們在 React Native 中從頭開始構建一個滑塊

  2. 使用 gulp-sharp-responsive 創建響應式圖像

  3. 將 React Native App 與 Jest 集成

  4. 聯繫版塊, 已標記縮略圖, 簡介淡入 |模塊星期一 52