JavaScript

簡(jiǎn)介

ECMAScript是JavaScript的標(biāo)準(zhǔn)舟肉,JavaScript實(shí)現(xiàn)了ECMAScript包竹,ECMAScript規(guī)范了JavaScript燕酷。

JavaScript體系

  1. 語言核心
  2. DOM
  3. BOM

JavaScript書寫位置

body里面寫script標(biāo)簽,例如:

<body>
    <script>
        alert('hello, world');
    </script>
</body>

或者

<script src=" .js" type="text/javascript" charset="utf-8"></script>

認(rèn)識(shí)輸出周瞎、輸入語句

alert( ) 語句 彈窗
console.log( ) 語句 控制臺(tái)輸出

比如:

alert('haha');

alert( ) 是內(nèi)置函數(shù)苗缩,函數(shù)就是功能的封裝,調(diào)用函數(shù)需要使用小括號(hào)声诸。
'haha' 是函數(shù)的參數(shù)酱讶,因?yàn)槭亲址砸靡?hào)包裹彼乌。

console.log('test');

console是js的內(nèi)置對(duì)象泻肯,通過 打點(diǎn) 可以調(diào)用它內(nèi)置的 log 方法渊迁。
所謂方法就是對(duì)象能夠調(diào)用的函數(shù)。

var input = prompt('請(qǐng)輸入內(nèi)容');

輸入語句 prompt( ) 函數(shù)灶挟,彈出框輸入琉朽,輸入的內(nèi)容會(huì)轉(zhuǎn)為字符串類型。

學(xué)會(huì)處理報(bào)錯(cuò)

常見兩個(gè)錯(cuò)誤:
Uncaught SyntaxError: Invalid or unexpected token
未捕獲的語法錯(cuò)誤:不合法或錯(cuò)誤的符號(hào)稚铣。
Uncaught ReferenceError: a is not defined
未捕獲的引用錯(cuò)誤:a沒有被定義箱叁。
函數(shù)名拼寫錯(cuò)誤也會(huì)引發(fā) ReferenceError。

控制臺(tái)

控制臺(tái)也是一個(gè)REPL環(huán)境惕医,可以使用它臨時(shí)測(cè)試耕漱。
REPL:read 讀 eval 執(zhí)行 print 打印 loop 循環(huán)

變量

變量能儲(chǔ)存計(jì)算結(jié)果 或 表示一個(gè)值;
變量不是數(shù)值本身抬伺,只是儲(chǔ)存值的容器螟够。

定義變量

var 關(guān)鍵字, 定義變量后沛简,就可以使用了齐鲤,可以用等號(hào)賦值。如果沒有負(fù)值椒楣,默認(rèn)值為undefined给郊。可以同時(shí)聲明多個(gè)變量捧灰,用逗號(hào)隔開淆九。

var a;
console.log(a);         //此時(shí)打印undefined
a = 7;
var b,
      c,
      d;

變量的合法命名

變量命名可以用多種風(fēng)格,例如:

  1. 小駝峰命名法:首字母小寫毛俏,后面每個(gè)單詞頭字母大寫炭庙。
  2. C風(fēng)格命名法:每個(gè)單詞用下劃線分隔。

變量命名符合JS標(biāo)識(shí)符命名規(guī)則煌寇,變量焕蹄、函數(shù)、類名阀溶、對(duì)象的屬性等都要遵守腻脏。

標(biāo)識(shí)符命名規(guī)則

  1. 只能由字母、數(shù)字银锻、下劃線永品、美元符號(hào)$組成,不能以數(shù)字開頭击纬。
  2. 不能是關(guān)鍵字或保留字鼎姐,例如float等。
  3. 變量名大小寫敏感,例如a和A不同炕桨。

全局變量聲明提升

全局預(yù)編譯

  1. 生成AO對(duì)象饭尝。
  2. 找變量聲明,將變量名作為GO的屬性名谋作,值為undefined芋肠。
  3. 在函數(shù)體里找函數(shù)聲明。

數(shù)據(jù)類型

  1. 基本數(shù)據(jù)類型:number遵蚜、string帖池、boolean、undefined吭净、null
  2. 復(fù)雜數(shù)據(jù)類型:Array睡汹、function、object 等...

typeof 運(yùn)算符

  • 使用 typeof 運(yùn)算符可以檢測(cè)值或變量的類型寂殉,檢測(cè)復(fù)雜類型可能會(huì)有出入囚巴。
  • typeof 返回值是字符串類型的值。
  • typeof 檢測(cè)5種基本類型的的結(jié)果友扰,除了null會(huì)返回object外彤叉,其他同名。
  • typeof 可接未定義的變量不會(huì)報(bào)錯(cuò)村怪。

基本數(shù)據(jù)類型

number 數(shù)字類型

所有數(shù)字不分大小秽浇、不分整數(shù)小數(shù)、不分正負(fù)甚负,都是數(shù)字類型柬焕。
零點(diǎn)幾的0可以省略。
科學(xué)計(jì)數(shù)法:3e7 => 3*10?梭域。

不同進(jìn)制的數(shù)字
二進(jìn)制數(shù)值以 0b 開頭:0b10 => 2斑举;
八進(jìn)制數(shù)值以 0 開頭:017 => 15;
十六進(jìn)制數(shù)值以 0x 開頭。

一個(gè)特殊的數(shù)字類型值NaN

  • not a number 病涨,不是一個(gè)數(shù)富玷,但它是一個(gè)數(shù)值類型的值。
  • 0除以0的結(jié)果是 NaN 既穆;運(yùn)算結(jié)果不是數(shù)字的數(shù)學(xué)運(yùn)算赎懦,返回值都是NaN。任何涉及NaN的運(yùn)算都返回NaN循衰。
  • NaN 不自等,即 NaN == NaN; 返回 false褐澎。
  • 用isNaN( ) 函數(shù)可以用來判斷變量值是否為NaN会钝,返回值是boolean布爾值,函數(shù)里的參數(shù)也會(huì)隱式轉(zhuǎn)換為數(shù)字類型,所以判斷不了undefined迁酸。

一個(gè)特殊的數(shù)字類型值Infinity

  • Infinity 也是數(shù)值類型的的值先鱼,正數(shù)除以0得Infinite,負(fù)數(shù)除以0得-Infinity奸鬓。

string 字符串類型

  • 字符串要用引號(hào)包裹焙畔,雙引號(hào)或者單引號(hào)均可串远。
  • 加號(hào)可以用來拼接多個(gè)字符串(拼串兒)彪标。
  • 直接書寫閉合的引號(hào)可得到空串。

字符串的length屬性:表示字符串的長(zhǎng)度漂彤。

字符串的常用方法:

方法名 功能
charAt( ) 得到指定位置字符
substring( ) 提取子串
substr 提取子串
slice 提取子串
toUpperCase 將字符串變?yōu)榇髮?/td>
toLowerCase 將字符串變?yōu)樾?/td>
indexOf 檢索字符串

charAt( )方法

  • 可以得到指定位置的字符挫望,比如:
    'abcdef'.charAt(0) 返回a。
  • 得到指定位置字符串還可以用方括號(hào)方法确镊,例如:
    'abcdef'[3] 返回d士骤。就是直接讀取可遍歷對(duì)象方括號(hào)里寫索引。
  • charCodeAt() 返回相應(yīng)索引號(hào)的字符ASCII值

substring( )方法
sub 子蕾域,string字符串拷肌。
substring(a,b) 得到從 a 開始到 b 結(jié)束(不包括 b 處)的子串。
如果省略第二個(gè)參數(shù)旨巷,返回的子串會(huì)一直到字符串的結(jié)尾巨缘。
參數(shù)會(huì)自動(dòng)從小排到大,比如 (5,3) 會(huì)自動(dòng)變?yōu)?(3,5)采呐。(慎用若锁,可讀性差)

substr( )方法
substr(a,b) 得到從a開始的長(zhǎng)度為b的子串。
a可以是負(fù)數(shù)斧吐,表示倒數(shù)位置又固。b不能是負(fù)數(shù),否則會(huì)返回空串煤率。

slice( )方法
slice(a,b) 得到從a開始到b結(jié)束(不包括b處)的子串仰冠。
a 可以是負(fù)數(shù),表示倒數(shù)蝶糯,倒數(shù)的下標(biāo)從-1開始洋只。
參數(shù) a 必須小于參數(shù) b。

toUpperCase( )轉(zhuǎn)為大寫昼捍,toLowerCase( )轉(zhuǎn)為小寫

indexOf( )方法
返回某個(gè)指定的字符串值再字符串中首次出現(xiàn)的位置(索引值)识虚。
如果要檢索的字符串沒有出現(xiàn),則返回-1妒茬。
傳入的參數(shù)是字符串担锤,例如'abcdef'.indexOf('de') 返回3。
此方法還可以傳入第二個(gè)參數(shù)乍钻,代表開始檢索肛循、搜索的索引位置蛛株。

boolean 布爾類型

小知識(shí):布爾(Boole.George)英國(guó)19世紀(jì)數(shù)學(xué)家及邏輯學(xué)家。
布爾類型 值只有兩個(gè):true 和 false 育拨,分別表示真假。

undefined 類型

undefinded 又是值欢摄,又是一種類型熬丧。
undefined 是全局對(duì)象上的一個(gè)屬性,window.undefined
不可寫 writable: false怀挠,比如window.undefined = 1無效析蝴。
不可配置 configurable: false,比如delete window.undefined無效绿淋。
不可枚舉 enumerable: flase 闷畸,比如

for(var k in window){
    if(k === undefined){
        console.log(k);
    }
}
不打印內(nèi)容

不可重新定義 cannot redefine property: undefined;
系統(tǒng)會(huì)給一個(gè)未賦值的變量自動(dòng)賦值為undefined,類型也是undefined 吞滞。
函數(shù)內(nèi)部不寫返回值的時(shí)候佑菩,返回的也是一個(gè)undefined。
在函數(shù)內(nèi)部可以把undefined當(dāng)作一個(gè)變量名來用裁赠,但盡量別用殿漠。例如:

function test(){
    var undefined = 1;
    console.log(undefined);
}
test();
會(huì)打印1

void(0) 會(huì)返回undefined

null

null是基本數(shù)據(jù)類型的值,typeof返回類型是object佩捞。
代表空绞幌、空對(duì)象。
可用于對(duì)象銷毀一忱,數(shù)組銷毀莲蜘,事件清空。

顯式類型轉(zhuǎn)換

其他類型 轉(zhuǎn) 數(shù)字

  1. 使用 Number( ) 函數(shù)
    字符串 → 數(shù)字:純數(shù)字字符串能變?yōu)閿?shù)字帘营,不是純數(shù)字的轉(zhuǎn)為NaN票渠,空串轉(zhuǎn)為0.
    布爾值 → 數(shù)字:true轉(zhuǎn)為1,false轉(zhuǎn)為0.
    undefined → 數(shù)字:undefined轉(zhuǎn)為NaN仪吧。
    null → 數(shù)字:null轉(zhuǎn)為0庄新。
  2. 使用 parseInt( ) 函數(shù)。
    用在字符串上時(shí):將自動(dòng)截?cái)嗟谝粋€(gè)非數(shù)字字符之后的所有字符薯鼠,點(diǎn)也算择诈,不會(huì)四舍五入。
  3. 使用 parseFloat( ) 函數(shù)出皇。
    將字符串轉(zhuǎn)為浮點(diǎn)數(shù)羞芍,只會(huì)識(shí)別到第一個(gè)點(diǎn)。

其他類型 轉(zhuǎn) 字符串

  1. 使用 String( ) 函數(shù)郊艘,變?yōu)殚L(zhǎng)得相同的字符串荷科。
  2. 使用 toString( ) 方法唯咬,數(shù)字使用 toString 要加括號(hào),例如 (7).toString();

其他類型 轉(zhuǎn) 布爾值

使用 Boolean( ) 函數(shù)畏浆。
數(shù)字→布爾:除了0和NaN是false胆胰,其他true。
字符串→布爾:空窗false刻获,其他true蜀涨。
undefined和null:轉(zhuǎn)成布爾值都是false。

表達(dá)式 和 運(yùn)算符 和 隱式類型轉(zhuǎn)換

表達(dá)式

表達(dá)式蝎毡,由運(yùn)算元和運(yùn)算符構(gòu)成厚柳,并產(chǎn)生運(yùn)算結(jié)果的語法結(jié)構(gòu)。
表達(dá)式的種類有:算術(shù)沐兵、關(guān)系别垮、邏輯、賦值扎谎、綜合碳想。

算術(shù)運(yùn)算符

