《JavaScript權(quán)威指南》基礎(chǔ)總結(jié)

1.數(shù)組的方法:

join() :把元素轉(zhuǎn)換成字符串
reverse():顛倒數(shù)組元素
sort():數(shù)組排序
contact():將元素添加到數(shù)組后
slice():返回一個指定數(shù)組片段
splice():插入或刪除數(shù)組

var a =[1,2,3,4,3,2,3,4]
a.splice(4)    // return [3,2,3,4]   a=[1,2,3,4]
a.splice(1,2)  // return  [2, 3]   a=[1,4]
a.splice(2,0,'a','b') return []        a=[1, 4, "a", "b"]

push():將元素加到數(shù)組尾部
pop():刪除數(shù)組的最后一個元素
unshift():將元素插入到數(shù)組頭部
shift():刪除數(shù)組的第一個元素
toString()悲没、 toLacaleString()榨咐、indexOf()膏燃、lastIndexOf()垃杖、forEach()、map()、filter()

2.函數(shù)

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

初始化一個對象的屬性并且專門和new運算符一起使用的一個函數(shù)

//聲明一個"人"的構(gòu)造函數(shù),目的是通過new出來的對象都是一個個的具體的"人"
var Person=function(){
  
  //私有屬性,該屬性new出來的對象時無法獲取到的.
  var prx="other";

  //定義了name的屬性
  //在這里name是實例屬性,也就是說,通過new出來的對象都具備name的屬性
  this.name="double";
  
  //我們用var 申明了一個私有方法,該方法 不能被 new Person 調(diào)用到,
  //一般的,我們只需要再內(nèi)部使用到的方法可最好聲明稱私有方法.
  var prxMethond=function(){
      console.log("in prxMethod");
  }
  //定義了say的方法
  //同name,say是一個實例方法,new出來的對象都有say的方法
  this.say=function(){
    console.log("hi i am "+this.name);
   }
}
//為Person定義了一個原型方法eat,該方法為公共方法,
//每一個通過new Person 實例出來的對象都共享同一個eat方法,
//當然如果不想共享可在新對象中進行重寫覆蓋
Person.prototype.eat=function(){
  console.log(this.name+"eat something...");
}

在Js中使用new 關(guān)鍵字調(diào)用一個函數(shù)的問題:

var Chinese=new Person();

實際上內(nèi)部是這樣的:

var Chinese={};
Chinese.__proto__=Person.prototype;
Person.call(Chinese);

上面三句代碼的說明:

聲明了一個Chinese的空對象
將Person的prototype賦值給Chinese的proto屬性
關(guān)于對象的prototype和proto概念如下:
prototype是函數(shù)的一個屬性(每個函數(shù)都有一個prototype屬性),這個屬性是一個指針昂拂,指向一個對象鞭缭。它是顯示修改對象的原型的屬性剖膳。
proto是一個對象擁有的內(nèi)置屬性(每個對象都有一個proto屬性),是JS內(nèi)部使用尋找原型鏈的屬性岭辣。
這就是為什么Chinese可以調(diào)用到Person原型(Person.prototype)方法的原因
調(diào)用Person函數(shù),并且把Chinese當成是this傳入函數(shù)中,這就是為什么Chinese可以調(diào)用Person函數(shù)定義的this.屬性或this.方法的原因

2.2 apply() 吱晒、call()、bind()

第一個參數(shù)都是要調(diào)用的函數(shù)的對象
call:剩余參數(shù)是傳遞給要調(diào)用的函數(shù)的值
apply:要傳遞給函數(shù)的參數(shù)是由數(shù)組指定的
call :第一個參數(shù)是要綁定給this的值沦童,后面?zhèn)魅氲氖且粋€參數(shù)列表仑濒。當?shù)谝粋€參數(shù)為null、undefined的時候偷遗,默認指向window墩瞳。

var obj = {
    message: 'My name is: '
}

function getName(firstName, lastName) {
    console.log(this.message + firstName + ' ' + lastName)
}

getName.call(obj, 'Dot', 'Dolby')
apply

