Basic JavaScript


Comment your JavaScript Code

JavaScript中的注釋方式有以下兩種:

  • 使用 // 來告訴JavaScript來忽略當(dāng)前行的代碼
    // This is an in-line comment.

  • 你也可以使用多行注釋來注釋你的代碼,以/開始凯沪,用/來結(jié)束高氮,就像下面這樣:

/* This is a 
   multi-line comment */

良好的注釋能夠清晰地傳達(dá)你寫的代碼的意圖—對于那些讀你的代碼的人來說以及未來你看到它的時候航瞭,還能理解這段代碼的意圖孟害。


Declare JavaScript Variables

在計算機(jī)科學(xué)中, data(數(shù)據(jù))就是一切,因為它對于計算機(jī)的意義重大。

  • JavaScript提供七種不同的data types(數(shù)據(jù)類型):

  • undefined(未定義)

  • null(空)

  • boolean(布爾型)

  • string(字符串)

  • symbol(符號)

  • number(數(shù)字)

  • object(對象)

  • Variables(變量)允許計算機(jī)以一種動態(tài)的形式來存儲和操作數(shù)據(jù)虑乖,通過操作指向數(shù)據(jù)的指針而不是數(shù)據(jù)本身來避免了內(nèi)存泄露,以上的七種數(shù)據(jù)類型都可以存儲到一個變量(variable)中晾虑。

  • Variables 非常類似于你在數(shù)學(xué)中使用的x,y變量, 這意味著它們都是以一個簡單命名的名字來代替我們賦值給它的數(shù)據(jù)疹味。計算機(jī)中的variables(變量)與數(shù)學(xué)中的變量不同的是,計算機(jī)可以在不同的時間存儲不同類型的變量帜篇。

  • 通過在變量的前面使用關(guān)鍵字var糙捺,我們告訴 JavaScript 來創(chuàng)建或者 declare(聲明)一個變量,就像這樣:
    var ourName;
    上面代碼的意思是創(chuàng)建一個名為ourName的variable(變量),在JavaScript中我們使用分號來結(jié)束一段聲明笙隙。

  • Variable (變量)的名字可以由數(shù)字洪灯、字母、$ 或者 _組成竟痰,但是不能包含空格或者以數(shù)字為首签钩。


Storing Values with the Equal Operator

  • 在JavaScript中,你可以通過assignment(分配)操作符把一個值存儲到變量中坏快。
    myVariable = 5;

  • 賦值過程是從右到左進(jìn)行的铅檩。所有 = 操作符右邊的值都會被賦到左邊的變量。


Initializing Variables with the Equal Operator

  • 通常地我們會在initialize開始聲明變量的時候就會給變量賦一個初始值假消。
    var myVar = 0;

Understanding Uninitialized Variables

  • 當(dāng) JavaScript 中的變量被聲明的時候柠并,程序內(nèi)部會給它一個初始值 undefined。

  • 當(dāng)你對一個值為 undefined 的變量進(jìn)行運算操作的時候富拗,算出來的結(jié)果將會是 NaN臼予,NaN 的意思是 "Not a Number"。

  • 當(dāng)你用一個沒有 定義 的變量來做字符串連接操作的時候啃沪,它會如實的輸出"undefined"粘拾。


Understanding Case Sensitivity in Variables

  • 在 JavaScript 中所有的變量都是大小寫敏感的。這意味著你要區(qū)別對待大寫字母和小寫字母创千。

  • MYVAR與MyVar和myvar 是截然不同的變量缰雇。這就有可能導(dǎo)致多個截然不同的變量卻有著有相似的名字。正是由于以上原因所以強(qiáng)烈地建議你, 不要 使用這一特性追驴。(以免給自己帶來麻煩)

  • 使用 駝峰命名法(camelCase) 來書寫一個 Javascript 變量械哟,在 駝峰命名法 中,變量名的第一個單詞的首寫字母小寫殿雪,后面的單詞的第一個字母大寫暇咆。

舉個栗子:

var someVariable;
var anotherVariableName;
var thisVariableNameIsTooLong;

Add Two Numbers with JavaScript

  • JavaScript 中使用 + 號來讓兩個數(shù)字執(zhí)行加法運算。
  • 舉例
    myVar = 5 + 10; // 等于 15

Subtract One Number from Another with JavaScript

  • JavaScript 中使用 - 來做減法運算。
  • 舉例
    myVar = 12 - 6; // 等于 6

Multiply Two Numbers with JavaScript

  • JavaScript 使用這個 * 符號來讓兩個數(shù)字相乘爸业。
  • 舉例
    myVar = 13 * 13; // assigned 169

Divide One Number by Another with JavaScript

  • JavaScript 中使用 / 符號做除法運算其骄。
  • 舉例
    myVar = 16 / 2; // assigned 8

Increment a Number with JavaScript

  • 使用 ++ ,我們可以很容易地對變量進(jìn)行自增或者+1運算扯旷。
    i++;
    等效于
    i = i + 1;//省去了書寫=符號的必要拯爽。

Decrement a Number with JavaScript

  • 使用自減符號 -- ,你可以很方便地對一個變量執(zhí)行 自減 或者減一操作钧忽。
    i--;
    等效于
    i = i - 1;//省去了書寫=符號的必要毯炮。

Create Decimal Numbers with JavaScript

  • 我們也可以把小數(shù)存儲到變量中。小數(shù)也被稱作浮點數(shù) 惰瓜。

提示:不是所有的實數(shù)都可以用 浮點數(shù) 來表示否副。因為可能存在四舍五入的錯誤汉矿。


Multiply Two Decimals with JavaScript

  • 在 JavaScript 中崎坊,你也可以用小數(shù)進(jìn)行計算,就像整數(shù)一樣洲拇。

Finding a Remainder in JavaScript

  • 我們用%運算符來取余奈揍。
  • %運算符有時被錯誤的稱為取模運算符
    兩者區(qū)別:
  • 取余運算遵循盡可能讓余數(shù)小的原則
  • 取模運算盡可能讓商小的原則
    例如:
    7=(-3)×(-2)+1
    7=(-3)×(-3)+(-2)
    因此,
    7rem(-3)=1
    7mod(-3)=(-2)

Assignment with Plus Equals

  • 有一類操作符是一步到位既做運算也賦值的赋续。
  • 這類操作符的其中一種就是 += 運算符男翰。
    myVar += 5;

Assignment with Minus Equals

  • 與 += 操作符類似,-= 操作符用來對一個變量進(jìn)行減法賦值操作纽乱。
    myVar = myVar - 5;

Assignment with Times Equals

  • *= 操作符是讓變量與一個數(shù)相乘并賦值蛾绎。
    myVar = myVar * 5;