符號(hào) 功能
+ 加法、正數(shù)毁靶、連字符
- 減法移袍、負(fù)數(shù)
* 乘法
/ 除法
% 取余

取余,也叫求模運(yùn)算老充,用百分號(hào) % 表示葡盗,小數(shù)模大數(shù)得小數(shù)。
乘除余運(yùn)算優(yōu)先級(jí)高于加減運(yùn)算啡浊。

算術(shù)運(yùn)算符的隱式類型轉(zhuǎn)換

如果參與數(shù)學(xué)運(yùn)算的值不是數(shù)值型觅够,會(huì)自動(dòng)轉(zhuǎn)換為數(shù)值型然后運(yùn)算,加號(hào)例外因?yàn)橛衅创δ芟锵F浔举|(zhì)是內(nèi)部調(diào)用 Number( ) 函數(shù)喘先,例如:

true + true;
//Number(true) + Number(true)  然后返回一個(gè)2

+'1'        //會(huì)返回一個(gè)數(shù)字1
3*'2天'      //會(huì)返回NaN

算術(shù)運(yùn)算符中浮點(diǎn)運(yùn)算問題IEEE754

在JavaScript中廷粒,有些浮點(diǎn)運(yùn)算不是很精準(zhǔn)窘拯,因?yàn)椴捎玫氖荌EEE754二進(jìn)制浮點(diǎn)數(shù)算術(shù)標(biāo)準(zhǔn),會(huì)產(chǎn)生“精度丟失”問題坝茎。
解決方法:可以用數(shù)字的 toFixed() 方法保留指定的小數(shù)位數(shù)涤姊,類型會(huì)變成字符串。例如:
(3.141592654).toFixed(2)

其他運(yùn)算的Math方法

  • 冪和開根:
    冪和開根沒有運(yùn)算符嗤放,需調(diào)用Math對(duì)象的方法實(shí)現(xiàn)思喊。
    冪:Math.pow(底數(shù),次方數(shù));
    開方:Math.sqrt(開根數(shù));
  • 向上取整和向下取整:(相對(duì)數(shù)軸而言)
    向上取整: Math.ceil(取整的數(shù));
    向下取整:Math.floor(取整的數(shù));
  • 隨機(jī)數(shù):
    Math.random( ); 得到0到1的隨機(jī)小數(shù)。(大于等于0小于1)
    想得到[a,b]區(qū)間的整數(shù),公式為:
    parseInt(Math.random()*(b-a+1))+a;
    封裝成函數(shù)就是
function getRandom(min,max){
    return parseInt(Math.random()*(max-min+1))+min;
}
  • 絕對(duì)值:
    Math.abs();

關(guān)系運(yùn)算符

符號(hào) 意義
> 大于
< 小于
>= 大于或等于
<= 小于或等于
== 等于
!= 不等于
=== 全等于
!== 不全等于

進(jìn)行關(guān)系運(yùn)算符運(yùn)算候的結(jié)果返回值是boolean布爾值爵嗅。
除了全等和不全等以外误墓,其他關(guān)系運(yùn)算符都會(huì)隱式轉(zhuǎn)換兩邊值為數(shù)字類型浅浮。
例如:

1 == '1';                       //返回true
undefined == null;       //這是個(gè)例外,undefined轉(zhuǎn)數(shù)字是NaN的惫恼,但返回true
undefined === null;     //返回false    
NaN == NaN;             //返回false棚贾,NaN不自等酥宴,所以要用isNaN( ) 函數(shù)判斷

沒有數(shù)學(xué)書寫上的連比3<=16<=15纲辽,要連比只能用邏輯運(yùn)算符

邏輯運(yùn)算符

符號(hào) 意義
!
&&
||

! 非

  • 也可以稱為“置反運(yùn)算”斜纪。
  • 是一個(gè)“單目操作符”,只需要一個(gè)操作數(shù)文兑。
  • 置反運(yùn)算的結(jié)果一定是布爾值,要置放的值會(huì)先隱式轉(zhuǎn)換為布爾值腺劣。所以用雙非!! 可以用來隱式轉(zhuǎn)換一個(gè)值為布爾值绿贞。

&& 與運(yùn)算

找假返回假,如果沒有假則返回最后一個(gè)真橘原。(都真就真)

|| 或運(yùn)算

找真返回真籍铁,如果沒有真則返回最后一個(gè)假。(有真就真)

邏輯運(yùn)算符優(yōu)先級(jí):非>與>或

賦值表達(dá)式

賦值運(yùn)算符

符號(hào) 意義
= 賦值
+= 快速賦值
-= 快速賦值
*= 快速賦值
/= 快速賦值
%= 快速賦值
++ 自增運(yùn)算
-- 自減運(yùn)算

賦值運(yùn)算也會(huì)產(chǎn)生值趾断,例如:

var a;
console.log(a=7);
//a=7會(huì)返回7拒名,所以會(huì)打印7而不是a=7。

所以可以連續(xù)使用賦值運(yùn)算(實(shí)際開發(fā)禁止使用)芋酌,例如:

var a,b,c;
a=b=c=7;
//先c=7返回7增显,再b= c=7 7,再a= b=c=7 7

快速賦值:+= 脐帝、-= 同云、*= 、 /= 堵腹、%=

在原數(shù)值基礎(chǔ)上進(jìn)一步運(yùn)算炸站。

自增自減:++、--

自身基礎(chǔ)上加一或減一疚顷。
a++和++a區(qū)別:a++先用再加旱易,++a先加再用。例如:

var n1=1,n2=2;
var n3 = (n1++)+n2
//此時(shí)n3等于3

綜合表達(dá)式

綜合運(yùn)算順序:非運(yùn)算>數(shù)學(xué)運(yùn)算>關(guān)系運(yùn)算>邏輯運(yùn)算 (非數(shù)關(guān)邏)

流程控制語句

條件語句:if腿堤、if elseif else阀坏、switch、三元運(yùn)算符笆檀。
循環(huán)語句:for全释、while、break和continue误债、do while浸船。

條件語句

if語句

if(條件){
    語句塊1妄迁,當(dāng)條件為真時(shí)執(zhí)行
}else{
    語句塊2,當(dāng)條件為假時(shí)執(zhí)行
}

if語句執(zhí)行流程圖

graph TD
A[程序執(zhí)行] -->| | B(執(zhí)行)
B --> C{測(cè)試條件}
C -->|條件1| D[語句塊1]
C -->|條件2| E[語句塊2]
  • if語句中的else可以省略
  • 如果if語句體中只有一行語句李命,可以省略大括號(hào)和換行登淘,且結(jié)尾加分號(hào)

else if 否則如果
else if( ) 條件分支“暗含”不符合之前的所有條件。

if( 測(cè)試表達(dá)式1){
    當(dāng)測(cè)試表達(dá)式1為true時(shí)執(zhí)行
}else if(測(cè)試表達(dá)式2){
    當(dāng)測(cè)試表達(dá)式2為true時(shí)執(zhí)行
}else{
    所有表達(dá)式為false時(shí)執(zhí)行
}

if 語句算法題

第一題: 判斷水仙花數(shù)封字。

如何拆位黔州?

  1. 數(shù)學(xué)方法:百位是原數(shù)值除以100取整。十位是原數(shù)字除以10取整阔籽,再與10求模流妻。個(gè)位是原數(shù)字與10求模
  2. 字符串方法:直接將原數(shù)字變?yōu)樽址缓笫褂胏harAt( )方法笆制。

第二題: 游樂園門票計(jì)算绅这。

年齡大于等于10 年齡小于10歲
平日 300 140
周末 500 210

switch 語句

用途:當(dāng)一個(gè)變量被分類討論的情形。

  1. switch( ) 括號(hào)內(nèi)一般是一個(gè)變量名在辆,這個(gè)變量被分類討論证薇。
  2. case表示情況,后面直接跟一個(gè)值匆篓,程序會(huì)將這個(gè)值依次與switch括號(hào)內(nèi)的變量匹配浑度,如果全等,則執(zhí)行case后的語句鸦概,多條case可以共用一個(gè)語句體箩张。
  3. default 表示默認(rèn)情況。
  4. break 跳出switch語句窗市。

三元運(yùn)算符

條件表達(dá)式 ? 表達(dá)式1 : 表達(dá)式2

當(dāng)條件為真執(zhí)行1伏钠,為假執(zhí)行2。

循環(huán)語句

for 循環(huán)語句

for的小括號(hào)有三個(gè)表達(dá)式:
表達(dá)式1:for循環(huán)內(nèi)可用的變量谨设,循環(huán)變量一般定為i熟掂,意為iterator迭代器。
表達(dá)式2:只要這條返回true扎拣,就會(huì)繼續(xù)執(zhí)行后面的語句塊赴肚。
表達(dá)式3:一般用來更新循環(huán)變量。
for循環(huán)執(zhí)行機(jī)理:

for(var i=1①; i<=10②; i++④){
    console.log(i)③;
}
//①→②→③→④

也就是說二蓝,for循環(huán)小括號(hào)內(nèi)的第三條語句誉券,是先執(zhí)行中括號(hào)內(nèi)的語句塊,再執(zhí)行的刊愚。

for循環(huán)算法題

  1. 累加器
  2. 1到100哪個(gè)數(shù)除3余1踊跟,除4余2,除5余3.(窮舉法)

while 循環(huán)語句

是一種“不定范圍”循環(huán)。先不指定循環(huán)開始和結(jié)束范圍商玫。只要滿足測(cè)試條件箕憾,就一直執(zhí)行循環(huán)體。

while(測(cè)試條件){
    循環(huán)執(zhí)行的語句塊;
}

循環(huán)注意: 當(dāng)循環(huán)條件終止值與更新的循環(huán)體內(nèi)的值不是同一個(gè)時(shí)拳昌,當(dāng)要求的值是循環(huán)值時(shí)袭异,注意“出一錯(cuò)誤”

循環(huán)語句中的break和continue

執(zhí)行 break; 會(huì)立即終止循環(huán)。
執(zhí)行 continue; 會(huì)跳過循環(huán)中的一個(gè)迭代炬藤,跳過其中一次循環(huán)御铃,這一次循環(huán)體內(nèi)的continue后面的其他語句將跳過執(zhí)行一次。

do while 循環(huán)

先執(zhí)行一次循環(huán)體沈矿,再判斷測(cè)試條件是否滿足上真。

do{
    循環(huán)執(zhí)行的語句塊(會(huì)先執(zhí)行一次);
}while(循環(huán)執(zhí)行條件)

while循環(huán)算法題 猜數(shù)字

流程語句經(jīng)典算法題

可以先用偽代碼寫下解決思路,再翻譯成js語法羹膳。

累加器與累乘器

  1. 計(jì)算 3/2 + 4/3 + 5/4 + 6/5 + ...... + (n+1)/n 的結(jié)果
  2. 由用戶輸入數(shù)字n睡互,計(jì)算n的階乘。for(var i=n; i>=1; i--){result*=i;} result要從1開始
  3. 圓周率可以由萊布尼茨級(jí)數(shù)公式計(jì)算溜徙,用戶輸入n,計(jì)算圓周率Π犀填。
    Π/2= 1 + 1/3 + 1*2/3*5 + 1*2*3/3*5*7 + 1*2*...n/3*5*...(2n-1)

窮舉法

  1. 100以內(nèi)蠢壹,能整除3也能整除5的數(shù)。
  2. 輸入一個(gè)數(shù)九巡,在控制臺(tái)顯示這個(gè)數(shù)的全部約數(shù)图贸。
  3. 尋找全部水仙花數(shù)。(每個(gè)數(shù)位的立方和等于它本身)冕广。

綜合算法題

  1. 尋找100以內(nèi)的質(zhì)數(shù)疏日。(用到給外層for循環(huán)套label,然后用continue label)
  2. 雞兔同籠撒汉,35頭沟优,94足。

數(shù)組

Array 睬辐,存儲(chǔ)一組值挠阁。

如何定義數(shù)組

  1. 使用方括號(hào): var arr = ['A','B','C'];
  2. 使用 new Array 構(gòu)造函數(shù):var arr = new Array('A','B','C');
    當(dāng)new Array函數(shù)只傳入一個(gè)數(shù)字時(shí),則定義一個(gè)長(zhǎng)度為n的數(shù)組溯饵。

數(shù)組的每一項(xiàng)都有下標(biāo)侵俗,下標(biāo)從0開始。
使用 數(shù)組變量 接方括號(hào)中寫下標(biāo) 的形式丰刊,可訪問數(shù)組項(xiàng)隘谣,例如:a[0];
當(dāng)下標(biāo)越界,會(huì)返回undefined而不會(huì)報(bào)錯(cuò)啄巧。