apply接受兩個參數(shù),第一個參數(shù)是要綁定給this的值氏豌,第二個參數(shù)是一個參數(shù)數(shù)組喉酌。當?shù)谝粋€參數(shù)為null、undefined的時候泵喘,默認指向window泪电。

var obj = {
    message: 'My name is: '
}

function getName(firstName, lastName) {
    console.log(this.message + firstName + ' ' + lastName)
}

getName.apply(obj, ['Dot', 'Dolby'])// My name is: Dot Dolby

call和apply 可以用來綁定this指針,做繼承

var funOne= function () {
    this.enName= 'Mike';
}
var funTwo= function () {
    this.getEnName = function () {
        console.log(this.enName);
    }
    funOne.call(this);  // funTwo繼承了funOne的屬性和方法
}
var person = new funTwo();
person.getEnName()   //Mike
bind

和call很相似,第一個參數(shù)是this的指向纪铺,從第二個參數(shù)開始是接收的參數(shù)列表相速。區(qū)別在于bind方法返回值是函數(shù)以及bind接收的參數(shù)列表的使用。

var obj = {
    name: 'Dot'
}

function printName() {
    console.log(this.name)
}

var dot = printName.bind(obj)
console.log(dot) // function () { … }
dot()  // Dot

2.3函數(shù)作用域和閉包

當一個函數(shù)被調(diào)用的時候鲜锚,調(diào)用對象也從作用域鏈中移除突诬。當沒有涉及嵌套的函數(shù)的時候,作用域鏈是對調(diào)用對象的唯一的引用烹棉。
JavaScript函數(shù)是將要執(zhí)行的代碼以及執(zhí)行這些代碼的作用域構(gòu)成的一個綜合體攒霹,代碼和作用域的綜合體叫做閉包怯疤。
例子:

uniqueId = (function(){
    var id = 0
    return function() {  return id++ }
})

使用閉包的斷點:
例子:

function inspect(inspector, title) {
  var expression, result
  if ("ignore" in arguments.callee) return
  while (true) {
    var message = ""
    if (title) message = `${title} \n`
    if (expression) message = `\n ${expression} ==> ${result} \n`
    else expression = ''
    message += "Enter an expression to evaluate"
    expression = prompt(message, expression)
    if (!expression) return
    result = inspector(expression)
  }
}

屬性讀冉础:基于原型鏈繼承。(先查屬性集峦,再查原型鏈)
JavaScript基于原型的繼承而不是類的繼承(有別于Java伏社、C等)
任何對象屬性都是一個實例屬性
每個實例方法由一個類的所有實例來共享
類屬性與類自身相關(guān),與類的每一個實例無關(guān)

2.4超類和子類

基于原型的繼承包含了一個原型對象的鏈

Object.prototype.name = 'Owen'; //超類的原型屬性
var d = Date.prototype;
alert(d.name); //Owen塔淤,子類繼承超類
function Me() {}
var m = Me.prototype;
alert(m.name); //Owen摘昌,子類繼承超類

prototype由構(gòu)造函數(shù)Object()創(chuàng)建,所以它本身也是一個Object實例,而任何Object實例都可以從Object.prototype中繼承屬性;于是prototype就也具有了這種能力高蜂;
簡而言之聪黎,超類就是爸爸,子類就是兒子备恤。

3.鴨子類型識別(duck typing)

如果它走起路來像鴨子稿饰,叫起來也是鴨子锦秒,那么它就是鴨子。
只關(guān)注對象的行為喉镰,不關(guān)注對象本身面向接口編型 旅择,而不是面向?qū)崿F(xiàn)編程,是設(shè)計模式中最重要的思想

var duck = {
  duckSinging: function() {
    console.log('呱呱呱');
  }
}
alert('duck');

var chicken = {
  duckSinging: function() {
    console.log('呱呱呱');
  }
}
alert('chicken');

var chior = [];

var joinChior = function(animal) {
  if (animal && typeof animal.duckSinging === 'function') { //typeof就是判斷參數(shù)是什么類型的實例                
    chior.push(animal);
    console.log('恭喜你加入合唱團');
    console.log('當前已募集' + chior.length + '只鴨子');
  }
}
joinChior(duck);
joinChior(duck);
joinChior(chicken);