Assignment with Divided by Equals

  • /= 操作符是讓變量與另一個數(shù)相除并賦值。
    myVar = myVar / 5;

Convert Celsius to Fahrenheit

  • 從Celsius攝氏度轉(zhuǎn)換為Fahrenheit華氏度的算法是:攝氏度的溫度乘于9除于5鸦列,再加上32租冠。
function convert(celsius) {
  // Only change code below this line
  fahrenheit = celsius * 9 / 5 + 32;

  // Only change code above this line
    return fahrenheit;
}

// Change the inputs below to test your code
convert(30);

Declare String Variables

  • 先前我們使用過的代碼:
    var myName = "your name";
  • "your name" 被稱作字符串。 字符串是用單或雙引號包裹起來的一連串的零個或多個字符薯嗤。

Escaping Literal Quotes in Strings

當(dāng)你定義一個字符串必須要用單引號或雙引號來包裹它顽爹。那么當(dāng)你需要在字符串中使用一個: " 或者 ' 時該怎么辦呢?

  • 在 JavaScript 中,你可以通過在引號前面使用 反斜杠 () 來轉(zhuǎn)義引號骆姐。
    var sampleStr = "Alan said, \"Peter is learning JavaScript\".";

這標(biāo)志著提醒 JavaScript 單引號或雙引號并不是字符串的結(jié)尾镜粤,而是出現(xiàn)在字符串內(nèi)的字符。所以玻褪,如果你要打印字符串到控制臺肉渴,你將得到:

Alan said, "Peter is learning JavaScript".


Quoting Strings with Single Quotes

在 JavaScript 中的 字符串 要用單引號或雙引號來包裹它,只要你在開始和結(jié)束都使用相同類型的引號带射,單引號和雙引號的功能在JavaScript中是相同的同规。

"This string has \"double quotes\" in it"

當(dāng)我們需要在字符串中使用與開頭結(jié)尾相同的引號時,我們需要對引號進(jìn)行 轉(zhuǎn)義 庸诱。如果你有很多雙引號的字符串捻浦,使用轉(zhuǎn)義字符可能導(dǎo)致難以閱讀晤揣。這時候可以使用單引號。

'This string has "double quotes" in it. And "probably" lots of them.'


Escape Sequences in Strings

引號不是字符串中唯一的可以被轉(zhuǎn)義字符朱灿。下面是常見的轉(zhuǎn)義序列列表:

轉(zhuǎn)義序列列表
轉(zhuǎn)義序列列表

Concatenating Strings with Plus Operator

  • 在 JavaScript 中昧识,當(dāng) + 操作符與 字符串 一起使用的時候,它被稱作 連接 操作符盗扒。你可以通過和其他字符串連接 來創(chuàng)建一個新的字符串跪楞。

舉個例子:
'My name is Alan,' + ' I concatenate.'

注意:當(dāng)心空格。連接操作不會添加兩個字符串之外的空格侣灶,所以想加上空格的話甸祭,你需要自己在字符串里面添加。


Concatenating Strings with the Plus Equals Operator

  • 我們還可以使用 += 運算符來連接字符串到現(xiàn)有字符串的結(jié)尾褥影。對于那些非常長的字符串來說池户,這一操作是非常有用的。

Constructing Strings with Variables

有時候需要創(chuàng)建一個填字風(fēng)格的字符串凡怎。

  • 通過使用連接運算符 + 校焦,你可以插入一個或多個變量來組成一個字符串。
var ourName = "Free Code Camp";
var ourStr = "Hello, our name is " + ourName + ", how are you?";
var myName = "9aoyang";
var myStr = "My name is " + myName + " and I am well!";

Appending Variables to Strings

  • 不僅可以追加字符串统倒,還可以使用加等號(+=)運算符直接來追加變量到字符串上寨典。
var anAdjective = "awesome!";
var ourStr = "Free Code Camp is ";
ourStr += anAdjective;

Find the Length of a String

  • 可以通過在字符串變量或字符串后面寫上 .length 來獲得字符串變量 字符串 值的長度。
    "Alan Peter".length; // 10

Use Bracket Notation to Find the First Character in a String

JavaScript中只有字符串類型房匆,沒有字符類型耸成。那么如何獲取到字符串中的某個字符呢?

  • 我們通過[索引] 來獲得對應(yīng)的字符浴鸿。
    大多數(shù)現(xiàn)代編程語言井氢,如JavaScript,不同于人類從1開始計數(shù)赚楚。它們是從0開始計數(shù)毙沾,這被稱為 基于零 (Zero-based indexing) 的索引。
  • 例如, 在單詞 "Charles" 中索引0上的字符為 "C"宠页,所以在 var firstName = "Charles" 中左胞,你可以使用 firstName[0] 來獲得第一個位置上的字符。

Understand String Immutability

理解字符串的不可變性举户!當(dāng)你搞懂不可變性后immutable.js對于你就是小菜一碟了烤宙。

  • 在 JavaScript 中,字符串的值是不可變的俭嘁,這意味著一旦字符串被創(chuàng)建就不能被改變躺枕。

例如,下面的代碼:

var myStr = "Bob";
myStr[0] = "J";

是不會把變量 myStr 的值改變成 "Job" 的,因為變量 myStr 是不可變的拐云。注意罢猪,這并不意味著 myStr 永遠(yuǎn)不能被改變,只是字符串字面量 string literal 的各個字符不能被改變叉瘩。改變 myStr 中的唯一方法是重新給它賦一個值膳帕,就像這樣:

var myStr = "Bob";
myStr = "Job";

Use Bracket Notation to Find the Nth Character in a String

  • 也可以使用 [索引]來獲得一個字符串中的其他位置的字符。

  • 請記住薇缅,程序是從 0 開始計數(shù)危彩,所以獲取第一個字符實際上是[0]。


Use Bracket Notation to Find the Last Character in a String

  • 為了得到一個字符串的最后一個字符泳桦,你可以用[字符串的長度減去一]汤徽。
  • 例如,在 var firstName = "Charles"中灸撰,你可以這樣操作firstName[firstName.length - 1]來得到字符串的最后的一個字符谒府。

Use Bracket Notation to Find the NthtoLast Character in a String

  • 我們既可以獲取字符串的最后一個字符,也可以用獲取字符串的倒數(shù)第N個字符梧奢。
  • 例如狱掂,你可以這樣 firstName[firstName.length - 3]操作來獲得var firstName = "Charles" 字符串中的倒數(shù)第三個字符演痒。

Store Multiple Values in one Variable using JavaScript Arrays

  • 使用數(shù)組亲轨,我們可以在一個地方存儲多個數(shù)據(jù)。
  • 以左方括號[開始定義一個數(shù)組鸟顺,以右方括號]結(jié)束定義惦蚊,并把每個條目之間用逗號隔開,就像這樣:
    var sandwich = ["peanut butter", "jelly", "bread"]讯嫂。