數(shù)組的length屬性表示長(zhǎng)度寻歧,數(shù)組的最后一項(xiàng)的下標(biāo)時(shí)length-1

數(shù)組是可讀可寫的掌栅,如果更改的項(xiàng)下標(biāo)越界,則會(huì)創(chuàng)造這項(xiàng)熄求。

數(shù)組的遍歷:

for (var i=0;i<arr.length; i++){
    arr[i];
}

數(shù)組的不停寫入渣玲,可用while循環(huán)(數(shù)組自增):

var arr = [];
while( ){
    arr[arr.length]=
}

判斷是不是數(shù)組

數(shù)組用typeof 檢測(cè)結(jié)果是object,可用 Array.isArray( ); 方法檢測(cè)弟晚。

數(shù)組相關(guān)遍歷算法題

  1. 求數(shù)組中每一項(xiàng)的總和忘衍、平均數(shù)。
  2. 求數(shù)組項(xiàng)的最大值和最小值卿城。

數(shù)組的頭尾操作方法

方法 功能
push( ) 在尾部插入新項(xiàng)
pop( ) 在尾部刪除
unshift( ) 在頭部插入
shift( ) 在頭部刪除

push( ) 方法:推入新項(xiàng)枚钓,如果要推入多項(xiàng),用逗號(hào)隔開瑟押。
pop( ) 方法:刪除數(shù)組中的最后一項(xiàng)搀捷,該方法會(huì)返回被刪除的項(xiàng),可用一個(gè)變量接收多望。
unshift與shift特性與push嫩舟、pop相似。以上方法均會(huì)改變?cè)瓟?shù)組

數(shù)組的其他方法

會(huì)改變數(shù)組的:

方法(會(huì)改變?cè)瓟?shù)組) 功能
reverse 逆轉(zhuǎn)排序
splice 切割
sort 改序

reverse( ) 方法
用于將數(shù)組中的全部項(xiàng)順序置反怀偷。

splice( ) 方法
用于替換數(shù)組中的指定項(xiàng)家厌。用法:

arr.splice(從下標(biāo)為n的項(xiàng)開始 , 替換多少項(xiàng) , 替換的新項(xiàng)可多項(xiàng));

當(dāng)?shù)诙€(gè)參數(shù)為0時(shí)椎工,就會(huì)變?yōu)椴迦牍δ堋?br> 當(dāng)?shù)谌齻€(gè)參數(shù)不寫時(shí)饭于,就會(huì)變?yōu)閯h除功能。
該方法會(huì)返回被刪除的項(xiàng)組成的數(shù)組维蒙。

sort( ) 方法
arr.sort( );
sort開放了接口掰吕,可傳入一個(gè)函數(shù) arr.sort(function(){ });

  1. 必須寫兩形參! arr.sort(function(a,b){ });
  2. 看返回值
    1)返回值為正時(shí)颅痊,后面的數(shù)放前邊殖熟。
    2)返回值為負(fù)時(shí),前面的數(shù)放前邊斑响。
    3)返回值為0時(shí)吗讶,不做操作。
    自己總結(jié)就是恋捆,正數(shù)交換位置照皆,負(fù)數(shù)不換(正交負(fù)不換),所以:
arr.sort(function(a,b){return a-b;})            //升序
arr.sort(function(a,b){return b-a;})            //降序
arr.sort(function(a,b){return Math.random()-0.5;})          //亂序

不改變數(shù)組的方法:

方法(不改變?cè)瓟?shù)組) 作用
slice( ) 截取數(shù)組
concat( ) 連接多個(gè)數(shù)組

數(shù)組的slice方法:
不會(huì)改變?cè)瓟?shù)組沸停,用于得到子數(shù)組膜毁。
slice(a,b) 截取從下標(biāo)為a開始,到下標(biāo)為b(不包括b)結(jié)束。
如果不傳第二個(gè)參數(shù)瘟滨。就會(huì)截取從a開始的后面所有項(xiàng)候醒。參數(shù)允許為負(fù)數(shù)。
數(shù)組的concat方法: 合并連接多個(gè)數(shù)組杂瘸,不改變?cè)瓟?shù)組倒淫。

數(shù)組與字符串間轉(zhuǎn)換的方法,以及更多通性

數(shù)組轉(zhuǎn)字符串: join( )方法败玉,將數(shù)組改變?yōu)樽址愋筒⒁詤?shù)作為連接符輸出敌土,不傳參數(shù)默認(rèn)逗號(hào)。傳遞的參數(shù)要用引號(hào)括起來运翼。
字符串轉(zhuǎn)數(shù)組: split( )方法返干,以什么字符拆分字符串,參數(shù)為空時(shí)將拆為一個(gè)字符串血淌。
更多相關(guān)性:

  1. 可以使用方括號(hào)寫下標(biāo)的形式訪問某個(gè)字符矩欠,等價(jià)于charAt( )方法。
  2. 字符串的一些算法問題可以改為數(shù)組解決悠夯。

indexOf( ) 和 includes( )

indexOf( ) 方法:搜索數(shù)組中的元素并返回下標(biāo)數(shù)癌淮,如果不存在返回-1。
includes( ) 方法:判斷數(shù)組是否包含一個(gè)元素沦补,返回布爾值乳蓄。

數(shù)組經(jīng)典算法題

冒泡排序:

for(var i=1; i<=arr.length-1;i++){
    for(var j=0; j<arr.length-i; j++){
        // j多功能擔(dān)任遍歷數(shù)組的下標(biāo)
        if (arr[j]>arr[j+1]) {
//因?yàn)閖是訪問不到最后一位的,j<arr.length-i策彤,j最大只能到每一趟的倒數(shù)第二位栓袖。但是因?yàn)樵趇f里面比較的是[j+1]位匣摘,所以第一輪剛好能訪問到最后一位
            var temp = arr[j];
            arr[j] = arr[j+1];
            arr[j+1] = temp;
        }
}

數(shù)組去重:
思路:準(zhǔn)備一個(gè)空數(shù)組店诗,遍歷原數(shù)組,如果遍歷到的項(xiàng)新數(shù)組里沒有(用indexOf判斷或includes判斷音榜,后者是ES6)庞瘸,則push進(jìn)去。

function unique(arr){
    var newArr = [];
    for(var i=0;i<arr.length;i++){
        if(newArr.indexOf(arr[i])===-1){
            newArr.push(arr[i]);
        }
    }
    return newArr;
}

隨機(jī)樣本:
思路:準(zhǔn)備一個(gè)空數(shù)組赠叼,遍歷原數(shù)組擦囊,隨機(jī)選擇一項(xiàng),推入新數(shù)組嘴办,并刪除這項(xiàng)瞬场。

二維數(shù)組

  • 數(shù)組里的項(xiàng)是數(shù)組時(shí),就形成了二維數(shù)組
  • 二維數(shù)組可以看作是矩陣涧郊。書寫上最好寫成矩陣贯被。
  • 遍歷二維數(shù)組需要2層循環(huán),n維數(shù)組則需要n層。

數(shù)組高階函數(shù)map() reduce() filter()

map方法接收一個(gè)函數(shù)作為參數(shù)彤灶,這個(gè)函數(shù)會(huì)接收三個(gè)參數(shù):參數(shù)一是這個(gè)數(shù)組里的每一項(xiàng)看幼,參數(shù)二是每一項(xiàng)的下標(biāo)索引值,參數(shù)三是調(diào)用map方法的這個(gè)數(shù)組本身幌陕,return的是指定的值進(jìn)一個(gè)新的數(shù)組诵姜。最后map方法返回這個(gè)新的數(shù)組

var arr = [{name:'ming',age:18},{name:'he77',age:20},{name:'qi',age:24}]
var newArr = arr.map(function(item,index,arrSelf){
    console.log(item,index,arrSelf)
    return item.age
})
console.log(newArr)     //[18,20,24]

reduce方法接收一個(gè)函數(shù)作為參數(shù)以及一個(gè)“開始計(jì)算的初始值”,這個(gè)函數(shù)會(huì)接收兩個(gè)參數(shù):參數(shù)一是上一次return的結(jié)果搏熄,參數(shù)二是這一次參與計(jì)算的數(shù)據(jù)棚唆。不斷的計(jì)算最后return一個(gè)值。最后reduce方法返回這個(gè)值

var arr = [{name:'ming',age:18},{name:'he77',age:20},{name:'qi',age:24}]
var newValue = arr.reduce(function(previous,joining){
    console.log(previous,joining)
    return previous+joining.age
},0)
console.log(newValue)   //62

filter方法接收一個(gè)函數(shù)作為參數(shù)搬卒,這個(gè)函數(shù)的參數(shù)會(huì)接受一個(gè)參數(shù)瑟俭,參數(shù)一是這個(gè)數(shù)組的每一項(xiàng),return符合判斷為true的數(shù)據(jù)進(jìn)一個(gè)新數(shù)組契邀,最后filter方法返回這個(gè)新數(shù)組摆寄。

var arr = [{name:'ming',age:18},{name:'he77',age:20},{name:'qi',age:24}]
var  newArr = arr.filter((item)=>{return item.name.includes('i')})
console.log(newArr)     //[{name:'ming',age:18},{name:'qi',age:24}]

引用類型和基本類型

基本類型:number、string坯门、boolean微饥、undefined、null
引用類型:array古戴、object欠橘、function、regexp...

相等判斷:

  • 基本類型進(jìn)行相等判斷现恼,會(huì)比較 值 是否相等肃续。
  • 引用類型進(jìn)行相等判斷,會(huì)比較 址 是否相等叉袍。

所以淺克隆中如果克隆到數(shù)組始锚,并不完全克隆,這個(gè)時(shí)候就需要深克隆喳逛。

函數(shù)

函數(shù)就是語句的封裝瞧捌,方便復(fù)用,具有“一次定義润文,多次調(diào)用”的優(yōu)點(diǎn)姐呐。

函數(shù)的定義

使用function關(guān)鍵字,function是功能的意思典蝌。例如:

function fun( ){

}

function表示定義函數(shù)曙砂。
fun 是函數(shù)名,命名規(guī)則見js標(biāo)識(shí)符命名規(guī)則骏掀。
圓括號(hào)()是形參列表鸠澈,即使沒有形參乔夯,也必須書寫圓括號(hào)。
大括號(hào){ }是函數(shù)執(zhí)行的語句體

第二種定義函數(shù)方法是使用函數(shù)表達(dá)式:

var fun = function(){ }

調(diào)用函數(shù)

在函數(shù)名字后面書寫圓括號(hào)即可款侵,也可以稱為函數(shù)執(zhí)行符末荐。。

函數(shù)聲明提升

只有函數(shù)聲明能提升新锈,函數(shù)表達(dá)式不提升甲脏。提升相關(guān)詳情見GO、AO預(yù)編譯妹笆。
例題

fun();
var fun = function(){alert('a');}
function fun(){alert('b');}
fun();
//執(zhí)行這段程序块请,會(huì)先彈出b,然后彈出a拳缠。
//所以函數(shù)只是聲明提升墩新,預(yù)編譯后不再參與變量賦值。

函數(shù)的參數(shù)

函數(shù)聲明時(shí)圓括號(hào)內(nèi)定義形參(形式參數(shù))
調(diào)用函數(shù)時(shí)傳入實(shí)參(實(shí)際參數(shù))

  • 形參數(shù)量 = 實(shí)參數(shù)量 時(shí):一一對(duì)應(yīng)窟坐。
  • 形參數(shù)量 < 實(shí)參數(shù)量 時(shí):多出的實(shí)參不傳入函數(shù)海渊,但arguments仍可讀到。
  • 形參數(shù)量 > 實(shí)參數(shù)量 時(shí):多出的形參值為undefined哲鸳。

arguments

函數(shù)內(nèi)的 arguments 表示它接收到的實(shí)參列表臣疑,他是一個(gè)類數(shù)組對(duì)象。

類數(shù)組對(duì)象:
是對(duì)象徙菠,可以當(dāng)數(shù)組用讯沈。
和數(shù)組類似可以用方括號(hào)訪問對(duì)象的屬性值,但不能調(diào)用數(shù)組的方法婿奔,可以自己寫入模擬數(shù)組方法缺狠。

構(gòu)成要素:
①屬性要為索引(數(shù)字)屬性
②必須要有l(wèi)ength屬性

return 函數(shù)的返回值

使用return關(guān)鍵字。
調(diào)用一個(gè)有返回值的函數(shù)萍摊,可以當(dāng)一個(gè)普通值來用挤茄。
遇見return語句會(huì)立即退出函數(shù)。(結(jié)合if語句记餐,往往不需要寫else分支了)
return后不接內(nèi)容則函數(shù)返回undefined驮樊,接內(nèi)容則函數(shù)返回內(nèi)容薇正。

函數(shù)算法題

尋找喇叭花數(shù)(喇叭花數(shù):三位數(shù)片酝,每一位數(shù)字階乘的和等于他本身)

函數(shù)的遞歸

函數(shù)內(nèi)部語句調(diào)用這個(gè)函數(shù)自身挖腰,從而發(fā)起函數(shù)新一輪迭代猴仑,在新的迭代中又執(zhí)行調(diào)用函數(shù)自身的語句审轮,一直迭代下去疾渣,知道函數(shù)執(zhí)行到某一次時(shí)不在迭代篡诽,然后一層一層返回,則形成函數(shù)遞歸达椰。

遞歸的要素

  1. 邊界條件:確定遞歸何時(shí)終止,也稱遞歸出口蝇裤。
    ①要么找到當(dāng)參數(shù)等于某個(gè)值時(shí)候函數(shù)有結(jié)果
    ②要么函數(shù)執(zhí)行次數(shù)有限,當(dāng)循環(huán)到某一次的時(shí)候不再調(diào)用函數(shù)自身拗秘。
  2. 遞歸模式:大問題分小問題,遞歸體。

遞歸常見算法題

斐波那契數(shù)列:每項(xiàng)等于前兩項(xiàng)的和辉阶。

function fibonacci(n){
    if(n==0) return 0;
    else if(n==1) return 1;
    return fibonacci(n-1)+fibonacci(n-2);
}

實(shí)現(xiàn)深度克隆數(shù)組:

function arrClone(arr){
    var newArr=[];
    for(var i=0;i<arr.length;i++){
        if(!Array.isArray(arr[i])) newArr[newArr.length]=arr[i];
        else newArr[newArr.length] = arrClone(arr[i]);
    }
    return newArr;
}

變量作用域

JavaScript是函數(shù)及作用域編程語言:變量只在其定義時(shí)所在的 function 內(nèi)部有效,function 內(nèi)的變量成為 function 的局部變量规辱。
不見變量定義在任何函數(shù)里面改淑,這個(gè)變量就是全局變量朵夏,或者 function 內(nèi)不聲明變量直接賦值也是全局變量。
遮蔽效應(yīng): 如果函數(shù)中也定義了與全局變量同名的變量,則函數(shù)內(nèi)的變量會(huì)將全局變量“遮蔽”爆捞。

js運(yùn)行三部曲

  1. 語法解析
  2. 預(yù)編譯
  3. 解釋執(zhí)行

會(huì)發(fā)生以下幾種情況:
函數(shù)聲明整體提升
變量聲明提升
imply global 暗示全局變量,window就是全局

預(yù)編譯發(fā)生在函數(shù)執(zhí)行前一刻成肘。
全局預(yù)編譯創(chuàng)建GO對(duì)象。
局部預(yù)編譯先創(chuàng)建AO對(duì)象,再逐步執(zhí)行(部分執(zhí)行)丘逸。

全局預(yù)編譯三部曲

  1. 生成GO對(duì)象。
  2. 找變量聲明,將變量名作為GO屬性名涛舍,值為undefined。
  3. 在函數(shù)體里面找函數(shù)聲明。

局部預(yù)編譯四部曲

  1. 生成AO對(duì)象(activation object)
    AO{ }
  2. 找形參和變量聲明蛤奢,將變量和形參名作為AO屬性名,值為undefined。
AO{
    a: undefined;
    b: undefined
}
  1. 將實(shí)參值與形參統(tǒng)一志衍。
AO{
    a: 1;
    b: undefined
}
  1. 再函數(shù)體里找函數(shù)聲明。
AO{
    a: function a(){ };
    b: undefined;
    d: function d(){ }
}

閉包

JavaScript的函數(shù)會(huì)產(chǎn)生閉包(closure)。閉包是函數(shù)本身和該函數(shù)聲明時(shí)所處的環(huán)境狀態(tài)的組合央星。
函數(shù)能夠“記憶住”其定義時(shí)所處的環(huán)境,即使函數(shù)不在其定義的環(huán)境被調(diào)用,也能訪問定義時(shí)所處環(huán)境的變量叁幢。
在Javascript中鳞骤,每次創(chuàng)建函數(shù)時(shí)都會(huì)創(chuàng)建閉包。
但是,閉包特性往往需要將函數(shù)“換一個(gè)地方”執(zhí)行,才能被觀察出來录肯。
閉包非常實(shí)用,它允許我們將數(shù)據(jù)與操作該數(shù)據(jù)的函數(shù)關(guān)聯(lián)起來。
用途:

  1. 記憶性:當(dāng)閉包產(chǎn)生時(shí)养涮,函數(shù)所處環(huán)境的狀態(tài)會(huì)始終保持在內(nèi)存中蜀变,不會(huì)在外層函數(shù)調(diào)用后自動(dòng)清除爬舰。
  2. 模擬私有變量。

壞處:
濫用閉包會(huì)造成內(nèi)存泄漏,引發(fā)性能問題惜颇。

立即執(zhí)行函數(shù) IIFE

IIFE全稱:Immediately Invoked Function Expression芹橡,立即調(diào)用函數(shù)表達(dá)式屯伞,一被定義就立即被調(diào)用。

IIFE形成方法

只有表達(dá)式才能被執(zhí)行符號(hào)(圓括號(hào))執(zhí)行末融。

表達(dá)式:由運(yùn)算元和運(yùn)算符構(gòu)成懈玻,并產(chǎn)生運(yùn)算結(jié)果的語句結(jié)構(gòu)

能被執(zhí)行符號(hào)執(zhí)行的表達(dá)式會(huì)忽略這個(gè)函數(shù)的名字艺栈,所以立即執(zhí)行函數(shù)寫函數(shù)名會(huì)被忽略。

IIFE作用

  1. 為變量賦值,例如一個(gè)值需要經(jīng)過一段流程控制語句后才產(chǎn)生,那么就可以把這堆流程控制語句封裝成函數(shù)并立即執(zhí)行然后返回值场刑。
  2. 將全局變量變?yōu)榫植孔兞浚ㄗ孖IFE里面的函數(shù)立即形成一個(gè)新的閉包)。