4.正則表達式

基本的字符串操作
search 變量名.search('要查找的元素')侣姆; 出來的結(jié)果是該元素的位置下標生真。如果不存在,則返回-1捺宗;
substring 變量名.substring('起始‘,'結(jié)束'); 查找從開始到結(jié)束前一個的字符串柱蟀,不包括結(jié)束的。
charAt 變量名.charAt('元素下標號');通過下標查找某個元素蚜厉;
split 變量名.split(' ') ;把字符串分割成數(shù)組产弹;

找出字符串中的所有數(shù)字
傳統(tǒng)方法:

var str = '12 dd 34 h 34';
var arr = [];
var tmp = ' ';
for (var i = 0; i < str.length; i++) {
  if (str.charAt(i) >= 0 && str.charAt(i) <= 9) {
    tmp += str.charAt(i);
  } else {
    if (tmp) {
      arr.push(tmp);
      tmp = ' ';
    }
  }
  if (tmp) {
    arr.push(tmp);
    tmp = ' ';
  }
}

用正則表達式:

str.match(/\d+/g)

用正則表達式表達的兩種方法:
JS風(fēng)格:

new RegExp("a","i");

perl風(fēng)格:

/a/i

正則中的特殊字符:
\ 轉(zhuǎn)義字符;
. 任意字符;
\d 數(shù)字0-9黍少;
\w 數(shù)字0-9蚌铜、字母a-z及A-Z(大小寫),或下劃線
\s 空格符、Tab斤斧、換頁符、換行符
\D 除了數(shù)字0-9霎烙;
\w 除了 數(shù)字0-9撬讽、字母a-z及A-Z(大小寫),或下劃線
\s 除了空格符、Tab悬垃、換頁符游昼、換行符
\t \r \n \v \f tab回車 換行 垂直制表等 換頁符
[...] 中括號表示字符范圍
[^...] 字符范圍以外
^ 行首 ^abc 表示abc必須放在行首

abc 表示abc必須放在行尾
\b 零寬單詞邊界
\B 非\b
(x) 分組,并記錄匹配到的字符串 /(abc)/
\n 表示使用分組符(x)匹配到的字符串 --> /(abc)\1/.test('abcabc');
(?:x) 僅分組 --> /(?:abc)(def)\1/.test(abcdefdef);
x?, x+? 如: abc? 在字符串a(chǎn)bcccccc中將匹配ab尝蠕,abc+烘豌?則匹配abc
x{n}, 重復(fù) n 次
x{n,}, 重復(fù) >=n 次
x{n,m}, 重復(fù)次數(shù)x滿足: n <= x <= m

正則表達式中的4中對象方法:
1.正則.exec("字符串") 匹配字符串
2.正則.test reg.test("def"); // ture
3.正則.compile()改變正則的值 var reg = /abc/; reg.compile("def"); 將"abc"變成"def",用complie來改變正則的規(guī)則和屬性
4.正則.toString()輸出整個正則 /abc/.toString(); // "/abc/"

正則中的三個標簽:
global(全局匹配)看彼,ignoreCase(忽略大小寫)廊佩,multiline(跨行)
使用方法
1.正則對象后直接接“gim”,gim分別對應(yīng)以上三個標簽靖榕,順序與個數(shù)不定
2.RegExp(正則表達式, "mgi")

正則中的相關(guān)方法:
search() 字符串搜索
match() 字符匹配
replace('匹配內(nèi)容','替換內(nèi)容') 替換所有匹配
split(" ") 把字符串轉(zhuǎn)換成數(shù)組

郵箱驗證格式:

var re=/^\w@[a-z0-9]+.[a-z]+$/i;

5.web瀏覽器中的JavaScript

在客戶端JavaScript中标锄,表示HTML文檔是document對象,window對象代表顯示該文檔的窗口(幀)茁计。


image.png

事件:


image.png

DOM事件流(三階段)

事件捕獲料皇、處于目標、事件冒泡

事件捕獲

當鼠標點擊或者觸發(fā)dom事件時,瀏覽器會從根節(jié)點開始由外到內(nèi)進行事件傳播践剂,即點擊了子元素毒返,如果父元素通過事件捕獲方式注冊了對應(yīng)的事件的話,會先觸發(fā)父元素綁定的事件舷手。(父元素監(jiān)聽子元素拧簸,就應(yīng)用了這個原理)

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            #a{
                width: 100px;
                height: 100px;
                background: red;
            }
            #b{
                width: 50px;    
                height: 50px;
                background: green;
            }
        </style>
    </head>
    <body>
        <div id='a'>
            <div id='b'>
                <p id="p">111</p>
            </div>
            
        </div>
    </body>
    <script type="text/javascript">
        var a=document.getElementById('a');
        var b=document.getElementById('b');
        var p=document.getElementById('p');
         
        a.addEventListener('click',function (){
            alert('a');
        },true);
        b.addEventListener('click',function(){
            alert('b')
        },true)
        p.addEventListener('click',function(){
            alert('p')
        },true)
        //addEventListener 有三個參數(shù)
                //第一個是 事件名
                //第二個是 函數(shù)方法
                //第三個是 布爾值   (判斷是事件冒泡還是事件捕捉  true 是事件捕捉  false 是事件捕捉)

    </script>