Nest one Array within Another Array

  • 你也可以在數(shù)組中包含其他數(shù)組蹦锋,就像這樣:[["Bulls", 23], ["White Sox", 45]]。這被稱為一個 多維數(shù)組欧芽。

Access Array Data with Indexes

  • 我們可以像操作字符串一樣通過數(shù)組索引[index]來訪問數(shù)組中的數(shù)據(jù)莉掂。
  • 數(shù)組索引的使用與字符串索引一樣,不同的是千扔,通過字符串的索引得到的是一個字符憎妙,通過數(shù)組索引得到的是一個條目。與字符串類似曲楚,數(shù)組也是 基于零 的索引厘唾,因此數(shù)組的第一個元素的索引是 0。
    例如
var array = [1,2,3];
array[0]; // 等于 1
var data = array[1];  // 等于 2

Modify Array Data With Indexes

  • 與字符串的數(shù)據(jù)不可變不同龙誊,數(shù)組的數(shù)據(jù)是可變的抚垃,并且可以自由地改變。
    例如
var ourArray = [3,2,1];
ourArray[0] = 1; // ourArray等于 [1,2,1]

Access MultiDimensional Arrays With Indexes

  • 可以把 多維 數(shù)組看作成是一個 數(shù)組中的數(shù)組。當(dāng)使用[]去訪問數(shù)組的時候鹤树,第一個[index]訪問的是第N個子數(shù)組铣焊,第二個[index]訪問的是第N個子數(shù)組的第N個元素。

例如

var arr = [
    [1,2,3],
    [4,5,6],
    [7,8,9],
    [[10,11,12], 13, 14]
];
arr[0]; // 等于 [1,2,3]
arr[1][2]; // 等于 6
arr[3][0][1]; // 等于 11

Manipulate Arrays With push

  • 一個簡單的方法將數(shù)據(jù)追加到一個數(shù)組的末尾是通過 push() 函數(shù)罕伯。
  • .push() 接受把一個或多個參數(shù)粗截,并把它“推”入到數(shù)組的末尾。
var arr = [1,2,3];
arr.push(4);
// 現(xiàn)在arr的值為 [1,2,3,4]

Manipulate Arrays With pop

  • 改變數(shù)組中數(shù)據(jù)的另一種方法是用 .pop() 函數(shù)捣炬。

  • .pop() 函數(shù)用來“拋出”一個數(shù)組末尾的值熊昌。我們可以把這個“拋出”的值賦給一個變量存儲起來。

  • 數(shù)組中任何類型的條目(數(shù)值湿酸,字符串婿屹,甚至是數(shù)組)可以被“拋出來” 。

舉個例子, 對于這段代碼

var oneDown = [1, 4, 6].pop();

現(xiàn)在 oneDown 的值為 6 推溃,數(shù)組變成了 [1, 4]昂利。


Manipulate Arrays With shift

  • pop() 函數(shù)用來移出數(shù)組中最后一個元素。如果想要移出第一個元素要怎么辦呢铁坎?
  • 這就是 .shift() 的用武之地蜂奸。它的工作原理就像 .pop(),但它移除的是第一個元素硬萍,而不是最后一個扩所。

Manipulate Arrays With unshift

  • 你不僅可以 shift(移出)數(shù)組中的第一個元素,你也可以 unshift(移入)一個元素到數(shù)組的頭部朴乖。
  • .unshift() 函數(shù)用起來就像 .push() 函數(shù)一樣, 但不是在數(shù)組的末尾添加元素祖屏,而是在數(shù)組的頭部添加元素。

Write Reusable JavaScript with Functions

  • 在 JavaScript 中买羞,我們可以把代碼的重復(fù)部分抽取出來袁勺,放到一個函數(shù)(functions)中。

  • 這是一個函數(shù)(function)的例子:

function functionName() {
  console.log("Hello World");
}

你可以通過函數(shù)名稱functionName加上后面的小括號來調(diào)用這個函數(shù)(function)畜普,就像這樣:functionName();

每次調(diào)用函數(shù)時它會打印出消息的“Hello World”到開發(fā)的控制臺上期丰。所有的大括號之間的代碼將在每次函數(shù)調(diào)用時執(zhí)行。


Passing Values to Functions with Arguments

  • 函數(shù)的參數(shù)parameters在函數(shù)中充當(dāng)占位符(也叫形參)的作用吃挑,參數(shù)可以為一個或多個钝荡。調(diào)用一個函數(shù)時所傳入的參數(shù)為實參,實參決定著形參真正的值儒鹿。簡單理解:形參即形式化撕、實參即內(nèi)容。

  • 這是帶有兩個參數(shù)的函數(shù)约炎, param1 和 param2:

function testFun(param1, param2) {
  console.log(param1, param2);
}

接著我們調(diào)用 testFun:

testFun("Hello", "World");

我們傳遞了兩個參數(shù)植阴, "Hello" 和 "World"蟹瘾。在函數(shù)內(nèi)部,param1 等于“Hello”掠手,param2 等于“World”憾朴。請注意,testFun 函數(shù)可以多次調(diào)用喷鸽,每次調(diào)用時傳遞的參數(shù)會決定形參的實際值众雷。


Global Scope and Functions

  • 在 JavaScript 中哗讥, 作用域 涉及到變量的作用范圍峡捡。在函數(shù)外定義的變量具有 全局 作用域。這意味著场勤,具有全局作用域的變量可以在代碼的任何地方被調(diào)用混槐。

  • 這些沒有使用var關(guān)鍵字定義的變量编兄,會被自動創(chuàng)建在全局作用域中,形成全局變量声登。當(dāng)在代碼其他地方無意間定義了一個變量狠鸳,剛好變量名與全局變量相同,這時會產(chǎn)生意想不到的后果悯嗓。因此你應(yīng)該總是使用var關(guān)鍵字來聲明你的變量件舵。


Local Scope and Functions

  • 在一個函數(shù)內(nèi)聲明的變量,以及該函數(shù)的參數(shù)都是局部變量脯厨,意味著它們只在該函數(shù)內(nèi)可見铅祸。
  • 這是在函數(shù) myTest內(nèi)聲明局部變量loc 的最佳例子:
function myTest() {
  var loc = "foo";
  console.log(loc);
}
myTest(); // "foo"
console.log(loc); // "undefined"

Global vs Local Scope in Functions

  • 一個程序中有可能具有相同名稱的 局部 變量 和 全局 變量。在這種情況下俄认,局部 變量將會優(yōu)先于 全局 變量个少。
  • 下面為例:
var someVar = "Hat";
function myFun() {
  var someVar = "Head";
  return someVar;
}

函數(shù) myFun 將會返回 "Head",因為 局部變量 優(yōu)先級更高眯杏。