DOM

DOM是 Document Object Model 文檔對(duì)下個(gè)模型,是Javascript操作HTML文檔的接口茅茂。

DOM 節(jié)點(diǎn)樹

節(jié)點(diǎn)的四個(gè)屬性

屬性名 作用
nodeName 元素的標(biāo)簽名走敌,以大寫形式表示跌榔,只讀
nodeValue Text節(jié)點(diǎn)或Comment節(jié)點(diǎn)的文本內(nèi)容,可讀可寫
nodeType 該節(jié)點(diǎn)類型,見下表
attributes Element節(jié)點(diǎn)的屬性集合

nodeType 常用屬性值

屬性
1 元素節(jié)點(diǎn),例如<p>和<div>
3 文字節(jié)點(diǎn)
8 注釋節(jié)點(diǎn)
9 document節(jié)點(diǎn)
10 DTD節(jié)點(diǎn)

延遲運(yùn)行

  • 在測(cè)試DOM代碼時(shí),通常JS代碼要寫在HTML節(jié)點(diǎn)后面,否則JS無法找到相應(yīng)HTML節(jié)點(diǎn)循榆。
  • 可以使用 window.onload = function(){ } 或者 document.addEventListener( 'DOMContentloaded',function(){ },false); 使頁面加載完畢后,在執(zhí)行指定的代碼柑船,推薦第二種

訪問元素節(jié)點(diǎn)

尋找/遍歷/訪問主要依靠document對(duì)象扣蜻。

幾乎所有DOM的功能都封裝在 document對(duì)象中蒸苇。
document 對(duì)象也表示整個(gè)HTML文檔庇勃,是DOM節(jié)點(diǎn)樹的根

常用方法有:

方法 功能
document.getElementById( ) 通過ID得到元素
document.getElementsByTagName( ) 通過標(biāo)簽名得到元素?cái)?shù)組
document.getElementsByClassName( ) 通過類名得到元素?cái)?shù)組
document.getElementsByName( ) 只有部分標(biāo)簽name可生效
document.querySelector( ) 通過選擇器得到元素
document.querySelectorAll( ) 通過選擇器得到元素?cái)?shù)組

document.getElementById( )

當(dāng)html元素有id屬性的時(shí)候掂铐,可以用id獲取該元素節(jié)點(diǎn)
注意事項(xiàng):

  1. 如果頁面上有相同id的元素爆班,則只能得到第一個(gè)雨涛。
  2. 不管元素藏得多深凉泄,都能通過id找到

getElementsByTagName( )

通過標(biāo)簽名得到節(jié)點(diǎn)數(shù)組。
注意事項(xiàng):

  1. 數(shù)組方便遍歷,從而可以批量操控元素節(jié)點(diǎn)怖竭。
  2. 即使頁面上只有一個(gè)指定標(biāo)簽名的節(jié)點(diǎn)登夫,也將得到長(zhǎng)度為1的數(shù)組鸦致。
  3. 任何一個(gè)節(jié)點(diǎn)元素可以調(diào)用getElementsByTagName方法狮斗,比如box1.getElementsByTagName( 'p');, 從而得到一個(gè)元素內(nèi)部的子元素節(jié)點(diǎn)。

getElementsByClassName( )

通過類名得到節(jié)點(diǎn)數(shù)組。
注意事項(xiàng):

  1. 從IE9開始兼容。
  2. 其他同上Tag特性

querySelector( )

通過選擇器得到元素。例如:
var the_p = document.querySelector('#box1 .p')
注意事項(xiàng):

  1. querySelector( )方法只能得到頁面上一個(gè)元素翼闹,如果有多個(gè)元素符合條件,只能得到第一個(gè)元素。
  2. querySelector( ) 方法從IE8開始兼容,但從IE9開始支持CSS3的選擇器,比如 :nth-child() 、:[src^='seven']等選擇器形式支持良好。(偽類不行)

querySelectorAll( )

通過選擇器得到元素?cái)?shù)組樱报。計(jì)師頁面上只有一個(gè)符合選擇器的節(jié)點(diǎn)民珍,也將得到長(zhǎng)度為1的數(shù)組

querySelector和querySelectorAll注意事項(xiàng): 都不是實(shí)時(shí)的逆趣,例如節(jié)點(diǎn)是后期加上的會(huì)獲取不到。

節(jié)點(diǎn)關(guān)系,節(jié)點(diǎn)之間的關(guān)系

關(guān)系 考慮所有節(jié)點(diǎn) 只考慮元素節(jié)點(diǎn)
子節(jié)點(diǎn) childNodes children
父節(jié)點(diǎn) parentNode parentElement
第一個(gè)子節(jié)點(diǎn) firstChild firstElementChild
最后一個(gè)子節(jié)點(diǎn) lastChild lastElementChild
前一個(gè)兄弟節(jié)點(diǎn) previousSibling previousElementSibling
后一個(gè)兄弟節(jié)點(diǎn) nextSibling nextElementSibling
  • DOM中每窖,文本節(jié)點(diǎn)也屬于節(jié)點(diǎn)稽莉,在使用節(jié)點(diǎn)關(guān)系時(shí)一定要注意。
  • 在W3C標(biāo)準(zhǔn)規(guī)范中,空白文本節(jié)點(diǎn)也屬于節(jié)點(diǎn),IE8之前不把空文本當(dāng)作節(jié)點(diǎn)予弧。
  • 可以用 父節(jié)點(diǎn).hasChildNodes( ); 判斷有沒有子節(jié)點(diǎn)

封裝節(jié)點(diǎn)關(guān)系函數(shù)

//兼容IE8以下的獲取所有子元素節(jié)點(diǎn)函數(shù)刮吧,類似children屬性
function getChildren(node){
    var children = [];
    for(var i=0; i<node.childNodes.length; i++){
        if(node.childNodes[i].nodeType == 1){
            children.push(node.childNodes[i]);
        }
    }
    return children;
}
//兼容IE8以下獲取前一個(gè)兄弟元素節(jié)點(diǎn)
function getPreviousElementSibling(node){
    while(node.previousSibling != null){
        if (node.previousSibling.nodeType == 1) {
            return node.previousSibling;
        }
        node = node.previousSibling;
    }
}

