夯實基礎js

聲明(Declarations)

undefined值在布爾類型環境中會被看成false。javascript

數值類型環境中undefined值會被轉換爲NaN。java

對一個空變量求值時,空值 null 在數值類型環境中會被看成0來對待,而布爾類型環境中會被看成false數組

JavaScript 變量感受上是被「提高」或移到了全部函數和語句以前。提高後的變量將返回 undefined 值,因此即便在使用或引用某個變量以後存在聲明和初始化操做,這個被提高的引用仍將獲得 undefined 值。瀏覽器

因爲存在變量聲明提高,一個函數中全部的var語句應儘量地放在接近函數頂部的地方。這大大地提高了程序代碼的清晰度。數據結構

(在 ECMAScript 2015 中,let(const)將不會提高變量到代碼塊的頂部。所以,在變量聲明以前引用這個變量,將拋出錯誤ReferenceError。這個變量將從代碼塊一開始就處在一個「暫時性死區」,直到這個變量被聲明爲止。)框架

對於函數,只有函數聲明會被提高到頂部,不包括函數表達式。函數

/* 函數聲明 */
foo(); // "bar"   
function foo() {
  console.log("bar");
}   

/* 函數表達式   表達式定義的函數,成爲匿名函數。匿名函數沒有函數提高。*/   
baz(); // TypeError: baz is not a function
//此時的"baz"至關於一個聲明的變量,類型爲undefined。
因爲baz只是至關於一個變量,所以瀏覽器認爲"baz()"不是一個函數。
var baz = function() {
  console.log("bar2");
};

全局對象是 window,你能夠經過指定 window 或 frame 的名字,從一個 window 或 frame 訪問另外一個 window 或 frame 中聲明的變量。例如,設想一個叫 phoneNumber 的變量在文檔裏被聲明,你能夠在子框架裏用 parent.phoneNumber 來引用它。this

常量(Constants)

在同一做用域中,不能用與變量或函數一樣的名字來命名常量。然而,對象屬性是不受保護的,因此下面的語句執行沒有問題。spa

const MY_OBJECT = {"key": "value"};
MY_OBJECT.key = "otherValue";

數據結構和類型

六種是 原型 的數據類型 以及 Object 對象設計

  • Boolean. 布爾值,true 和 false.

    1. 一個代表 null 值的特殊關鍵字。 JavaScript 是大小寫敏感的,所以 null 與 Null、NULL或其餘變量徹底不一樣。

    1. 變量未定義時的屬性。

  • Number. 表示數字,例如: 42 或者 3.14159。

  • String. 表示字符串,例如:"Howdy"

  • Symbol ( 在 ECMAScript 6 中新添加的類型).。一種數據類型,它的實例是惟一且不可改變的。

Objects 和 functions 是本語言的其餘兩個基本要素。你能夠將對象視爲存放值的命名容器,而將函數視爲你的應用程序可以執行的過程(procedures)。

在涉及加法運算符(+)的數字和字符串表達式中,JavaScript 會把數字值轉換爲字符串。

x = "The answer is " + 42 // "The answer is 42"
y = 42 + " is the answer" // "42 is the answer"

在涉及其它運算符(譯註:以下面的減號'-')時,JavaScript語言不會把數字變爲字符串。例如(譯註:第一例是數學運算,第二例是字符串運算):

"37" - 7 // 30
"37" + 7 // "377"

字符串轉換爲數字(converting strings to numbers)

parseInt()和parseFloat()

將字符串轉換爲數字的另外一種方法是使用單目加法運算符。

"1.1" + "1.1" = "1.11.1"
(+"1.1") + (+"1.1") = 2.2   // 注:加入括號爲清楚起見,不是必需的。

對象屬性名字能夠是任意字符串,包括空串。若是對象屬性名字不是合法的javascript標識符,它必須用""包裹。屬性的名字不合法,那麼便不能用.訪問屬性值,而是經過類數組標記("[]")訪問和賦值。

var unusualPropertyNames = {
  "": "An empty string",
  "!": "Bang!"
}
console.log(unusualPropertyNames."");   // 語法錯誤: Unexpected string
console.log(unusualPropertyNames[""]);  // An empty string
console.log(unusualPropertyNames.!);    // 語法錯誤: Unexpected token !
console.log(unusualPropertyNames["!"]); // Bang!

注意:

var foo = {a: "alpha", 2: "two"};
console.log(foo.a);    // alpha
console.log(foo[2]);   // two
//console.log(foo.2);  // Error: missing ) after argument list
//console.log(foo[a]); // Error: a is not defined
console.log(foo["a"]); // alpha
console.log(foo["2"]); // two

在ES2015,對象字面值擴展支持在建立時設置原型,簡寫foo:foo分配,定義方法,加工父函數(super calls),計算屬性名(動態)。總之,這些也帶來了對象字面值和類聲明緊密聯繫起來,讓基於對象的設計得益於一些一樣的便利。

var obj = {
    // __proto__
    __proto__: theProtoObj,
    // Shorthand for ‘handler: handler’
    handler,
    // Methods
    toString() {
     // Super calls
     return "d " + super.toString();
    },
    // Computed (dynamic) property names
    [ 'prop_' + (() => 42)() ]: 42
};

能在JavaScript的字符串中使用的···特殊字符···

clipboard.png

轉義字符

// 引號轉義
var quote = "He read \"The Cremation of Sam McGee\" by R.W. Service.";
// 轉義反斜線
var home = "c:\\temp";
// 轉義換行 一條語句拆成多行書寫
var str = "this string \
is broken \
across multiple\
lines."
console.log(str);   // this string is broken across multiplelines.
// Javascript沒有「heredoc」語法,但能夠用行末的換行符轉義和轉義的換行來近似實現 
var poem = 
"Roses are red,\n\
Violets are blue.\n\
I'm schizophrenic,\n\
And so am I."
相關文章
相關標籤/搜索