Return a Value from a Function with Return

  • 我們可以把數(shù)據(jù)通過函數(shù)的 參數(shù) 來傳入函數(shù),也可以使用 return 語句把數(shù)據(jù)從一個函數(shù)中傳出來壳澳。
  • 例如
function plusThree(num) {
  return num + 3;
}
var answer = plusThree(5); // 8

plusThree 帶有一個為 num 的 參數(shù) 并且返回(returns)一個等于 num + 3 的值岂贩。


Assignment with a Returned Value

  • 如果你還記得我們在這一節(jié) Storing Values with the Equal Operator 的討論,賦值之前巷波,先完成等號右邊的操作萎津。這意味著我們可把一個函數(shù)的返回值,賦值給一個變量抹镊。

  • 假設(shè)我們預(yù)先定義的函數(shù)sum其功能就是將兩個數(shù)字相加锉屈,那么:
    ourSum = sum(5, 12);

    將調(diào)用sum函數(shù),返回return了一個數(shù)值17垮耳,然后把它賦值給了ourSum變量颈渊。


Stand in Line

  • 在計算機(jī)科學(xué)中 隊列(queue)是一個抽象的數(shù)據(jù)結(jié)構(gòu)遂黍,隊列中的條目都是有秩序的。新的條目會被加到 隊列 的末尾俊嗽,舊的條目會從 隊列 的頭部被移出雾家。

  • 寫一個函數(shù) queue ,用一個數(shù)組arr和一個數(shù)字item作為參數(shù)绍豁。數(shù)字item添加到數(shù)組的結(jié)尾芯咧,然后移出數(shù)組的第一個元素,最后隊列函數(shù)應(yīng)該返回被刪除的元素竹揍。

function queue(arr, item) {
  // Your code here
  arr.push(item);
  item = arr.shift();
  return item;  // Change this line
}

Understanding Boolean Values

  • 另一種數(shù)據(jù)類型是布爾(Boolean)敬飒。布爾 值要么是true 要么是false。它非常像電路開關(guān)芬位, true 是“開”驶拱,false 是“關(guān)”。這兩種狀態(tài)是互斥的晶衷。

注意:Boolean 值絕不會寫作被引號包裹起來的形式蓝纲。字符串 的 "true" 和 "false" 不是 布爾值,在 JavaScript 中也沒有特殊含義晌纫。


Use Conditional Logic with If Statements

  • If 語句用于在代碼中做條件判斷税迷。關(guān)鍵字 if 告訴 JavaScript 在小括號中的條件為真的情況下去執(zhí)行定義在大括號里面的代碼。這種條件被稱為 Boolean 條件锹漱,因為他們只可能是 true(真)或 false(假)箭养。

  • 當(dāng)條件的計算結(jié)果為 true,程序執(zhí)行大括號內(nèi)的語句哥牍。當(dāng)布爾條件的計算結(jié)果為 false毕泌,大括號內(nèi)的代碼將不會執(zhí)行。

偽代碼

if(條件為真){
  語句被執(zhí)行
}
示例
function test (myCondition) {
  if (myCondition) {
     return "It was true";
  }
  return "It was false";
}
test(true);  // returns "It was true"
test(false); // returns "It was false"

當(dāng) test 被調(diào)用嗅辣,并且傳遞進(jìn)來的參數(shù)值為 true撼泛,if 語句會計算 myCondition 的結(jié)果,看它是真還是假澡谭。如果條件為 true愿题,函數(shù)會返回 "It was true"。當(dāng) test 被調(diào)用蛙奖,并且傳遞進(jìn)來的參數(shù)值為 false潘酗,myCondition 不 為 true,并且不執(zhí)行大括號后面的語句雁仲,函數(shù)返回 "It was false"仔夺。


Comparison with the Equality Operator

在 JavaScript 中,有很多 相互比較的操作攒砖。所有這些操作符都返回一個 true 或 false 值缸兔。

  • 最基本的運算符是相等運算符:==日裙。相等運算符比較兩個值,如果它們是同等灶体,返回 true阅签,如果它們不等,返回 false蝎抽。值得注意的是相等運算符不同于賦值運算符(=)政钟,賦值運算符是把等號右邊的值賦給左邊的變量。
function equalityTest(myVal) {
  if (myVal == 10) {
     return "Equal";
  }
  return "Not Equal";
}

如果 myVal 等于 10樟结,相等運算符會返回 true养交,因此大括號里面的代碼會被執(zhí)行,函數(shù)將返回 "Equal"瓢宦。否則碎连,函數(shù)返回 "Not Equal"。

在 JavaScript 中驮履,為了讓兩個不同的 數(shù)據(jù)類型(例如 數(shù)字 和 字符串)的值可以作比較鱼辙,它必須把一種類型轉(zhuǎn)換為另一種類型。然而一旦這樣做玫镐,它可以像下面這樣來比較:

   1   ==  1    // true
   1   ==  2    // false
   1   == '1'   // true
  "3"  ==  3    // true

Comparison with the Strict Equality Operator

  • 全等(===)是相對于相等操作符(==)的一種操作符倒戏。與相等操作符不同的是全等比較嚴(yán)格,它會同時比較元素的值和 數(shù)據(jù)類型恐似。

舉個例子

3 === 3   // true
3 === '3' // false
3 是一個 數(shù)字 類型的杜跷,而'3' 是一個 字符 類型的,所以3不全等于'3'矫夷。

Comparison with the Inequality Operator

  • 不相等運算符(!=)與相等運算符是相反的葛闷。這意味著不相等運算符中,如果“不為真”并且返回 false 的地方双藕,在相等運算符中會返回true淑趾,反之亦然(vice versa)。與相等運算符類似蔓彩,不相等運算符在比較的時候也會轉(zhuǎn)換值的數(shù)據(jù)類型治笨。
    Examples
1 != 2      // true
1 != "1"    // false
1 != '1'    // false
1 != true   // false
0 != false  // false

Comparison with the Strict Inequality Operator

  • 不全等運算符(!==)與全等運算符是相反的。這意味著“不全等”并返回 false 的地方赤嚼,用全等運算會返回 true,反之亦然顺又。全等運算符不會轉(zhuǎn)換值的數(shù)據(jù)類型更卒。
    例如
3 !== 3   // false
3 !== '3' // true
4 !== 3   // true

Comparison with the Greater Than Operator

  • 使用大于運算符(>)來比較兩個數(shù)字。如果大于運算符左邊的數(shù)字大于右邊的數(shù)字稚照,將會返回 true蹂空。否則俯萌,它返回 false。與相等運算符一樣上枕,大于運算符在比較的時候咐熙,會轉(zhuǎn)換值的數(shù)據(jù)類型。