//兼容IE8以下獲取后一個(gè)兄弟元素節(jié)點(diǎn)
function getNextElementSibling(node){
    while(node.nextSibling != null){
        if (node.nextSibling.nodeType == 1) {
            return node.nextSibling;
        }
        node=node.nextSibling;
    }
}
//獲取所有兄弟元素節(jié)點(diǎn)
function getAllElementSibling(node){
    var o =node;
    var preES = [];
    var nexES = [];
    while(o.previousSibling != null){
        if (o.previousSibling.nodeType == 1) {
            preES.unshift(o.previousSibling);
        }
        o = o.previousSibling;
    }
    o = node;
    while(o.nextSibling != null){
        if (o.nextSibling.nodeType == 1) {
            nexES.push(o.nextSibling);
        }
        o = o.nextSibling;
    }
    return preES.concat(nexES);
}

節(jié)點(diǎn)操作

改變?cè)毓?jié)點(diǎn)中的內(nèi)容可以使用兩個(gè)相關(guān)屬性:

    1. innerHTML :能以HTML語法設(shè)置節(jié)點(diǎn)中的內(nèi)容結(jié)構(gòu)。
    1. innerText : 只能以純文本的形式設(shè)置節(jié)點(diǎn)中的內(nèi)容掖蛤。寫進(jìn)去的標(biāo)簽也會(huì)變成字符串。

改變?cè)毓?jié)點(diǎn)的CSS樣式

用 元素.style.要修改的屬性 = ***;的形式蚓庭,例如:

div1.style.backgroundColor = 'blue';
div1.style.backgroundImage = 'url(images/1.jpg)';
div1.style.fontSize = '32px';

注意:

  1. js語句不能用橫杠-書寫標(biāo)識(shí)符致讥,所以用小駝峰形式書寫css屬性名。
  2. css屬性值要設(shè)置成完整形式器赞。
  3. 注意寫單位垢袱,注意寫單位,注意寫單位港柜。
  4. 是通過CSS行內(nèi)屬性設(shè)置上的请契。
  5. 寫入值必須是字符串,必須是字符串夏醉,必須是字符串爽锥。

腳本化CSS

以上操作稱為腳本化CSS,讀寫行間樣式授舟,如果是js保留字救恨,前面應(yīng)該加css,例如:cssFloat
如何查詢計(jì)算樣式释树,可以使用:

window.getComputedStyle(元素名,null);
//第一個(gè)值傳的是需要獲取計(jì)算樣式的元素肠槽,第二個(gè)值傳入是否獲取的是偽元素擎淤。
//IE8以下用ELE.currentStyle,或者封裝計(jì)算樣式方法
function getStyle(obj, name) {
    if(window.getComputedStyle) {
        //正常瀏覽器的方式秸仙,具有g(shù)etComputedStyle()方法
        return getComputedStyle(obj, null)[name];
    } else {
        //IE8的方式嘴拢,沒有g(shù)etComputedStyle()方法
        return obj.currentStyle[name];
    }
}

改變?cè)氐腸ss還可以用改變類名的寫法

使用 DOMCUMENT.className += 需要樣式的類型
或者使用dom的 classList 屬性,classList是一個(gè)類數(shù)組寂纪,可以通過下標(biāo)方式取得元素的class組席吴,該屬性有多種方法

方法名 功能
DOMCUMENT.classList.add(class1,class2) 在元素中添加一個(gè)或多個(gè)類名。如果指定的類名已存在捞蛋,則不會(huì)添加
DOMCUMENT.classList.remove(class1, class2, ...) 移除元素中一個(gè)或多個(gè)類名孝冒。注意: 移除不存在的類名,不會(huì)報(bào)錯(cuò)拟杉。
DOMCUMENT.classList.toggle(class,布爾值) 在元素中切換類名庄涡。第一個(gè)參數(shù)為要在元素中移除的類名,并返回 false搬设。 如果該類名不存在則會(huì)在元素中添加類名穴店,并返回 true。 第二個(gè)是可選參數(shù)拿穴,是個(gè)布爾值用于設(shè)置元素是否強(qiáng)制添加或移除類泣洞,不管該類名是否存在。
DOMCUMENT.classList.item(index) 返回元素中索引值對(duì)應(yīng)的類名默色。索引值從 0 開始球凰。如果索引值在區(qū)間范圍外則返回 null
DOMCUMENT.classList.contains(class) 返回布爾值,判斷指定的類名是否存在该窗〉苁矗可能值:true - 元素包已經(jīng)包含了該類名false - 元素中不存在該類名

改變?cè)毓?jié)點(diǎn)的引用地址

比如圖片的引用地址和a標(biāo)簽的跳轉(zhuǎn)地址用 元素.src 和 元素.href

更改元素節(jié)點(diǎn)的HTML屬性 setAttribute( ) 和 getAttribute( )

不符合W3C標(biāo)準(zhǔn)的屬性,例如自定義屬性名的屬性酗失,要使用 setAttribute( ) 和 getAttribute( ) 來設(shè)置,讀取昧绣。格式是:

元素.setAttribute(屬性名,屬性值);
元素.getAttribute(屬性名);           //返回屬性名對(duì)應(yīng)的值

例如:

div1.setAttribute('data-n',10);
div1.getAttribute('data-n');

setAttribute() 修改元素的類名用的是 class 而不是 className

removeAttribute() 刪除元素節(jié)點(diǎn)的HTML屬性

removeAttribute('屬性名')

更改元素節(jié)點(diǎn)的自定義屬性data

JavaScript的dataset屬性规肴。

元素節(jié)點(diǎn).dataset.data后面的字符 = 'data-*的值';

如果后面的字符還是多個(gè)減號(hào)連接,那么data后面的字符用小駝峰式命名法夜畴。

節(jié)點(diǎn)的創(chuàng)建拖刃、插入、移動(dòng)贪绘、移除兑牡、克隆

方法名 功能
document.createElement( ) 創(chuàng)建一個(gè)指定tag name的HTML元素
父節(jié)點(diǎn).appendChild(孤兒節(jié)點(diǎn)) 將新創(chuàng)節(jié)點(diǎn)掛載成最后一個(gè)子節(jié)點(diǎn)
父節(jié)點(diǎn).insertBefore(孤兒節(jié)點(diǎn),標(biāo)桿節(jié)點(diǎn) ) 將新創(chuàng)節(jié)點(diǎn)掛載成標(biāo)桿節(jié)點(diǎn)前一個(gè)子節(jié)點(diǎn)
父節(jié)點(diǎn).removeChild( ) 從DOM父節(jié)點(diǎn)中刪除一個(gè)子節(jié)點(diǎn)
子節(jié)點(diǎn).remove( ) 從DOM中刪除一個(gè)子節(jié)點(diǎn)
老節(jié)點(diǎn).cloneNode( ) 克隆出一個(gè)新的孤兒節(jié)點(diǎn)
節(jié)點(diǎn).replaceChild(新節(jié)點(diǎn),舊節(jié)點(diǎn)) 替換節(jié)點(diǎn)

節(jié)點(diǎn)創(chuàng)建

document.createElement( ) 方法用于創(chuàng)建一個(gè)指定標(biāo)簽名的HTML元素税灌,例如:

var div1 = document.createElement('div');

此時(shí)新創(chuàng)建的節(jié)點(diǎn)是“孤兒節(jié)點(diǎn)”均函,只生成在內(nèi)存中亿虽,需要掛在到DOM樹上才能看見他,也就是要“孤兒上樹”苞也,此時(shí)就需要使用孤兒上樹的兩個(gè)插入方法洛勉。

其他節(jié)點(diǎn)創(chuàng)建方法
方法名 作用
document.createTextNode( ) 創(chuàng)建一個(gè)文本節(jié)點(diǎn)
document.createComment( ) 創(chuàng)建一個(gè)注釋節(jié)點(diǎn)
document.createDocumentFragment( )
創(chuàng)建一個(gè)虛擬的節(jié)點(diǎn)對(duì)象

節(jié)點(diǎn)插入

孤兒就是孤兒,要掛數(shù)只能找父親如迟,然后讓一個(gè)野生父親使用 appendChild( )insertBefore( ) 方法即可收毫。

appendChild( )

任何已經(jīng)在DOM樹上的節(jié)點(diǎn),都可以調(diào)用appendChild( ) 方法殷勘,它可以將孤兒節(jié)點(diǎn)掛載到它的內(nèi)部此再,使孤兒節(jié)點(diǎn)成為最后一個(gè)子節(jié)點(diǎn)。

父節(jié)點(diǎn).appendChild(孤兒節(jié)點(diǎn));
insertBefore( )

任何已經(jīng)在DOM樹上的節(jié)點(diǎn)玲销,都可以調(diào)用insertBefore( ) 方法引润,它可以將孤兒節(jié)點(diǎn)掛載到它的內(nèi)部,成為它的“標(biāo)桿子節(jié)點(diǎn)”之前的節(jié)點(diǎn)痒玩。

父節(jié)點(diǎn).insertBefore(孤兒節(jié)點(diǎn),標(biāo)桿節(jié)點(diǎn));

創(chuàng)建和插入練習(xí):九九乘法表

<body>
    <table></table>
    
    <script type="text/javascript">
        var table = document.getElementsByTagName('table')[0];
        
        for (var i = 1;i<=9;i++) {
            var tbr = document.createElement('tr');
            table.appendChild(tbr);
            
            for (var j=1;j<=i;j++) {
                var trd = document.createElement('td');
                trd.innerText = i+'*'+j+'='+i*j;
                tbr.appendChild(trd);
            }
            
        }
    </script>
</body>
元素的移動(dòng)

appendChild( ) 和 insertBefore( ) 還可以用作元素的移動(dòng)淳附,因?yàn)?一個(gè)節(jié)點(diǎn)不能同時(shí)位于DOM樹的兩個(gè)位置
如果將已經(jīng)掛載到DOM樹上的節(jié)點(diǎn)成為appendChild( ) 和insertBefore( ) 的參數(shù),這個(gè)節(jié)點(diǎn)將會(huì)被移動(dòng)蠢古,使用方法:

新父節(jié)點(diǎn).appendChild(已經(jīng)有父親的節(jié)點(diǎn));
新父節(jié)點(diǎn).insertBefore(已經(jīng)有父親的節(jié)點(diǎn)奴曙,標(biāo)桿子節(jié)點(diǎn));

刪除節(jié)點(diǎn)

父節(jié)點(diǎn).removeChild(要?jiǎng)h除的子節(jié)點(diǎn));
子節(jié)點(diǎn).remove(要?jiǎng)h除的節(jié)點(diǎn));

removeChild( ) 方法從DOM中刪除一個(gè)子節(jié)點(diǎn)。
意味著節(jié)點(diǎn)不能主動(dòng)刪除自己草讶,必須由父節(jié)點(diǎn)刪除它洽糟。

克隆節(jié)點(diǎn)

var 孤兒節(jié)點(diǎn) = 老節(jié)點(diǎn).cloneNode( );
var 孤兒節(jié)點(diǎn) = 老節(jié)點(diǎn).cloneNode(true);

cloneNode( ) 方法可以克隆節(jié)點(diǎn),克隆出的節(jié)點(diǎn)是孤兒節(jié)點(diǎn)堕战。
參數(shù)可以傳入一個(gè)布爾值坤溃,默認(rèn)false,false意味著只克隆元素本身不管子節(jié)點(diǎn)嘱丢。
如果是true則采用深度克隆薪介,該節(jié)點(diǎn)的所有后代節(jié)點(diǎn)也都會(huì)被克隆。

替換節(jié)點(diǎn)

替換父節(jié)點(diǎn)中的子節(jié)點(diǎn)越驻。用法:

父節(jié)點(diǎn).replaceChild(新的子節(jié)點(diǎn),舊的子節(jié)點(diǎn))

此方法如果用在已經(jīng)上樹的節(jié)點(diǎn)上汁政,會(huì)拉下來重新上樹,還是那個(gè)道理缀旁,一個(gè)dom節(jié)點(diǎn)不能位于樹上兩個(gè)位置

事件

事件是實(shí)現(xiàn)交互的核心记劈。用戶與界面做出的交互動(dòng)作都可以稱為事件。例如“當(dāng)用戶點(diǎn)擊元素時(shí)并巍,當(dāng)鼠標(biāo)移動(dòng)到元素上時(shí)目木,當(dāng)文本框內(nèi)容被改變時(shí),當(dāng)網(wǎng)頁已加載完畢時(shí)懊渡」羯洌”

事件的三種模型

DOM0級(jí):標(biāo)簽上直接綁定的onXXX事件和js用onXXX綁定的事件
IE:IE特有模型军拟,解決了某三個(gè)DOM0級(jí)的問題。
DOM2事件模型:addEventListener方式添加事件柄冲,可以監(jiān)聽事件冒泡和捕獲階段階段

常見事件

常見的鼠標(biāo)事件