</html>

事件冒泡
當一個元素接收到事件的時候 會把他接收到的事件傳給自己的父級,一直到window

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            #a{
                width: 100px;
                height: 100px;
                background: red;
            }
            #b{
                width: 50px;    
                height: 50px;
                background: green;
            }
        </style>
    </head>
    <body>
        <div id='a'>
            <div id='b'>
                <p id="p">111</p>
            </div>
            
        </div>
    </body>
    <script type="text/javascript">
        var a=document.getElementById('a');
        var b=document.getElementById('b');
        var p=document.getElementById('p');
        a.onclick=function(){
            alert('a')
        }
        b.onclick=function(){
            alert('b')
    
        }
        p.onclick=function(){
            alert('p')
        }
        
    </script>
</html>

阻止事件冒泡

event.stopPropagation()

cookie 和session 的區(qū)別:

1男窟、cookie數(shù)據(jù)存放在客戶的瀏覽器上盆赤,session數(shù)據(jù)放在服務(wù)器上。

2歉眷、cookie不是很安全牺六,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙
考慮到安全應(yīng)當使用session。

3汗捡、session會在一定時間內(nèi)保存在服務(wù)器上淑际。當訪問增多,會比較占用你服務(wù)器的性能
考慮到減輕服務(wù)器性能方面扇住,應(yīng)當使用COOKIE春缕。

4、單個cookie保存的數(shù)據(jù)不能超過4K艘蹋,很多瀏覽器都限制一個站點最多保存20個cookie锄贼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市女阀,隨后出現(xiàn)的幾起案子宅荤,更是在濱河造成了極大的恐慌,老刑警劉巖浸策,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冯键,死亡現(xiàn)場離奇詭異,居然都是意外死亡庸汗,警方通過查閱死者的電腦和手機惫确,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夫晌,“玉大人雕薪,你說我怎么就攤上這事∠恚” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵盏档,是天一觀的道長凶掰。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么懦窘? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任前翎,我火速辦了婚禮,結(jié)果婚禮上畅涂,老公的妹妹穿的比我還像新娘港华。我一直安慰自己,他們只是感情好午衰,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布立宜。 她就那樣靜靜地躺著,像睡著了一般臊岸。 火紅的嫁衣襯著肌膚如雪橙数。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天帅戒,我揣著相機與錄音灯帮,去河邊找鬼。 笑死逻住,一個胖子當著我的面吹牛钟哥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瞎访,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼瞪醋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了装诡?” 一聲冷哼從身側(cè)響起银受,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸦采,沒想到半個月后宾巍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡渔伯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年顶霞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锣吼。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡选浑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出玄叠,到底是詐尸還是另有隱情古徒,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布读恃,位于F島的核電站隧膘,受9級特大地震影響代态,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疹吃,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一蹦疑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧萨驶,春花似錦歉摧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至育谬,卻和暖如春券盅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背膛檀。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工锰镀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咖刃。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓泳炉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嚎杨。 傳聞我的和親對象是個殘疾皇子花鹅,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

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