例如

 5 > 3   // true
 7 > '3' // true
 2 > 3   // false
'1' > 9  // false

Comparison with the Greater Than Or Equal To Operator

  • 使用 大于等于 運算符(>=)來比較兩個數(shù)字的大小辨萍。如果大于等于運算符左邊的數(shù)字比右邊的數(shù)字大或者相等棋恼,它會返回 true。否則锈玉,它會返回 false爪飘。與相等運算符相似,大于等于 運算符在比較的時候會轉(zhuǎn)換值的數(shù)據(jù)類型拉背。

例如

 6  >=  6  // true
 7  >= '3' // true
 2  >=  3  // false
'7' >=  9  // false

Comparison with the Less Than Operator

  • 使用 小于 運算符(<)比較兩個數(shù)字的大小师崎。如果小于運算符左邊的數(shù)字比右邊的數(shù)字小,它會返回 true椅棺。否則犁罩,他會返回 false。與相等運算符類似两疚,小于 運算符在做比較的時候會轉(zhuǎn)換值的數(shù)據(jù)類型床估。

例如

  2 < 5  // true
'3' < 7  // true
  5 < 5  // false
  3 < 2  // false
'8' < 4  // false

Comparison with the Less Than Or Equal To Operator

  • 使用 小于等于 運算符(<=)比較兩個數(shù)字的大小。如果在小于等于運算符鬼雀,左邊的數(shù)字小于或者等于右邊的數(shù)字顷窒,它會返回 true。如果在小于等于運算符源哩,左邊的數(shù)字大于或者等于右邊的數(shù)字鞋吉,它會返回 false。與相等運算符類型励烦,小于等于 運算符會轉(zhuǎn)換數(shù)據(jù)類型谓着。

例如

  4 <= 5  // true
'7' <= 7  // true
  5 <= 5  // true
  3 <= 2  // false
'8' <= 4  // false

Comparisons with the Logical And Operator

  • 有時你需要在一次判斷中做多個操作。當(dāng)且僅當(dāng)運算符的左邊和右邊都是 true坛掠,邏輯與 運算符(&&)才會返回 true赊锚。

同樣的效果可以通過if語句的嵌套來實現(xiàn):

if (num > 5) {
  if (num < 10) {
    return "Yes";
  }
}
return "No";

只有當(dāng) num 的值在6和9之間(包括6和9)才會返回 "Yes"。相同的邏輯可被寫為:

if (num > 5 && num < 10) {
  return "Yes";
}
return "No";

Comparisons with the Logical Or Operator

  • 如果任何一個操作數(shù)是true屉栓,邏輯或 運算符 (||) 返回 true舷蒲。反之,返回 false友多。

舉個例子:

if (num > 10) {
  return "No";
}
if (num < 5) {
  return "No";
}
return "Yes";

只有當(dāng)num大于等于5或小于等于10時牲平,函數(shù)返回"Yes"。相同的邏輯可以簡寫成:

if (num > 10 || num < 5) {
  return "No";
}
return "Yes";

Introducing Else Statements

  • 當(dāng)if語句的條件為真域滥,大括號里的代碼執(zhí)行纵柿,那如果條件為假呢蜈抓?
    正常情況下什么也不會發(fā)生。
  • 寫一個else語句昂儒,當(dāng)條件為假時執(zhí)行相應(yīng)的代碼沟使。
if (num > 10) {
  return "Bigger than 10";
} else {
  return "10 or Less";
}

ntroducing Else If Statements

  • 如果你有多個條件語句,你可以通過else if語句把 if語句鏈起來渊跋。
if (num > 15) {
  return "Bigger than 15";
} else if (num < 5) {
  return "Smaller than 5";
} else {
  return "Between 5 and 15";
}

Logical Order in If Else Statements

  • if腊嗡、else if語句中代碼的執(zhí)行順序是很重要的。
  • 在條件判斷語句中刹枉,代碼的執(zhí)行順序是從上到下叽唱,所以你需要考慮清楚先執(zhí)行哪一句,后執(zhí)行哪一句微宝。

這有兩個例子棺亭。

第一個例子:

function foo(x) {
  if (x < 1) {
    return "Less than one";
  } else if (x < 2) {
    return "Less than two";
  } else {
    return "Greater than or equal to two";
  }
}

第二個例子更改了代碼的執(zhí)行順序:

function bar(x) {
  if (x < 2) {
    return "Less than two";
  } else if (x < 1) {
    return "Less than one";
  } else {
    return "Greater than or equal to two";
  }
}

這兩個函數(shù)看起來幾乎一模一樣,我們傳一個值進(jìn)去看看它們有什么區(qū)別蟋软。

foo(0) // "Less than one"
bar(0) // "Less than two"

Chaining If Else Statements

  • if/else 語句串聯(lián)在一起可以實現(xiàn)復(fù)雜的邏輯镶摘,這是多個if/else if 語句串聯(lián)在一起的偽代碼:
if (condition1) {
  statement1
} else if (condition2) {
  statement2
} else if (condition3) {
  statement3
. . .
} else {
  statementN
}

Selecting from many options with Switch Statements

  • 如果你有非常多的選項需要選擇,可以使用switch語句岳守。根據(jù)不同的參數(shù)值會匹配上不同的case分支凄敢,語句會從第一個匹配的case分支開始執(zhí)行,直到碰到break就結(jié)束湿痢。

這是一個偽代碼案例:

switch (num) {
  case value1:
    statement1;
    break;
  case value2:
    statement2;
    break;
...
  case valueN:
    statementN;
    break;
}

測試case 值使用嚴(yán)格等于涝缝,break關(guān)鍵字告訴javascript停止執(zhí)行語句。如果沒有break關(guān)鍵字譬重,下一個語句會繼續(xù)執(zhí)行拒逮。


Adding a default option in Switch statements

  • 在switch 語句中你可能無法用case來指定所有情況,這時你可以添加default語句臀规。當(dāng)再也找不到case匹配的時候default語句會執(zhí)行滩援,非常類似于if/else組合中的else語句。

default語句應(yīng)該是最后一個case塔嬉。

switch (num) {
  case value1:
    statement1;
    break;
  case value2:
    statement2;
    break;
...
  default:
    defaultStatement;
}

Multiple Identical Options in Switch Statements

  • 如果switch語句中的case分支的break 語句漏掉了玩徊,后面的 case語句會一直執(zhí)行直到遇到break。如果你有多個輸入值和輸出值一樣谨究,可以試試下面的switch語句:
switch(val) {
  case 1:
  case 2:
  case 3:
    result = "1, 2, or 3";
    break;
  case 4:
    result = "4 alone";
}

分支1恩袱、2、3將會產(chǎn)生相同的輸出結(jié)果胶哲。