事件名 事件描述
click 鼠標(biāo)單擊
dblclick 鼠標(biāo)雙擊
mousedown 鼠標(biāo)按鍵按下
mouseup 鼠標(biāo)按鍵松開
mousemove 鼠標(biāo)按鍵移動(dòng)
mouseenter吻谋、mouseover 鼠標(biāo)進(jìn)入
mouseleave、mouseout 鼠標(biāo)離開
contextmenu 右擊鼠標(biāo)時(shí)觸發(fā)并打開上下文菜單
mousewheel 鼠標(biāo)滾輪

只有mouseup和mousedown區(qū)分鼠標(biāo)鍵现横,button值0漓拾、1、2
如何解決mousedown和click沖突(例如a標(biāo)簽拖拽后會(huì)出發(fā)click事件):
利用時(shí)間戳和開關(guān)關(guān)閉click事件
mouseenter不冒泡戒祠,mouseover冒泡

常見的鍵盤事件

事件名 事件描述
keydown 鍵盤的鍵被按下(可響應(yīng)所有按鍵骇两,先于press執(zhí)行)
keypress 鍵盤的鍵被按下,只能識(shí)別字符按鍵姜盈,例如方向鍵和功能鍵無法識(shí)別
keyup 當(dāng)某個(gè)按鍵被松開

keypress返回的ASCII碼(例charCode)可轉(zhuǎn)字符

常見的表單事件

事件名 事件描述
input 當(dāng)用戶改變域的內(nèi)容
change 當(dāng)用戶改變了域的內(nèi)容后
focus 當(dāng)某元素獲得焦點(diǎn)(比如tab鍵跳轉(zhuǎn)到或鼠標(biāo)點(diǎn)擊)
blur 當(dāng)某元素失去焦點(diǎn)
submit 當(dāng)表單被提交
reset 當(dāng)表單被重置

常見的頁面(窗體)事件監(jiān)聽

事件名 事件描述
load 當(dāng)頁面或圖像完全加載
unload 當(dāng)用戶退出頁面
scroll 滾動(dòng)滾動(dòng)條
resize 窗體大小改變時(shí)

事件監(jiān)聽

DOM允許我們書寫JavaScript代碼以讓HTML元素對(duì)事件做出反應(yīng)低千。
“監(jiān)聽”就是讓計(jì)算機(jī)隨時(shí)能夠發(fā)現(xiàn)這個(gè)事件發(fā)生了,從而執(zhí)行一些預(yù)先編寫的語句馏颂。主要有兩種方法示血。

  1. 元素.onXXX = function(){}
  2. 元素.addEventListener('',function(){},BOOLEAN);

兩種監(jiān)聽區(qū)別

  1. onXXX只能監(jiān)聽冒泡階段,addEventListener可以開啟捕獲階段救拉。
  2. onXXX只能綁定一個(gè)函數(shù)难审,后寫的會(huì)覆蓋。addEventListener可多次復(fù)寫亿絮。

事件監(jiān)聽解除

  1. 元素.onXXX = null;
  2. 元素.removeEventListener('事件類型',函數(shù),false);
  3. IE獨(dú)有:元素.detachEvent('onXXX',函數(shù));

事件傳播

當(dāng)元素形成嵌套結(jié)構(gòu)時(shí)告喊,事件就會(huì)發(fā)生傳播,傳播分為:

  1. 事件捕獲:結(jié)構(gòu)上的父子元素派昧,開啟捕獲后黔姜,事件執(zhí)行從父元素捕獲到子元素。
  2. 事件冒泡:結(jié)構(gòu)上的父子元素關(guān)系蒂萎,時(shí)間會(huì)從子元素冒泡到父元素秆吵。
  • onXXX監(jiān)聽方法只能監(jiān)聽到冒泡階段
  • addEventListener第三個(gè)參數(shù)為true時(shí)會(huì)開啟捕獲監(jiān)聽。
  • 嵌套結(jié)構(gòu)的最內(nèi)部元素不再區(qū)分捕獲和冒泡岖是,冒泡寫在前面先執(zhí)行冒泡帮毁,捕獲寫在前面先執(zhí)行捕獲。
  • 冒泡階段的onXXX和addEventListener誰先寫先執(zhí)行哪個(gè)函數(shù)豺撑。

阻止事件傳播: event.stopPropagation( ); 方法,或者ie678的event.cancelBubble=true;

事件對(duì)象

事件處理函數(shù)提供一個(gè)形式參數(shù)黔牵,他是一個(gè)對(duì)象聪轿,封裝了本次事件的細(xì)節(jié)。這個(gè)形參通常用字母e或單詞event表示:例如

div.onclick = function(e){ }
div.addEventListener('click',function(event){},false);

誰是實(shí)參呢猾浦,實(shí)參由瀏覽器提供陆错,當(dāng)事件觸發(fā)時(shí)灯抛,瀏覽器會(huì)打包所有事件對(duì)象傳入事件處理函數(shù)形參中。
實(shí)際上并不用形參實(shí)參的說法音瓷,實(shí)測(cè)有一個(gè)event對(duì)象就是事件對(duì)象对嚼。

鼠標(biāo)位置屬性

屬性名 屬性描述
offsetX、offsetY 鼠標(biāo)指針相對(duì)于事件源元素的X軸绳慎、Y軸坐標(biāo)
clientX纵竖、clientY 鼠標(biāo)指針相對(duì)于瀏覽器視口的X軸、Y軸坐標(biāo)
pageX杏愤、pageY 鼠標(biāo)指針相對(duì)于整張網(wǎng)頁的X軸靡砌、Y軸坐標(biāo)
screenX、screenY 鼠標(biāo)指針相對(duì)于電腦屏幕的X軸珊楼、Y軸坐標(biāo)

鍵盤charCode屬性和keyCode屬性

e.charCode屬性通常用于onkeypress事件中通殃,表示用戶輸入的字符的ASCII碼。
e.keyCode屬性通常用于onkeydown事件和onkeyup中厕宗,表示用戶按下的按鍵的鍵碼画舌。

charcode字符碼
字符 字符碼
數(shù)字0~數(shù)字9 48~57
大寫字母A~Z 65~90
小寫字母a~z 97~122
keycode鍵碼
按鍵 鍵碼
數(shù)字0~數(shù)字9 48~57
字母不分大小a~z 65~90
四個(gè)方向左上右下 37、38已慢、39曲聂、40
回車鍵 13
空格鍵 32

元素offset系列屬性

  • 該系列屬性只讀,不可寫蛇受,且讀出來的數(shù)值是一個(gè)Number類型數(shù)值
  1. 可以得到元素的偏移位置句葵,返回不帶單位的數(shù)值。這個(gè)數(shù)值以開啟定位的父元素為準(zhǔn)兢仰。
    ELE.offsetTop
    ELE.offsetLeft
  2. 可以得到元素的寬度和高度乍丈,包含padding和border,即元素盒子的大小把将。
    ELE.offsetWidth
    ELE.offsetHeight
  3. 返回帶有定位的父親轻专,否則返回body

元素的client系列屬性

  1. clientWidth 和 clientHeight 得到元素盒子除了border以外的尺寸大小。
  2. clientLeft 和 clientTop 不常用察蹲,相當(dāng)于左邊框和上邊框的大小

元素的scroll系列屬性

  • scroll系列屬性要出現(xiàn)滾動(dòng)條才更好理解更好用
  1. scrollWidth 和 scrollHeight 得到元素盒子除了border外的所有內(nèi)容的尺寸大小请垛。
  2. scrollTop 和 scrollLeft 得到元素盒子被卷去的尺寸長(zhǎng)度。該屬性可用于“滑到底部才可以點(diǎn)擊確定”

獲取元素在頁面上的屬性

  1. 可以用window.getComputedStyle(元素名,null);
    //第一個(gè)值傳的是需要獲取計(jì)算樣式的元素洽议,第二個(gè)值傳入是否獲取的是偽元素
  2. 可以用 ELE.getBoundingClientRect()宗收,例如ELE.getBoundingClientRect().left

事件的方法

preventDefault() 方法 阻止默認(rèn)事件

e.preventDefault( ) 方法用來阻止事件產(chǎn)生的“默認(rèn)動(dòng)作”。
例如鼠標(biāo)滾動(dòng)的動(dòng)作亚兄,表單提交混稽,a標(biāo)簽跳轉(zhuǎn),右鍵菜單等。
一些特殊的業(yè)務(wù)需求匈勋,需要阻止事件的“默認(rèn)動(dòng)作”礼旅。
阻止默認(rèn)事件還可以用return false;

stopPropagation( ) 方法 阻止事件傳播

e.stopPropagation( ) 方法用來阻止事件繼續(xù)傳播
在一些場(chǎng)合,非常有必要切斷事件繼續(xù)傳播洽洁,否則會(huì)造成頁面特效顯示出bug

事件委托

把事件綁定到父元素上痘系,用 event.target 定位到子元素(利用了事件冒泡)
event.target 觸發(fā)此事件的最早元素,即“事件源元素”
event.currentTarget 事件處理程序附加到的元素

事件委托的使用場(chǎng)景:

  1. 當(dāng)有大量類似元素需要批量添加事件監(jiān)聽時(shí)饿自,使用事件委托可以減少內(nèi)存開銷汰翠。
  2. 當(dāng)由動(dòng)態(tài)元素節(jié)點(diǎn)上樹時(shí),使用事件委托可以讓新上樹的元素具有事件監(jiān)聽

注意事項(xiàng):

  1. 不能委托不冒泡的事件給祖先元素
  2. 最內(nèi)層元素不能再有額外的內(nèi)層元素了

移動(dòng)端事件

  • 觸摸事件:touch事件璃俗、pointer事件奴璃。
  • 手勢(shì)事件:gesture
  • 傳感器事件:sensor

移動(dòng)端使用 tansform:translate3d(); 會(huì)開啟GPU加速,提高性能城豁。

touch 事件:

touchstart苟穆、touchmove、touchend唱星、touchcancel(比如操作時(shí)突然來電話)
touchstart 必須要在綁定事件的元素觸發(fā)雳旅,觸發(fā)start后,touchmove 和 touchend 手指移除元素依然可觸發(fā)间聊。

touch 事件的 TouchEvent 對(duì)象

  • event.touches
  • event.targetTouches
  • event.changedTouches

這些對(duì)象都是一個(gè) Touchlist攒盈,單指操作只需提取一個(gè)即可,比如 event.changedTouches[0]

  • touches是正在觸摸屏幕的所有手指的列表哎榴。
  • targetTouches是正在觸摸當(dāng)前DOM元素的手指列表型豁。
  • 如果是綁在dom元素的事件以上兩個(gè)是一樣的
  • changedTouches是手指狀態(tài)發(fā)生了改變的列表,從無到有 或者 從有到無
    touches 和 targetTouches 很多情況下在 touchend 事件里沒有值尚蝌,所以推薦使用 changedTouches

其他觸摸事件

touch 只是基礎(chǔ)事件迎变,還有其他例如單擊,長(zhǎng)按飘言,雙指等事件衣形。
可以自行封裝這些高級(jí)事件,也可使用例如 hammer.js 等別人封裝好的事件庫(kù)姿鸿。

定時(shí)器和延時(shí)器

定時(shí)器

setInterval( ) 函數(shù)可以重復(fù)調(diào)用一個(gè)函數(shù)谆吴,在每次調(diào)用之間具有固定的時(shí)間間隔,寫法:

setInterval(function(){},1000) 

第一個(gè)參數(shù)是函數(shù)苛预,第二個(gè)參數(shù)是間隔時(shí)間句狼,函數(shù)里的語句塊將會(huì)在每過間隔時(shí)間后執(zhí)行一次。
setInterval函數(shù)可以接受第3热某、4鲜锚、5...個(gè)參數(shù)突诬,它們將按順序傳入函數(shù)苫拍,例如芜繁。

setInterval(function(a,b){
    
},1000,1,2)
//第三個(gè)參數(shù)開始,表示傳入函數(shù)內(nèi)的實(shí)參

清除定時(shí)器

clearInterval( ) 函數(shù)绒极,圓括號(hào)內(nèi)傳入要清除的定時(shí)器

延時(shí)器

setTimeout( ) 函數(shù)可以設(shè)置一個(gè)延時(shí)器骏令,當(dāng)指定時(shí)間到達(dá)后旨椒,會(huì)執(zhí)行函數(shù)一次棠赛,不再重復(fù)執(zhí)行,寫法:

setTimeout(function(){

},1000)

清除延時(shí)器

clearTimeout( ) 函數(shù)可以清除延時(shí)器

初識(shí)異步語句

定時(shí)器和延時(shí)器是兩個(gè)異步語句爱只。

異步(asynchronous):不會(huì)阻塞CPU繼續(xù)執(zhí)行其他語句铡俐,當(dāng)異步完成時(shí)凰兑,會(huì)執(zhí)行“回調(diào)函數(shù)”(callback)

//例子:
setInterval(function(){
    console.log('a');
},1000)
console.log('b');
//會(huì)先輸出b,再輸出aaaaaa

異步語句不會(huì)阻塞程序的正常執(zhí)行审丘。
(這里記個(gè)記號(hào)吏够,異步這部分是我學(xué)前端的第一個(gè)大坎,原因是我看的好多教程都沒有講解異步底層原理滩报,直到去看了pink老師的講解才理解了異步锅知,因?yàn)檫@點(diǎn)導(dǎo)致我后面的promise和ajax學(xué)得一知半解的)

函數(shù)節(jié)流

延時(shí)器可以用作函數(shù)節(jié)流,即加個(gè)開關(guān)脓钾,定時(shí)打開或關(guān)閉開關(guān)售睹,需足夠時(shí)間才能執(zhí)行下一次函數(shù),具體方法:

var lock = true;
function 需要節(jié)流的函數(shù)名(){
    if(!lock) return;
    lock = false;
    setTimeout(function(){
        lock =true;
    },節(jié)流時(shí)間);
}

BOM

Browser Object Model 瀏覽器對(duì)象模型可训,是JS與瀏覽器窗口交互的接口昌妹。
一些與瀏覽器改變尺寸、滾動(dòng)滾動(dòng)條相關(guān)的握截,都要借助BOM技術(shù)飞崖。

window對(duì)象

window對(duì)象是當(dāng)前js腳本運(yùn)行所處的窗口,而這個(gè)窗口中包含DOM結(jié)構(gòu)川蒙,window.document屬性就是document對(duì)象蚜厉。
在有標(biāo)簽頁功能的瀏覽器中,每個(gè)標(biāo)簽擁有自己的window對(duì)象畜眨,不共用昼牛。

全局變量是window的屬性

var a = 10;
//控制臺(tái)輸入window.a返回10

這意味著多個(gè)js文件之間是共享全局作用域的。

內(nèi)置函數(shù)普遍是window的方法

如setInterva( ) 康聂、alert( ) 等內(nèi)置函數(shù)贰健,普遍是window的方法

window屬性

瀏覽器窗口尺寸相關(guān)屬性

屬性 意義
innerHeight 瀏覽器窗口的內(nèi)容區(qū)高度,包含滾動(dòng)條(如果有)
innerWidth 瀏覽器窗口的內(nèi)容區(qū)高度恬汁,包含滾動(dòng)條(如果有)
outerHeight 瀏覽器窗口的外部高度
outerWidth 瀏覽器窗口的外部寬度

瀏覽器的滾動(dòng)條是有寬度的伶椿,如果想要獲得不包含滾動(dòng)條的窗口寬度,要用

document.documentElement.clientWidth

窗口改變事件resize見window事件

瀏覽器窗口滾動(dòng)條相關(guān)屬性

屬性 意義
window.pageYOffset 獲取當(dāng)前滾動(dòng)條Y軸已滾動(dòng)像素值
window.pageXOffset 獲取當(dāng)前滾動(dòng)條X軸已滾動(dòng)像素值
window.scrollY
window.scrollX
document.documentElement.scrollTop
document.documentElement.scrollLeft

document.documentElement.scroll可讀可寫,可用作返回頂部脊另。
滾動(dòng)條相關(guān)事件scroll見window事件

瀏覽器窗口滾動(dòng)條相關(guān)方法

方法名 作用
window.scoll( )
window.scollTo( )
window.scrollBy( )

傳入(x导狡,y)值滾動(dòng)到輸入的位置。
scroll和scrollTo一樣偎痛,scrollBy是在現(xiàn)基礎(chǔ)上累加

window方法

事件名 事件描述
load 當(dāng)頁面或圖像完全加載
unload 當(dāng)用戶退出頁面
scroll 滾動(dòng)滾動(dòng)條時(shí)
resize 窗體大小改變時(shí)

navigator對(duì)象

屬性 意義
appName 瀏覽器官方名稱
appVersion 瀏覽器版本
userAgent 瀏覽器的用戶代理(含有內(nèi)核信息和封裝殼信息)
platform 用戶操作系統(tǒng)

history對(duì)象

history.back();     //等同于瀏覽器回退按鈕
history.go(-1);     //同上
history.go(1);      //前進(jìn)一個(gè)頁面
history,forward();      //同上

a標(biāo)簽實(shí)現(xiàn)回退功能

<a href="javascript:history.back();">回退</a>

location 對(duì)象

location.href 返回當(dāng)前頁面URL
location.reload(true) 傳入true強(qiáng)制從服務(wù)器重新渲染頁面
location.search 當(dāng)前瀏覽器的get請(qǐng)求查詢參數(shù)

面向?qū)ο?/h1>

認(rèn)識(shí)對(duì)象

Object 是鍵值對(duì)的集合旱捧。
寫法:鍵和值之間用冒號(hào)分割,每組鍵值之間用逗號(hào)分隔踩麦。
如果對(duì)象的屬性鍵名不符合js標(biāo)識(shí)符命名規(guī)則枚赡,這個(gè)鍵名必須用引號(hào)包裹。

//方法一:
var 變量 = {
    鍵1 : 值1,
    鍵2 : 值2
}
//方法二:
var 變量 = new Object();

屬性的訪問

用 點(diǎn)語法 訪問對(duì)象中指定的值谓谦,
如果屬性名不符合js標(biāo)識(shí)符命名規(guī)則贫橙,則必須用方括號(hào)里加引號(hào)里寫屬性名。
如果屬性名以變量形式存儲(chǔ)反粥,也必須用方括號(hào)卢肃。

可用 hasOwnProperty( ) 方法判斷屬性是否是自己的,
或者使用 in 判斷屬性是否是自己和父級(jí)的星压。

屬性的更改

直接用賦值運(yùn)算符重新對(duì)屬性賦值即可践剂。

屬性的創(chuàng)建

如果對(duì)象本身沒有屬性,直接用 點(diǎn)語法 寫屬性名娜膘,并用賦值運(yùn)算符賦值即可逊脯,全局變量原理也是這樣。

屬性的刪除

用delete操作符竣贪,例如:

delete 對(duì)象.屬性;

對(duì)象的方法

如果某個(gè)屬性值是函數(shù)军洼,著它也被稱為對(duì)象的方法。

方法的調(diào)用

使用點(diǎn)語法即可演怎。

方法和函數(shù)

方法是對(duì)象的函數(shù)屬性匕争,需要用對(duì)象打點(diǎn)調(diào)用,函數(shù)也可以用window打點(diǎn)爷耀,所以二者在js里無差別甘桑。

對(duì)象的遍歷

用 for(var 循環(huán)變量 in 對(duì)象){} 循環(huán),例:

for(var k in obj){
    console.log(obj[k]);
}

循環(huán)變量可隨意命名歹叮,一般為k或prop跑杭,循環(huán)變量會(huì)一次變?yōu)閷?duì)象的每一個(gè)鍵。在for in 遍歷里咆耿,一定要寫成 對(duì)象[] 德谅,的形式,因?yàn)檠h(huán)變量是變量萨螺,中括號(hào)形式才能沒問題循環(huán)所有形式的變量窄做。

對(duì)象的深淺克隆

慕課網(wǎng)方法:

function deepClone(o){
    if (Array.isArray(o)) {
        var result = [];
        for (var i = 0;i < o.length;i++) {
            result.push(deepClone(o[i]));
        }
    }else if(typeof o == 'object'){
        var result = {};
        for (var k in o) {
            result[k] = deepClone(o[k]);
        }
    }else{
        var result = o;
    }
    return result;
}

渡一方法

function deepclone(origin,target){
    var target = target||{};
    for(var prop in origin){
        if(origin.hasOwnProperty(prop)){
            if(typeof(origin[prop]) == 'object'){
                if (Object.prototype.toString.call(origin[prop])=='[object object]') {
                    target[prop] = {};
                } else{
                    target[prop] = [];
                }
                deepclone(origin[prop],target[prop]);
            }else{
                target[prop] = origin[prop];
            }
        }
    }
    return target;
}

認(rèn)識(shí)函數(shù)的上下文

函數(shù)中可以用 this 關(guān)鍵字愧驱,他表示函數(shù)的上下文。
this 指向必須通過調(diào)用函數(shù)時(shí)的“前言后語”來判斷椭盏。
函數(shù)的上下文由調(diào)用方式?jīng)Q定组砚,函數(shù)只有被調(diào)用,才會(huì)產(chǎn)生上下文庸汗。

上下文規(guī)則

  1. 對(duì)象打點(diǎn)調(diào)用他的方法函數(shù)惫确,則函數(shù)的上下文是這個(gè)打點(diǎn)的對(duì)象。
  2. 圓括號(hào)直接調(diào)用函數(shù)蚯舱,則函數(shù)上下文是 window 對(duì)象。
  3. 數(shù)組(或類數(shù)組對(duì)象)枚舉出函數(shù)進(jìn)行調(diào)用掩蛤,則上下文是這個(gè)數(shù)組(或類數(shù)組對(duì)象)枉昏。
  4. 在IIFE函數(shù)中,上下文是window對(duì)象揍鸟。
  5. 定時(shí)器兄裂、延時(shí)器調(diào)用函數(shù),上下文是 window 對(duì)象阳藻。
  6. 事件處理函數(shù)的上下文是綁定事件的DOM元素晰奖,所以通常需要備份上下文。

call 和 apply

能指定函數(shù)的上下文腥泥,例:

函數(shù).call(上下文)
函數(shù).apply(上下文)

區(qū)別: 當(dāng)函數(shù)需要參數(shù)時(shí)匾南,call 要用逗號(hào)羅列參數(shù); apply 需把參數(shù)寫在數(shù)組中蛔外。

bind

bind 和 call 差不多蛆楞,不過它只改變this指向,不會(huì)調(diào)用函數(shù)夹厌,執(zhí)行完bind之后會(huì)返回一個(gè)已經(jīng)修改好this指向的函數(shù)豹爹,可以用一個(gè)變量接收

function fn(){}
var ojj = {}
var bii = fn.bind(o)

用new調(diào)用函數(shù)

用new接函數(shù)調(diào)用,會(huì)從函數(shù)內(nèi)部返回一個(gè)對(duì)象矛纹。
JS規(guī)定臂聋,使用new操作符調(diào)用函數(shù)會(huì)進(jìn)行“四步走”用new調(diào)用函數(shù)的四步走:

  1. 函數(shù)體內(nèi)會(huì)自動(dòng)創(chuàng)建出一個(gè)空白對(duì)象。
  2. 函數(shù)的上下文(this)會(huì)指向這個(gè)空白對(duì)象或南。
  3. 函數(shù)體內(nèi)的語句會(huì)執(zhí)行孩等。
  4. 函數(shù)會(huì)自動(dòng)返回上下文對(duì)象,即使函數(shù)沒有return語句迎献。

上下文規(guī)則總結(jié)表格

情況 this指向
對(duì)象.函數(shù)() 對(duì)象
函數(shù)直接調(diào)用 window
數(shù)組[下標(biāo)] () 數(shù)組
IIFE函數(shù) window
定時(shí)器瞎访、延時(shí)器 window
DOM事件處理函數(shù) 綁定DOM元素
call和apply 任意指定
用new調(diào)用函數(shù) 秘密創(chuàng)建出的對(duì)象

構(gòu)造函數(shù)

function 函數(shù)名(參數(shù)1,參數(shù)2){
    this.參數(shù)1同名 = 參數(shù)1;
    this.參數(shù)2同名 = 參數(shù)2;
}

然后用 new 調(diào)用函數(shù)執(zhí)行:
構(gòu)造函數(shù)開發(fā)者約定函數(shù)命名時(shí)首字母要大寫吁恍,不用new調(diào)用不能正常工作扒秸。
構(gòu)造函數(shù)用來“構(gòu)造新對(duì)象”播演,它內(nèi)部語句會(huì)為新對(duì)象添加屬性和方法,完成對(duì)象初始化伴奥。

“類”與實(shí)例

JS中是沒有類這個(gè)概念的写烤,因?yàn)镴S的對(duì)象與真正的面向?qū)ο笳Z言有差別,叫“基于對(duì)象”拾徙。
構(gòu)造函數(shù)可以看為是“類”洲炊,構(gòu)造函數(shù)new出來的對(duì)象可以看作為“實(shí)例”。
判斷這個(gè)實(shí)力是否是一個(gè)“類”構(gòu)造出來的尼啡,可以用
A instanceof B

prototype 原型