Replacing If Else Chains with Switch

  • 如果你有多個選項需要選擇憎蛤,switch 語句寫起來會比多個串聯(lián)的if/if else語句容易些,譬如:
if (val === 1) {
  answer = "a";
} else if (val === 2) {
  answer = "b";
} else {
  answer = "c";
}

可以被下面替代:

switch (val) {
  case 1:
    answer = "a";
    break;
  case 2:
    answer = "b";
    break;
  default:
    answer = "c";
}

Returning Boolean Values from Functions

  • 你可能會回想起Comparison with the Equality Operator 纪吮,所有的比較操作符返回的都是一個boolean值俩檬,要么是true
    要么是false。
  • 使用if/else語句來做比較然后返回true或false已經(jīng)成為大家的共識:
function isEqual(a,b) {
  if (a === b) {
    return true;
  } else {
    return false;
  }
}

因為=== 總是返回 true 或 false碾盟,所以我們可以直接返回比較的結(jié)果:

function isEqual(a,b) {
  return a === b;
}

Return Early Pattern for Functions

  • 當(dāng)代碼執(zhí)行到return語句時棚辽,函數(shù)返回一個結(jié)果就結(jié)束運行了,return后面的語句根本不會執(zhí)行冰肴。

舉例

function myFun() {
  console.log("Hello");
  return "World";
  console.log("byebye")
}
myFun();

上面的代碼輸出"Hello"到控制臺屈藐、返回 "World",但沒有輸出"byebye"熙尉,因為函數(shù)遇到return語句就退出了联逻。


Build JavaScript Objects

你之前可能聽說過對象 object 。

  • 對象和數(shù)組很相似检痰,數(shù)組是通過索引來訪問和修改數(shù)據(jù)包归,對象是通過屬性來訪問和修改數(shù)據(jù)的。

這是一個示例對象:

var cat = {
  "name": "Whiskers",
  "legs": 4,
  "tails": 1,
  "enemies": ["Water", "Dogs"]
};

對象適合用來存儲結(jié)構(gòu)化數(shù)據(jù)铅歼,就和真實世界的對象一模一樣公壤,比如一只貓。


Accessing Objects Properties with the Dot Operator

  • 有兩種方式訪問對象屬性椎椰,一個是點操作符(.)厦幅,一個是中括號操作符([])。
  • 當(dāng)你知道屬性的名稱的時候慨飘,使用點操作符确憨。

這是一個使用點操作符讀取對象屬性的例子:

var myObj = {
  prop1: "val1",
  prop2: "val2"
};
var prop1val = myObj.prop1; // val1
var prop2val = myObj.prop2; // val2

Accessing Objects Properties with Bracket Notation

  • 第二種訪問對象的方式就是中括號操作符([]),如果你想訪問的屬性的名稱有一個空格瓤的,這時你只能使用中括號操作符([])休弃。

這是一個使用中括號操作符([])讀取對象屬性的例子:

var myObj = {
  "Space Name": "Kirk",
  "More Space": "Spock"
};
myObj["Space Name"]; // Kirk
myObj['More Space']; // Spock

提示:屬性名稱中如果有空格,必須把屬性名稱用單引號或雙引號包裹起來堤瘤。


Accessing Objects Properties with Variables

  • 中括號操作符的另一個使用方式是用變量來訪問一個屬性玫芦。當(dāng)你需要遍歷對象的屬性列表或查表時,這種方式極為有用本辐。
    這有一個使用變量來訪問屬性的例子:
var someProp = "propName";
var myObj = {
  propName: "Some Value"
}
myObj[someProp]; // "Some Value"

還有更多:

var myDog = "Hunter";
var dogs = {
  Fido: "Mutt",
  Hunter: "Doberman",
  Snoopie: "Beagle"
}
var breed = dogs[myDog]; // "Hunter"
console.log(breed)// "Doberman"

提示:當(dāng)我們通過變量名訪問屬性的時候桥帆,不需要給變量名包裹引號。因為實際上我們使用的是變量的值慎皱,而不是變量的名稱老虫。


Updating Object Properties

  • 當(dāng)你創(chuàng)建了一個對象后,你可以用點操作符或中括號操作符來更新對象的屬性茫多。
    舉個例子祈匙,讓我們看看 ourDog:
var ourDog = {
  "name": "Camper",
  "legs": 4,
  "tails": 1,
  "friends": ["everything!"]
};

讓我們更改它的名稱為 "Happy Camper",這有兩種方式來更新對象的name屬性:

ourDog.name = "Happy Camper";
ourDog["name"] = "Happy Camper";

Add New Properties to a JavaScript Object

  • 你也可以像更改屬性一樣給對象添加屬性。

看看我們是如何給ourDog添加 "bark"屬性:

ourDog.bark = "bow-wow";
or
ourDog["bark"] = "bow-wow";

Delete Properties from a JavaScript Object

  • 我們同樣可以刪除對象的屬性夺欲,例如:
delete ourDog.bark;

Using Objects for Lookups

  • 對象和字典一樣跪帝,可以用來存儲鍵/值對。如果你的數(shù)據(jù)跟對象一樣些阅,你可以用對象來查找你想要的值伞剑,而不是使用switch或if/else語句。當(dāng)你知道你的輸入數(shù)據(jù)在某個范圍時市埋,這種查找方式極為有效黎泣。

這是簡單的反向字母表:

var alpha = {
  1:"Z",
  2:"Y",
  3:"X",
  4:"W",
  ...
  24:"C",
  25:"B",
  26:"A"
};
alpha[2]; // "Y"
alpha[24]; // "C"
var value = 2;
alpha[value]; // "Y"

Testing Objects for Properties

  • 有時檢查一個對象屬性是否存在是非常有用的,我們可以用.hasOwnProperty(propname)方法來檢查對象是否有該屬性缤谎。如果有返回true抒倚,反之返回 false。

舉例

var myObj = {
  top: "hat",
  bottom: "pants"
};
myObj.hasOwnProperty("top");    // true
myObj.hasOwnProperty("middle"); // false

Introducing JavaScript Object Notation JSON

  • JavaScript Object Notation 簡稱 JSON坷澡,它使用JavaScript對象的格式來存儲數(shù)據(jù)托呕。JSON是靈活的,因為它允許 數(shù)據(jù)結(jié)構(gòu) 是 字符串洋访,數(shù)字镣陕,布爾值,數(shù)組姻政,函數(shù)呆抑,和 對象 的任意組合。

這里是一個JSON對象的示例:

var ourMusic = [
  {
    "artist": "Daft Punk",
    "title": "Homework",
    "release_year": 1997,
    "formats": [ 
      "CD", 
      "Cassette", 
      "LP" ],
    "gold": true
  }
];

這是一個對象數(shù)組汁展,并且對象有各種關(guān)于專輯的 詳細(xì)信息鹊碍。它也有一個嵌套的 formats 的數(shù)組。附加專輯記錄可以被添加到數(shù)組的最上層食绿。

注:你應(yīng)該在每個對象后添加一個逗號侈咕,除非這個對象是數(shù)組中的最后一個。


Accessing Nested Objects in JSON

  • 通過串聯(lián)起來的點操作符或中括號操作符來訪問JSON對象的嵌套屬性器紧。

下面是一個嵌套的JSON對象:

var ourStorage = {
  "desk": {
    "drawer": "stapler"
  },
  "cabinet": {
    "top drawer": { 
      "folder1": "a file",
      "folder2": "secrets"
    },
    "bottom drawer": "soda"
  }
}
ourStorage.cabinet["top drawer"].folder2;  // "secrets"
ourStorage.desk.drawer; // "stapler"

Accessing Nested Arrays in JSON

  • 正如我們在前面的例子所見耀销,JSON對象可以嵌套對象和數(shù)組。與訪問嵌套對象一樣铲汪,用中括號操作符同樣可以訪問嵌套數(shù)組熊尉。

下面是如何訪問嵌套數(shù)組的例子:

var ourPets = { 
  "cats": [
    "Meowzer",
    "Fluffy",
    "Kit-Cat"
  ],
  "dogs": [
    "Spot",
    "Bowser",
    "Frankie"
  ]
};
ourPets.cats[1]; // "Fluffy"
ourPets.dogs[0]; // "Spot"

Iterate with JavaScript For Loops

  • 一個條件語句只能執(zhí)行一次代碼,而一個循環(huán)語句可以多次執(zhí)行代碼掌腰。
  • JavaScript 中最常見的循環(huán)就是“for循環(huán)”狰住。
  • for循環(huán)中的三個表達(dá)式用分號隔開:
    for ([初始化]; [條件判斷]; [計數(shù)器])
    初始化語句只會在執(zhí)行循環(huán)開始之前執(zhí)行一次。它通常用于定義和設(shè)置你的循環(huán)變量齿梁。
    條件判斷語句會在每一輪循環(huán)的開始執(zhí)行催植,只要條件判斷為 true 就會繼續(xù)執(zhí)行循環(huán)肮蛹。當(dāng)條件為 false的時候,循環(huán)將停止執(zhí)行创南。這意味著伦忠,如果條件在一開始就為 false,這個循環(huán)將不會執(zhí)行扰藕。
    計數(shù)器是在每一輪循環(huán)結(jié)束時執(zhí)行缓苛,通常用于遞增或遞減。

在下面的例子中邓深,先初始化i = 0,條件 i < 5 為真笔刹,進(jìn)入第一次循環(huán)芥备,執(zhí)行大括號里的代碼,第一次循環(huán)結(jié)束舌菜。遞增i的值萌壳,條件判斷,就這樣依次執(zhí)行下去日月,直到條件判斷為假袱瓮,整個循環(huán)結(jié)束。

var ourArray = [];
for (var i = 0; i < 5; i++) {
  ourArray.push(i);
}

最終 ourArray 的值為 [0,1,2,3,4]


Iterate Odd Numbers With a For Loop

  • for循環(huán)可以按照我們指定的順序來迭代爱咬,通過更改我們的 計數(shù)器尺借,我們可以按照偶數(shù)順序來迭代。

初始化 i = 0精拟,當(dāng) i < 10 的時候繼續(xù)循環(huán)燎斩。
i += 2 讓 i 每次循環(huán)之后增加2。

var ourArray = [];
for (var i = 0; i < 10; i += 2) {
  ourArray.push(i);
}

循環(huán)結(jié)束后蜂绎,ourArray 的值為 [0,2,4,6,8]栅表。


Count Backwards With a For Loop

  • for循環(huán)也可以逆向迭代,只要我們定義好合適的條件师枣。

  • 為了能夠從后往前兩兩倒數(shù)怪瓶,我們需要改變我們的 初始化,條件判斷 和 計數(shù)器践美。

我們讓 i = 10洗贰,并且當(dāng) i > 0 的時候才繼續(xù)循環(huán)。我們使用 i-=2 來讓 i 每次循環(huán)遞減 2拨脉。

var ourArray = [];
for (var i=10; i > 0; i-=2) {
  ourArray.push(i);
}

循環(huán)結(jié)束后哆姻,ourArray 的值為 [10,8,6,4,2].


Iterate Through an Array with a For Loop

  • 迭代輸出一個數(shù)組的每個元素是 JavaScript 中的常見需求, for 循環(huán)可以做到這一點玫膀。

下面的代碼將輸出數(shù)組 arr 的每個元素到控制臺:

var arr = [10,9,8,7,6];
for (var i=0; i < arr.length; i++) {
   console.log(arr[i]);
}

記住數(shù)組的索引從零開始的矛缨,這意味著數(shù)組的最后一個元素的下標(biāo)是:數(shù)組的長度 - 1。我們這個循環(huán)的 條件 是 i < arr.length,當(dāng) i 的值為 長度-1 的時候循環(huán)就停止了箕昭。


Nesting For Loops

如果你有一個二維數(shù)組灵妨,可以使用相同的邏輯,先遍歷外面的數(shù)組落竹,再遍歷里面的子數(shù)組泌霍。下面是一個例子:

var arr = [
  [1,2], [3,4], [5,6]
];
for (var i=0; i < arr.length; i++) {
  for (var j=0; j < arr[i].length; j++) {
    console.log(arr[i][j]);
  }
}

一次輸出 arr 中的每個子元素。提示述召,對于內(nèi)部循環(huán)朱转,我們可以通過 arr[i] 的 .length 來獲得子數(shù)組的長度,因為 arr[i] 的本身就是一個數(shù)組积暖。


Iterate with JavaScript While Loops

  • 另一種類型的 JavaScript 循環(huán)被稱為while循環(huán)藤为,因為它規(guī)定,當(dāng)(while)條件為真夺刑,循環(huán)才會執(zhí)行缅疟,反之不執(zhí)行。
var ourArray = [];
var i = 0;
while(i < 5) {
  ourArray.push(i);
  i++;
}

Generate Random Fractions with JavaScript

  • 計算機(jī)的行為只有兩種:確定性隨機(jī)性遍愿。當(dāng)你一步步地闖關(guān)來到這里就是確定行為存淫,當(dāng)你隨意點了個鏈接就來到這里就是隨機(jī)行為。

  • 而隨機(jī)數(shù)最適合用來創(chuàng)建這種隨機(jī)行為沼填。

  • Math.random()用來生成一個在0(包括0)到1(不包括1)之間的隨機(jī)小數(shù)桅咆,因此Math.random()可能返回0但絕不會返回1