任何函數(shù)都有prototype屬性暂衡。
prototype屬性是個(gè)對(duì)象,它默認(rèn)擁有constructor屬性指回函數(shù)崖瞭。
普通函數(shù)的prototype屬性沒有任何用處狂巢,而構(gòu)造函數(shù)的prototype非常有用,構(gòu)造函數(shù)的prototype是它實(shí)例的原型书聚。

原型鏈

[圖片上傳失敗...(image-be2be0-1649463907747)]

hasOwnProperty 可以檢查對(duì)象是否真正“自己擁有”某屬性或方法唧领。
in 可以檢查對(duì)象是否能訪問到這個(gè)屬性或方法。
無法直接訪問的意思是雌续,構(gòu)造函數(shù)自身無法直接調(diào)用或訪問原型上的方法或?qū)傩哉陡觯鴮?shí)例可以,構(gòu)造函數(shù)自身想訪問原型上的方法必須先找原型再調(diào)用

在prototype上添加方法

將方法添加到構(gòu)造函數(shù)上時(shí)驯杜,生成的每一個(gè)新對(duì)象就會(huì)多一個(gè)新占用內(nèi)存的方法受啥,會(huì)造成內(nèi)存浪費(fèi)。
解決方法就是將方法寫道prototype上艇肴,只生成一個(gè)堆內(nèi)存就夠了腔呜。

重寫constructor

prototype里面自帶有一個(gè)constructor方法用于指回是哪個(gè)構(gòu)造函數(shù)構(gòu)造出來的,但通常一個(gè)構(gòu)造函數(shù)的原型方法里需要塞下多個(gè)方法的時(shí)候我們通常需要用對(duì)象的形式再悼,例如

function FFnn(){
    
}
FFnn.prototype = {
    say(){}
    sing(){}
}

通常會(huì)這樣子通過對(duì)象的形式往里面添加多個(gè)方法核畴,那么這個(gè)時(shí)候自帶的construtor就沒有了,所以這個(gè)時(shí)候如果你還想要有一個(gè)constructor方法指回構(gòu)造函數(shù)冲九,記得重新自己把constructor寫上

FFnn.prototype = {
    constructor:FFnn
    say:function(){}
    sing:function(){}
}

繼承

兩個(gè)無關(guān)的構(gòu)造函數(shù)谤草,但一個(gè)構(gòu)造函數(shù)需要的屬性在另一個(gè)函數(shù)上也有,就可以利用原型鏈原理達(dá)成繼承莺奸。
方法:使子函數(shù)的原型等于另一個(gè)函數(shù)的實(shí)例:

Fun2.prototype = new Fun1();

繼承——圣杯模式

function inherit(Target,Origin){
    function F(){};
    F.prototype = Origin.prototype
    Target.prototype = new F();
    Targer.prototype.constructor = Targer;
    Targer.prototype.uber = Origin.prototype;
}

包裝類

包裝類的目的就是為了讓基本類型值可以從他們的構(gòu)造函數(shù)的prototype上獲得方法丑孩。
包裝類構(gòu)造出來的值是一個(gè)對(duì)象,type of 返回 object 灭贷,可以參與運(yùn)算温学。

Math 數(shù)學(xué)對(duì)象

除了之前介紹的那些 Math 方法以外,我們還有更多常用的Math方法甚疟。

四舍五入 Math.round()
實(shí)現(xiàn)四舍五入到小數(shù)點(diǎn)后某位:
數(shù)字 * 10的n次方 然后四舍五入 再 / 10的n次方仗岖。

得到參數(shù)列表最大最小值
Math.max() 得到參數(shù)列表最大值逃延。
Math.min() 得到參數(shù)列表最小值。

如何求數(shù)組最大最小值:Math.max() 和 Math.min() 結(jié)合apply轧拄,例如:

var arr = [3,2,9];
var max = Math.max.apply(null,arr);
//ES6之后還可以
Math.max(...arr);

Date 日期對(duì)象

使用 new Date() 即可得到當(dāng)前時(shí)間的日期對(duì)象揽祥,他是object類型值。如果什么參數(shù)都不加就是此時(shí)此刻的時(shí)間檩电。
使用new Date(2021,6,12) 即可得到指定日期的日期對(duì)象拄丰,注意第二個(gè)參數(shù)是從0開始算的,6表示7月份俐末。
也可以new Date('2021-7-12') 這樣寫料按,算時(shí)區(qū)。

常見日期方法

方法 功能
getDate() 得到日期1~31
getDay() 得到星期0~6
getMonth() 得到月份0~11
getFullYear() 得到年份
getHours() 得到小時(shí)數(shù)0~23
getMinutes() 得到分鐘數(shù)0~59
getSeconds() 得到秒數(shù)0~59

時(shí)間戳

表示從1970年1月1日零點(diǎn)整距離某時(shí)刻的毫秒數(shù)鹅搪。
可以通過 getTime() 方法或 Date.parse() 函數(shù)可將日期對(duì)象改為時(shí)間戳站绪。
或者直接在date對(duì)象前面加個(gè)加號(hào) + 即可,例如 var chuo = + new Date()
通過 new Date(時(shí)間戳) 可將時(shí)間戳改為日期對(duì)象

正則表達(dá)式

regular expression 描述了字符串的“構(gòu)成模式”丽柿,經(jīng)常被用于檢查字符串是否符合預(yù)定的格式要求。
正則表達(dá)式“按位”描述規(guī)則魂挂,是指它是一位一位的描述子字符串的構(gòu)成形式甫题。

正則表達(dá)式的創(chuàng)建

使用 /內(nèi)容/ 的語法形式,可以快速創(chuàng)建正則表達(dá)式
也可以使用 new RegExp('內(nèi)容') 這種方法使用一些字符可能要用轉(zhuǎn)義涂召。
type of 檢查正則表達(dá)式返回object坠非。

元字符

元字符 功能
\d 匹配一個(gè)數(shù)字
\D 匹配一個(gè)非數(shù)字字符
\w 匹配一個(gè)單字字符
\W 匹配一個(gè)非單字字符
\s 匹配一個(gè)空白字符,包含空格制表符換行符
\S 匹配一個(gè)非空白字符
. 任意字符
^ 匹配開頭
# 匹配結(jié)尾

量詞

量詞 意義
* 匹配前一個(gè)表達(dá)式0次或多次果正,等價(jià)于{0,}
+ 匹配前一個(gè)表達(dá)式1次或多次炎码,等價(jià)于{1,}
? 匹配前一個(gè)表達(dá)式0次或1次
{n} n是一個(gè)正整數(shù),匹配了前面一個(gè)字符剛好出現(xiàn)了n次
{n,} n是一個(gè)正整數(shù)秋泳,匹配前一個(gè)字符至少出現(xiàn)了n次
{n,m} n和m都是正整數(shù)潦闲,匹配前面的字符至少出現(xiàn)n次,最多m次

方括號(hào)表示法

  1. 使用方括號(hào)迫皱,比如[xyz]可以創(chuàng)建一個(gè)字符集合歉闰,表示匹配方括號(hào)中的任意字符,一個(gè)方括號(hào)代表一位卓起。
  2. 可以用短橫 - 來指定一個(gè)字符范圍和敬,^ 表示否定
    例如[0-9] [a-z] [A-Z] [0-9a-zA-Z_] [0-68-9]

修飾符

i 不區(qū)分大小寫搜索
g 全局搜索

正則表達(dá)式的方法

test() 測(cè)試某字符串是否匹配正則表達(dá)式,返回布爾值
exec() 根據(jù)正則表達(dá)式戏阅,在字符串中進(jìn)行查找昼弟,返回結(jié)果數(shù)組或者null。exec方法開啟全局搜索后可逐條遍歷(ES6迭代器概念)奕筐。

字符串的相關(guān)正則方法

方法 簡(jiǎn)介
search() 在字符串中根據(jù)正則表達(dá)式及逆行查找匹配舱痘,返回首次匹配到的位置索引变骡,測(cè)試不到則返回 -1
match() 在在字符串中根據(jù)正則表達(dá)式進(jìn)行查找匹配,返回一個(gè)數(shù)組衰粹,找不到則返回null
replace() 使用替換字符串替換掉匹配到的子字符串锣光,可以使用正則表達(dá)式
split() 分割字符串為數(shù)組,可以使用正則表達(dá)式

本地存儲(chǔ)

  • 本地存儲(chǔ)不會(huì)發(fā)送到服務(wù)器端铝耻,且二者大小有所區(qū)別誊爹,sessionStorage能存儲(chǔ)5m左右,localstorage可以儲(chǔ)存10m左右瓢捉。(單個(gè)域名下)
  • 二者都可以在瀏覽器F12中频丘,Application-Storage 中找到,分為 key 和 value泡态。
  • 使用方法為 sessionStorage.setItem(key,value)localStorage.getItem(key,value)
  • 二者存儲(chǔ)的鍵和值只能是字符串類型搂漠,如果不是字符串類型,也會(huì)先轉(zhuǎn)成字符串再存進(jìn)去某弦⊥┨溃或者存入JSON類型值
  • 不同域名不能共用 sessionStorage 和 localStorage
  • IE7及以下不支持

sessionStorage

sessionStorage 是一種瀏覽器本地存儲(chǔ)數(shù)據(jù)的方式,只存儲(chǔ)在本地靶壮,不發(fā)送到服務(wù)器端怔毛。當(dāng)會(huì)話結(jié)束(例如關(guān)閉瀏覽器時(shí)),sessionStorage 中的數(shù)據(jù)會(huì)清空腾降〖鸲龋基本用法:

  • 增加數(shù)據(jù)setItem方法:sessionStorage.setItem(key,value);
  • 查詢數(shù)據(jù)getItem方法:sessionStorage.getItem(key);
  • 刪除數(shù)據(jù)removeItem方法:sessionStorage.removeItem(key);
    全部清空clear方法:sessionStorage.clear();
  • 改更數(shù)據(jù)setItem方法:同key屬性覆蓋

其他屬性:

  • length 屬性:sessionStroage.length() 獲取長(zhǎng)度
  • key方法,參數(shù)時(shí)數(shù)據(jù)螃壤,代表key的索引抗果,根據(jù)索引獲取key值。sessionStorage.key(0)

localStorage

localStorage 時(shí)持久化的本地存儲(chǔ)奸晴,除非手動(dòng)清楚或者滿了自動(dòng)清除冤馏,否則數(shù)據(jù)永遠(yuǎn)不會(huì)過期。

  • 增加數(shù)據(jù)setItem方法:localStorage.setItem(key,value);
  • 查詢數(shù)據(jù)getItem方法:localStorage.getItem(key);
  • 刪除數(shù)據(jù)removeItem方法:localStorage.removeItem(key);
    全部清空clear方法:localStorage.clear();
  • 改更數(shù)據(jù)setItem方法:同key屬性覆蓋
  • length 屬性:localStroage.length() 獲取長(zhǎng)度
  • key方法蚁滋,參數(shù)時(shí)數(shù)據(jù)宿接,代表key的索引,根據(jù)索引獲取key值辕录。loacalStorage.key(0)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末睦霎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子走诞,更是在濱河造成了極大的恐慌副女,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚣旱,死亡現(xiàn)場(chǎng)離奇詭異碑幅,居然都是意外死亡戴陡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門沟涨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恤批,“玉大人,你說我怎么就攤上這事裹赴∠才樱” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵棋返,是天一觀的道長(zhǎng)延都。 經(jīng)常有香客問我,道長(zhǎng)睛竣,這世上最難降的妖魔是什么晰房? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮射沟,結(jié)果婚禮上殊者,老公的妹妹穿的比我還像新娘。我一直安慰自己验夯,他們只是感情好幽污,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著簿姨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪簸搞。 梳的紋絲不亂的頭發(fā)上扁位,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音趁俊,去河邊找鬼域仇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛寺擂,可吹牛的內(nèi)容都是我干的暇务。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼怔软,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼垦细!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起挡逼,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤括改,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后家坎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘱能,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吝梅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惹骂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苏携。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖对粪,靈堂內(nèi)的尸體忽然破棺而出右冻,到底是詐尸還是另有隱情,我是刑警寧澤衩侥,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布国旷,位于F島的核電站,受9級(jí)特大地震影響茫死,放射性物質(zhì)發(fā)生泄漏跪但。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一峦萎、第九天 我趴在偏房一處隱蔽的房頂上張望屡久。 院中可真熱鬧,春花似錦爱榔、人聲如沸被环。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筛欢。三九已至,卻和暖如春唇聘,著一層夾襖步出監(jiān)牢的瞬間版姑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工迟郎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剥险,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓宪肖,卻偏偏與公主長(zhǎng)得像表制,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子控乾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

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