提示:隨后的函數(shù)都會在return執(zhí)行前調(diào)用倾哺,所以我們可以直接返回Math.random()的值轧邪。


Generate Random Whole Numbers with JavaScript

生成隨機(jī)小數(shù)很棒,但隨機(jī)數(shù)更有用的地方在于生成隨機(jī)整數(shù)羞海。

用 Math.random() 生成一個隨機(jī)小數(shù)忌愚。
把這個隨機(jī)小數(shù)乘以 20。
用 Math.floor() 向下取整 獲得它最近的整數(shù)却邓。
記住 Math.random() 永遠(yuǎn)不會返回 1硕糊。同時因為我們是在用 Math.floor() 向下取整,所以最終我們獲得的結(jié)果不可能有 20腊徙。這確保了我們獲得了一個在0到19之間的整數(shù)简十。

把操作連綴起來,代碼類似于下面:

Math.floor(Math.random() * 20);

我們先調(diào)用 Math.random()撬腾,把它的結(jié)果乘以20螟蝙,然后把上一步的結(jié)果傳給 Math.floor(),最終通過向下取整獲得最近的整數(shù)民傻。


Generate Random Whole Numbers within a Range

我們之前生成的隨機(jī)數(shù)是在0到某個數(shù)之間胰默,現(xiàn)在我們要生成的隨機(jī)數(shù)是在兩個指定的數(shù)之間场斑。

我們需要定義一個最小值和一個最大值。

下面是我們將要使用的方法牵署,仔細(xì)看看并嘗試?yán)斫膺@行代碼到底在干嘛:

Math.floor(Math.random() * (max - min + 1)) + min
  • Math.random() * (max - min + 1) 的取值范圍[0, max - min]
  • Math.random() * (max - min + 1) + min的取值范圍[min, max]

Sift through Text with Regular Expressions

  • Regular expressions 正則表達(dá)式被用來根據(jù)某種匹配模式來尋找strings中的某些單詞漏隐。

舉例:如果我們想要找到字符串The dog chased the cat中單詞 the,我們可以使用下面的正則表達(dá)式: /the/gi
我們可以把這個正則表達(dá)式分成幾段:

/是這個正則表達(dá)式的頭部

the是我們想要匹配的模式

/是這個正則表達(dá)式的尾部

g 代表著 global(全局)奴迅,意味著返回所有的匹配而不僅僅是第一個青责。

i代表著忽略大小寫,意思是當(dāng)我們尋找匹配的字符串的時候忽略掉字母的大小寫取具。


Find Numbers with Regular Expressions

我們可以在正則表達(dá)式中使用特殊選擇器來選取特殊類型的值脖隶。

  • 特殊選擇器中的一種就是數(shù)字選擇器\d,意思是被用來獲取一個字符串的數(shù)字者填。

在JavaScript中, 數(shù)字選擇器類似于: /\d/g

  • 在選擇器后面添加一個加號標(biāo)記(+)浩村,例如:/\d+/g,它允許這個正則表達(dá)式匹配一個或更多數(shù)字占哟。此時,一個單詞也只會使計數(shù)器加1.

尾部的g是'global'的簡寫酿矢,意思是允許這個正則表達(dá)式 找到所有的匹配而不是僅僅找到第一個匹配榨乎。


Find Whitespace with Regular Expressions

  • 我們也可以使用正則表達(dá)式選擇器 \s 來選擇一個字符串中的空白。

空白字符有" " (空格符 space)瘫筐、\r(回車符 the carriage return)蜜暑、\n(換行符 newline)、\t (制表符 tab) 和\f(換頁符 the form feed)策肝。

空白正則表達(dá)式類似于:
/\s+/g


Invert Regular Expression Matches with JavaScript

  • 你可以用正則表達(dá)式選擇器的大寫版本來轉(zhuǎn)化任何匹配肛捍。

舉個例子:\s 匹配任何空白字符,\S 匹配任何非空白字符之众。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拙毫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子棺禾,更是在濱河造成了極大的恐慌缀蹄,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膘婶,死亡現(xiàn)場離奇詭異缺前,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)悬襟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門衅码,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人脊岳,你說我怎么就攤上這事逝段《獠#” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵惹恃,是天一觀的道長夭谤。 經(jīng)常有香客問我,道長巫糙,這世上最難降的妖魔是什么朗儒? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮参淹,結(jié)果婚禮上醉锄,老公的妹妹穿的比我還像新娘。我一直安慰自己浙值,他們只是感情好恳不,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著开呐,像睡著了一般烟勋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上筐付,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天卵惦,我揣著相機(jī)與錄音,去河邊找鬼瓦戚。 笑死沮尿,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的较解。 我是一名探鬼主播畜疾,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼印衔!你這毒婦竟也來了啡捶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤当编,失蹤者是張志新(化名)和其女友劉穎届慈,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忿偷,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡金顿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鲤桥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揍拆。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖茶凳,靈堂內(nèi)的尸體忽然破棺而出嫂拴,到底是詐尸還是另有隱情播揪,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布筒狠,位于F島的核電站猪狈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏辩恼。R本人自食惡果不足惜雇庙,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望灶伊。 院中可真熱鬧疆前,春花似錦、人聲如沸聘萨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽米辐。三九已至胸完,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翘贮,已是汗流浹背茉帅。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工何吝, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留丁眼,地道東北人秘豹。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓位衩,卻偏偏與公主長得像齐莲,于是被迫代替她去往敵國和親鬓长。 傳聞我的和親對象是個殘疾皇子乏德,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • FreeCodeCamp - Basic JavaScript 寫在前面: 我曾經(jīng)在進(jìn)谷前刷過這一套題叔收,不過當(dāng)時只...
    付林恒閱讀 16,442評論 5 28
  • 標(biāo)簽: 我的筆記 ---學(xué)習(xí)資料:http://javascript.ruanyifeng.com/ 1. 導(dǎo)論 ...
    暗夜的怒吼閱讀 810評論 0 1
  • 文/娟子 一 家鄉(xiāng)美景 每個人都會有這么一個去看看世界的夢想齿穗,為逃避現(xiàn)實的壓力,或不滿足現(xiàn)世的安穩(wěn)饺律。而在大山長大...
    娟子曰閱讀 888評論 15 18
  • 加繆的《局外人》保存在手機(jī)里面很長時間了窃页,近來才又拾起繼續(xù)看完。文章篇幅不長复濒,沒有復(fù)雜的情節(jié)構(gòu)造脖卖,言語表達(dá)上也樸實...
    lzy_檸檬綠閱讀 623評論 0 0
  • 文君是個聽話的姑娘,在那個早戀并不盛行的年代巧颈,更加不敢造勢畦木。頂著一頭男孩子的短發(fā),一心只讀圣賢書砸泛。 每天...
    朝夕絮語閱讀 243評論 1 2