Javascript高級程序設(shè)計筆記

第一章 Javascript簡介

Javascript實現(xiàn)

  • 核心(ECMAScript)
  • 文檔對象模型(DOM)
  • 瀏覽器對象模型(BOM)

ECMA-262

  • 語法
  • 類型
  • 語句
  • 關(guān)鍵字
  • 保留字
  • 操作符
  • 對象

文檔對象模型

針對XML但經(jīng)過擴展用于HTML的應(yīng)用程序變成接口API。把整個頁面映射為一個多層節(jié)點結(jié)構(gòu)南蓬。提供訪問和操作網(wǎng)頁的方法和接口。

  • DOM1映射文檔結(jié)構(gòu)
  • DOM2
  • DOM視圖(Vidws)
  • DOM事件(Events)
  • DOM樣式(Style)
  • DOM遍歷和范圍(Traversal and Range)
  • DOM3加載文檔的方法、驗證文檔的方法

瀏覽器對象模型

提供與瀏覽器交互的方法和接口。

第二章 在HTML中使用JavaScript

引入外部javascript, 標簽之間不能再添加額外的內(nèi)容。否則不執(zhí)行措嵌。

<script type="text/javascript" src="abc.js"></script>

defer屬性,腳本延遲到整個頁面解析完再執(zhí)行芦缰。每個標簽按順序執(zhí)行企巢。
async屬性,不能保證按先后順序執(zhí)行让蕾。
charset屬性包斑,字符集。

script內(nèi)嵌文件中出現(xiàn)的內(nèi)容要\轉(zhuǎn)義涕俗。

外部文件的優(yōu)點:

  • 可維護
  • 可緩存
  • 適應(yīng)未來

noscript元素
當瀏覽器不支持JavaScript的時候罗丰,顯示noscript元素中的內(nèi)容≡俟茫“需要啟用JavaScript”

所有script元素都會按照他們做頁面中出現(xiàn)的先后順序依次被解析萌抵。在不使用defer和async的情況下,只有在解析完前面script元素中的代碼之后元镀,才會開始解析后面script中的代碼绍填。一般放在文檔的后面 。
使用defer屬性可以 讓腳本在文檔完全呈現(xiàn)之后再執(zhí)行栖疑,延遲腳本總是按照指定他們的順序執(zhí)行讨永。
使用async屬性可以表示當前腳本不必等待其他腳本,也不必阻塞文檔呈現(xiàn)遇革。

第三章 基本概念

語法

  • 區(qū)分大小寫
  • 標識符:第一個字符必須是字母卿闹、下劃線揭糕、美元符號,其他字符可以是字母锻霎、下劃線著角、美元符號、數(shù)字旋恼±艨冢可以包含ASCII和Unicode字符,駝峰大小寫格式冰更。
  • 注釋 // 單行注釋 /****多行注釋****/
  • 嚴格模式:不確定的行為得到處理产徊,不安全的行為拋出錯誤,"use strict" 可以在頂部添加代碼蜀细,也可以在指定函數(shù)下添加舟铜。
  • 語句:結(jié)尾分號不是必須,但推薦使用审葬∩罟觯控制語句多行使用代碼塊,建議始終使用涣觉。

關(guān)鍵字和保留字

不一一列舉了痴荐。

變量

松散型變量可以保存任何數(shù)據(jù)
var message; //undefined
var message="hi";
如果在函數(shù)中var定義一個變量,退出函數(shù)后會銷毀官册。如果函數(shù)中不用var直接使用生兆,全局變量退出后還能使用。
可以用逗號創(chuàng)建多個變量var message=1 , go="haha", age=29;

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

基本數(shù)據(jù)類型 undefined膝宁,Null鸦难,Bollean,Number员淫,String
復(fù)雜數(shù)據(jù)類型 Object

typeof操作符

  • undefined 未定義
  • boolean 布爾值
  • string 字符串
  • number 數(shù)值
  • object 對象或者null
  • function 函數(shù)

instanceof檢測對象

person instanceof Array

undefined類型

聲明變量但是沒有初始化合蔽。沒有必要顯式的聲明。
var message;
alert(message); //undefined
alert(age); //產(chǎn)生錯誤

但是他們typeof都能輸出undefined介返。

Null類型

空對象類型 typeof 返回object
未來使用空變量拴事,初始化為null。
null == undefined //ture

Boolean 類型

在使用if的時候用于默認條件判斷圣蝎。 使用Boolean()進行轉(zhuǎn)換
|數(shù)據(jù)類型|轉(zhuǎn)換為true的值|轉(zhuǎn)換為false的值|
|-|-|
|Boolean|true|false|
|String|非空字符串|空字符串|
|Number|非零數(shù)字包括無窮大|0和NaN|
|Object|任何對象|null|
|Undefined|不使用|undefined|

Number類型

八進制第一位是0刃宵,如果字面值中數(shù)值超出范圍。那么前導(dǎo)0忽略徘公。八進制在嚴格模式無效牲证。
十進制前兩位是0x。在進行算數(shù)計算時关面,所有的十六進制和八進制被轉(zhuǎn)換為十進制坦袍。
isFinite(123) 判斷是否無限大
沒有小數(shù)部分的浮點數(shù)十厢,會轉(zhuǎn)換為整數(shù)锅必。
1.2e7
1.2e-7
浮點數(shù)表示法

最大能表示的數(shù)值 Number.MAX_VALUE
最小能表示的數(shù)值 Number.MIN_VALUE
0除以0返回NaN互亮,NaN和任何數(shù)值都不相等,包括本身。使用isNaN(123)--false辛燥,isNaN(NaN)當然返回true,不能轉(zhuǎn)換為數(shù)值的缝其,也會返回true挎塌。isNaN("10")就是false,isNaN(true) 可以被轉(zhuǎn)換成數(shù)值1内边,也是false榴都。isNaN("blue")不能轉(zhuǎn)換成數(shù)值,是false漠其。

Number()數(shù)值轉(zhuǎn)換規(guī)則

  • 布爾值嘴高,轉(zhuǎn)換為0和1
  • 數(shù)字,簡單傳入返回
  • null和屎,返回0
  • undefined拴驮,返回NaN
  • 字符串,遵循以下規(guī)則柴信。
  • 如果只含數(shù)字套啤,轉(zhuǎn)換為十進制數(shù)字,前導(dǎo)0忽略
  • 如果含浮點格式随常,轉(zhuǎn)換為浮點數(shù)值
  • 如果包含有效的十六進制字符潜沦,轉(zhuǎn)換成十進制數(shù)字
  • 如果字符串是空的,轉(zhuǎn)換為0
  • 除上述之外绪氛,轉(zhuǎn)換為NaN
  • 如果是對象唆鸡,調(diào)用valueOf()方法,依照前面的規(guī)則返回的數(shù)值進行返回枣察。如果結(jié)果是NaN争占,則調(diào)用對象的toString()方法,再依照前面進行返回询件。

parseInt()函數(shù)
找到第一個非空字符進行轉(zhuǎn)換燃乍,如果第一個字符不是數(shù)字,返回NaN宛琅。因此刻蟹,轉(zhuǎn)換空字符串會返回NaN。而Number會返回0.第二個參數(shù)可以是基數(shù)嘿辟。"22.5"返回22舆瘪,小數(shù)點不是有效的數(shù)字字符片效。

parseFloat 函數(shù)
從第一個字符開始解析每個字符。一直解析到字符串末尾英古〉硪拢或者解析遇見一個無效的浮點數(shù)字字符為止。第二個小數(shù)點無效召调。

String類型

字符字面量
\n \t \r
每個字面量長度是1
字符串不可變膨桥,要改變字符串,只能銷毀原來的唠叛。
toString()方法
返回字符字面量只嚣,能傳遞基數(shù),但是null和undefined沒有這個方法艺沼。如果想把null和undefined轉(zhuǎn)換成字符串册舞,使用String()轉(zhuǎn)型函數(shù)、

Object類型

var o = new Object()
每個實例都有下列屬性和方法

  • constructor 創(chuàng)建當前對象的函數(shù)
  • hasOwnProperty 檢查給定的屬性在當前對象實例中是否存在
  • isPrototypeOf 檢查傳入對象是否是傳入對象的原型
  • propertyIsEnumerable 檢查給定對象能否使用for in語句
  • toLocaleString() 返回對象字符串表示障般,與執(zhí)行環(huán)境對應(yīng)
  • toString() 返回對象字符串表示
  • valueOf() 返回對象字符串调鲸,數(shù)值,布爾值表示

操作符

一元操作符

遞增和遞減操作符挽荡,前置和后置藐石。

  • 包含有效數(shù)字字符的字符串,轉(zhuǎn)換為數(shù)字后操作徐伐。
  • 不包含有效數(shù)字的字符串贯钩,變量設(shè)置為NaN
  • 布爾值轉(zhuǎn)換為0和1再操作。
  • 浮點數(shù)办素,執(zhí)行加減1
  • 對于對象角雷,先調(diào)用valueOf方法,運用轉(zhuǎn)換規(guī)則性穿。如果結(jié)果是NaN勺三,則調(diào)用toString()方法。

一元加減操作符需曾。如果是非數(shù)值吗坚,用Number()轉(zhuǎn)換,如果是對象呆万,先調(diào)用valueof和toString方法商源,然后再轉(zhuǎn)換。

位操作符

負數(shù)是二進制的補碼谋减,補碼是反碼+1.
按位非NOT 負值減1
按位與AND &
按位或OR |
按位異或 XOR ^ 相同為0 不同為1
左移 << 用0填充
右移 >> 用0填充

布爾操作符

邏輯非!
對象返回false牡彻,
空字符串返回true,
非空字符串返回false出爹,
操作數(shù)0返回true庄吼,
非零返回false缎除,
null返回true,
NaN返回true总寻,
undefined返回true器罐。
兩個邏輯非,可以轉(zhuǎn)換為布爾值渐行。和Boolean() 相同

邏輯與&&

  • 第一個操作數(shù)是對象轰坊,返回第二個操作數(shù)
  • 第二個操作數(shù)是對象,只有在第一個求值結(jié)果是true情況下才返回該對象殊轴。
  • 兩個操作數(shù)都是對象衰倦,返回第二個操作數(shù)袒炉。
  • 有一個操作數(shù)是null旁理、NaN、undefined我磁,則返回他
  • 短路操作

邏輯或||

  • 如果第一個操作數(shù)是對象孽文,返回第一個操作數(shù)
  • 如果第一個操作數(shù)的求值結(jié)果為false,則返回第二個操作數(shù)夺艰。
  • 如果兩個操作數(shù)都是對象芋哭,則返回第一個操作數(shù)
  • 如果兩個都是null、NaN郁副、undefined减牺。
  • 短路操作

乘性操作符

乘法*

  • 如果操作符都是數(shù)值,按照常規(guī)乘法計算存谎,超出范圍變成無窮大拔疚。
  • 有一個操作數(shù)是NaN,結(jié)果是NaN
  • Infinity與0相乘既荚,結(jié)果是NaN
  • infinity與非0相乘稚失,結(jié)果是infinity或者-infinity
  • 兩個Infinity相乘,返回Infinity
  • 有一個操作數(shù)不是數(shù)值恰聘,調(diào)用Number()轉(zhuǎn)換后句各,在執(zhí)行上面的操作。

除法/

  • 超過范圍晴叨,結(jié)果是infinity或者-infinity
  • 有一個操作符是NaN凿宾,返回NaN
  • infinity除以infinity,返回NaN
  • 0除以0,返回NaN
  • 非零有限數(shù)被0除兼蕊,結(jié)果是infinit或-Infinity
  • 有一個操作數(shù)不是數(shù)值初厚,后臺調(diào)用Number()轉(zhuǎn)換后,再用上面的規(guī)則遍略。

求模%

  • 數(shù)值返回正常值惧所。
  • 被除數(shù)無限大除數(shù)有限大骤坐,返回NaN
  • 被除數(shù)有限大除數(shù)是0,返回NaN
  • Infinity被Infinity除下愈,結(jié)果是NaN
  • 被除數(shù)有限大纽绍,除數(shù)無窮大,結(jié)果是被除數(shù)势似。
  • 被除數(shù)是0拌夏,結(jié)果是0.
  • 有一個操作數(shù)不是數(shù)值,調(diào)用Number()履因,再應(yīng)用上述規(guī)則障簿。

加性操作符

加法

  • 有一個操作符是NaN,結(jié)果就是NaN
  • 兩個正無窮相加或者兩個負無窮相加栅迄,結(jié)果就是正無窮和負無窮站故。
  • 正無窮和負無窮相加,結(jié)果是NaN
  • 字符串相加毅舆,就拼接
  • 一個是字符串西篓,則將另一個轉(zhuǎn)換為字符串,再拼接憋活。
  • 如果操作數(shù)是對象岂津、數(shù)值、布爾值悦即,調(diào)用他們的toString()取得相應(yīng)字符串的數(shù)值吮成,對于undefined和null,分別調(diào)用string()取得字符串undefined和null

減法

  • 兩個操作符都是數(shù)值辜梳,執(zhí)行常規(guī)計算粱甫。
  • 有一個是NaN,結(jié)果都是NaN
  • Infinity-Infinity=NaN
  • -Infinity- -infinity = NaN
  • infinity--infinity=infinity
  • -infinity-infinity=-infinity
  • 0-0=0
  • 0--0=-0
  • -0--0=+0
  • 如果一個操作數(shù)是字符串冗美、布爾值魔种、null、undefined粉洼,后臺調(diào)用number()將轉(zhuǎn)換為數(shù)值节预,再根據(jù)前面的規(guī)則執(zhí)行減法計算。如果轉(zhuǎn)換的結(jié)果是NaN属韧,那么整個結(jié)果是NaN
  • 如果有一個操作符是對象安拟,調(diào)用valueOf取得對象的數(shù)值,如果得到的是NaN宵喂,則結(jié)果是NaN糠赦,如果沒有valueOf方法,則調(diào)用toString()方法并得到字符串轉(zhuǎn)換為數(shù)值。

關(guān)系操作符

  • 兩個操作符都是數(shù)值拙泽,執(zhí)行數(shù)值比較淌山。
  • 都是字符串,比較編碼數(shù)值
  • 如果一個操作數(shù)是數(shù)值顾瞻,則將另一個操作數(shù)轉(zhuǎn)換為一個數(shù)值進行比較泼疑。
  • 如果一個操作數(shù)是對象,則調(diào)用這個對象的valueOf方法荷荤,用結(jié)果進行比較退渗。如果沒有,就調(diào)用toString方法蕴纳。
  • 如果一個操作數(shù)是布爾值会油,則現(xiàn)將其轉(zhuǎn)換為數(shù)值,進行比較古毛。
  • 任何操作符和NaN比較翻翩,都是false。

相等操作符

相等和不相等 先轉(zhuǎn)換再比較

  • 有一個操作數(shù)是布爾值喇潘,轉(zhuǎn)為數(shù)值再比較体斩。
  • 一個是字符串,另一個是數(shù)值颖低,比較相等這錢先將字符串轉(zhuǎn)換為數(shù)值。
  • 一個是對象另一個不是弧烤,調(diào)用valueOf方法忱屑,用得到的基本類型和前面的比較。
  • null和undefined相等暇昂。不能將null和undefined轉(zhuǎn)換為其他任何數(shù)值莺戒。
  • 有一個操作數(shù)是NaN,相等操作符返回false急波,不相等返回true从铲。NaN不等于NaN。
    NaN<3 false
    NaN>=3 false
  • 兩個操作數(shù)是對象澄暮,比較是否是同一個對象名段。

全等和不全等 僅比較不轉(zhuǎn)換

條件操作符

variable = bollean_expression ? true_value : false_value;

賦值操作符

= += -= *= /= %= <<= >>= >>>=

逗號操作符

var num1=1,num2=2,num3=3;
var num=(2,4,5,6,7) //返回最后一個

語句

if語句

if(a>b){
    alert("aaa");
}else if(i<0){
    alert("aaa");
}else{
    alert("aaa");
}

if (condition) statement1 else statement2

do-while語句

do{
    statement
}while(expression);

while語句

while(expression) statement

for語句

for (initialization; expression; post-loop-expression) statement
for (;;;) statement 無限循環(huán)

for-in 語句
枚舉對象屬性,確認對象是不是或者undefined

for (property in expression) statement

label語句

label:statement

break和continue語句
可以返回標簽

with語句

with(expression) statement
with(location){
    var qs =  qs
    var hostname = hostname
}
var qs = location.qs
var hostname = location.qs

switch語句 每句要break

switch(i){
    case 25:
        alert("25");
        break;
    case 35:
        alert("35");
        break;
    default:
        alert("other");
}

如果不寫break,就會合并2個的情況泣懊。

函數(shù)


function functionName(arg0,arg1,...,argN){
    statements
}

return語句停止并立即退出伸辟,之后的語句不會執(zhí)行。

ECMAScript函數(shù)不介意傳遞進來多少個參數(shù)馍刮,也不建議是什么數(shù)據(jù)類型信夫。
arguments[0]可以獲取第一個參數(shù),并且時時保持同步。arguments.length確定傳遞進來多少參數(shù)静稻【唬可以重寫argument對應(yīng)的值。如果沒有賦值振湾,那就是undefined惠奸。

沒有重載

后面的函數(shù)覆蓋前面的

第四章 變量、作用域和內(nèi)存問題

基本類型和引用類型

動態(tài)屬性

var person = new Object();
person.name = "abc";
alert(person.name); //"abc"

var name ="abc";
name.age =24;
alert(name.age); //undefied

不能給基本類型的數(shù)值添加屬性恰梢。

復(fù)制變量值

基本類型的數(shù)值復(fù)制佛南,兩個變量相互獨立。
引用類型對象復(fù)制嵌言,復(fù)制的為指針嗅回。

傳遞參數(shù)

所有函數(shù)的參數(shù)傳遞是按照數(shù)值傳遞。

function setName(obj){
    obj.name = "Nicholas";
    obj = new Object();
    obj.name = "Greg";
}

var person = new Object();
setName(person);
alert(person.name)   //"Nicholas"

內(nèi)部的obj被賦予了其他的指針摧茴。

檢測類型

基本類型使用 typeof
引用類型 result = variable instanceof constructor

執(zhí)行環(huán)境及作用域

在web瀏覽器中绵载,全局執(zhí)行環(huán)境是windows對象。
代碼在環(huán)境中執(zhí)行苛白,會創(chuàng)建變量對象的作用域鏈娃豹。
內(nèi)部環(huán)境可以通過作用域鏈訪問外部環(huán)境,但是外部環(huán)境不能訪問內(nèi)部環(huán)境中的變量和函數(shù)购裙。

延長作用域鏈

try-catch語句的catch塊
with語句
這兩個語句都會在作用域鏈前端添加一個變量對象懂版。對于with語句來說,會將指定的對象添加到作用域鏈中躏率。對catch語句來說躯畴,會創(chuàng)建一個新的變量對象,其中包含的是被拋出的錯誤對象的生命薇芝。

沒有塊級作用域

在括號內(nèi)的if或者for的變量是全局變量蓬抄,不是局部變量。
在函數(shù)內(nèi)夯到,var是局部嚷缭,不添加var是全局
查詢標識符,由內(nèi)部到外部耍贾。找到這個變量阅爽。

垃圾收集

以后再說標記清除、引用計數(shù)逼争、性能問題优床、管理內(nèi)存

第五章引用類型

Object 類型

創(chuàng)建對象

var person = new Object()
//對象字面量表示法
var person = {
    name:"aaa";
    age:29
}
var person = {
    "name":"aaa";
    "age":29
}
//對象最后不能加逗號
var a = {} //與new Object()相同

訪問屬性

person['name'] //可以用空格非數(shù)字,變量誓焦,關(guān)鍵字
person.name

Array 類型

var colors = new Array()
var colors = new Array(20) //預(yù)先知道長度
var colors = new Array("a","b","c") 
var colors = Array(3) //3項 
var colors = Array("aa")
var colors = Array(3) // 省略new 操作
var names = ['a','b'] //字面量法胆敞,
var names = [1,2,] //不要這樣
var names = [,,,] //也不要這樣
colors[0] //顯示第0項着帽,也可以修改,或者對新的項新增移层。
colors.length  //顯示長度
colors[colors.length] = "a" //添加新項

value instanceof Array 檢測數(shù)組仍翰,一個環(huán)境
Array.isArray(value) 確定到底是不是數(shù)組,不管哪個環(huán)境

轉(zhuǎn)換方法

array.valueof() 返回數(shù)組观话,對每一項toString
toLocaleString()
toString() 返回數(shù)組每個值的字符串形式拼接而成的一個以逗號分隔的字符串
array.join("|")

棧方法

后進先出LIFO(last in first out)
array.push(1,2,3) 返回修改后數(shù)組長度
array.pop() 返回移除的數(shù)組

隊列方法

先進先出FIFO(first-in-first-out)
array.push(1予借,2,3)
array.shift()

前進后出
array.pop()
array.unshift

重新排列方法

array.reverse() 反序
array.sort(function compare(value1,value2){return value2-value1})

function compare(value1,value2){
    if(value1 < value2){
        return -1;
    }   else if (value1 > alue2){
        return 1;
    }   else    {
        return 0
    }
}

操作方法

array.concat([a,b,c])組合成新數(shù)組,沒有參數(shù)的時候频蛔,只是返回副本灵迫。
array.slice(1,3) 按照python那種方式提取數(shù)組,不會影響原始數(shù)組
array.splice(1,0,[1,2]) 刪除晦溪、插入瀑粥、替換數(shù)組

位置方法

indexOf(4,4) 可以查找某個東西的位置,帶參數(shù)從那個位置開始找三圆。
lastIndexOf()

迭代方法

  • every() 每項運行都運行函數(shù)狞换,每一項都返回true,則返回true
  • filter() 返回true的組成新數(shù)組
  • forEach() 每一項運行給定函數(shù)舟肉,沒有返回值
  • map() 返回每次調(diào)用函數(shù)的結(jié)果
  • some() 任何一項返回true修噪,就返回true
    function(item,index,array){
    return(item>2);
    }

歸并方法

reduce() reduceRight()

var values = [1,2,3,4,5]
var sum = values.reduce(function(prev,cur,index,array){
    return prev+cur
})

DATE類型

var now = new Date() 創(chuàng)建日期當前對象,可傳入1970.1.1的毫秒數(shù)
var someDate = new Date(Date.parse("May 25, 2005")) 按照日期格式轉(zhuǎn)換
var someDate = new Date(Date.UTC(2005,4,5,17,55,55)) 按照0的基數(shù)
var start = Date.now() 取得當前時間
valueOf返回毫秒表示路媚,方便比較
toString和toLocalString 返回字符串

RexExp類型

暫缺

Function類型

function sum(num1, num2){
return num1 + num2
}
var sum = function(num1,num2){
return num1 + num2;
};
末尾分號

沒有重載

函數(shù)聲明與函數(shù)表達式

率先讀取聲明黄琼,讀取到規(guī)定地方才讀取表達式
function sum(sum1, sum2){} //這是聲明,函數(shù)聲明提升
var sum = function (){} //這是表達式

作為值的函數(shù)

把一個函數(shù)作為另一個函數(shù)的結(jié)果返回.return function(){}

函數(shù)內(nèi)部屬性

arguments 傳入對象的所有參數(shù)
this 執(zhí)行環(huán)境,在不同的環(huán)境表示
arguments.callee 是函數(shù)自己 比如階乘可以用
caller 保存著調(diào)用當前函數(shù)的函數(shù)引用磷籍。

function outer(){
    inner()
}
function inner(){
    inner.caller;  //outer();
}

arguments.callee.caller 更松散的耦合

函數(shù)的屬性和方法

length 函數(shù)希望接收的命名參數(shù)的個數(shù)
prototype 屬性适荣,不可枚舉,for-in無法發(fā)現(xiàn)
apply() 可以擴充作用域院领,在特定作用域中調(diào)用函數(shù)
call() 與apply作用相同,區(qū)別是接受參數(shù)的方式不同够吩,傳遞的參數(shù)必須枚舉出來

function sum(num1,num2){
    return num1+num2
}
function callSum1(num1,num2){
    return sum.apply(this,arguments);
}
function callSum2(num1,num2){
    return sum.apply(this,[num1,num2]);
}
function callSum3(num1,num2){
    return sum.call(this,num1,num2);
}
擴充作用域
window.color = "red"
var o = {color:blue}
function saycolor(){alert(this.color)}
saycolor.call(0)

bind() 綁定作用域

window.color = "red"
var o ={color:"blue"}
function sayColor(){
    alert(this.color)
}
var objectSayColor  = sayColor.bind(o);
objectSayColor(); //blue 

基本包裝類型

var s1 = "some text"
var s2 = s1.substring(2);

實際上完成的是以下操作
var s1 = new String("some text");
var s2 = s1.substring(2)
s1 = null

Boolean類型

因為所有對象會轉(zhuǎn)換成true比然,所以用處不大。
valueOf() 返回基本類型true和false
toString() 返回字符串true
typeof基本類型會返回boolean周循,引用類型返回object强法,理解引用關(guān)系非常重要。
永遠不要使用Boolean 對象

Number類型

var numberObject = new Number(10)
valueOf()返回基本類型的數(shù)值
toLocalString和toString返回字符串形式
num.toFix(2) 返回指定小數(shù)位湾笛,四舍五入
typeof基本類型返回number
typeof引用類型返回object

String類型

valueOf toString toLocalString 返回字符串
使用toString用于將數(shù)值格式化為字符串方法

字符方法
stringValue.charAt(1) //訪問指定位置
stringValue.charCodeAt(1) //訪問指定位置的編碼
stringValue[1] //訪問指定位置
操作方法
stringValue.concat("world") //字符串連接
slice substr substring //子字符串

indexOf lastIndexOf //位置方法
trim() //刪除空格
toLowerCase toUpperCase //大小寫轉(zhuǎn)換
match() //接收正則表達式或者RegExp對象
search() //接收正則表達式或者REgExp對象 返回第一個匹配是索引
replace() //替換 可以用正則表達式
localeCompare() //方法

單體內(nèi)置對象

Golbal對象

URL編碼方法
encodeURI() //整個URL編碼饮怯,不會對本身屬于URL字符編碼冒號斜杠
encodeURLComponent() //對一段編碼,對任何非標準字符編碼嚎研。
decodeURL()
decodeURLComponent() 解壓

eval方法
解析語句

Golbal對象屬性
各種類型蓖墅,構(gòu)造函數(shù),錯誤,日期论矾,regexp等

windows對象
訪問Global對象教翩,Web瀏覽器都是將這個全局對象作為windows對象實現(xiàn)。

Math對象

底數(shù)贪壳,自然數(shù)饱亿,最大值,最小值闰靴,四舍五入彪笼,隨機數(shù)

第六章 面向?qū)ο蟮某绦蛟O(shè)計

var person = new Object();
person.name = "abc";
person.sayName = function(){
    alert()
}

var person = {
    name:"abc",
    age:29.
    sayName:function(){
        alert(this.name);
    }
}

屬性類型

數(shù)據(jù)屬性
[[Configurable]] 能否刪除重新定義
[[Enumerable]] 能否通過for-in 循環(huán)返回屬性
[[writable]]
[[Value]] 這個屬性的數(shù)值

Object.defineProperty(aaa,"name",{
    writable:false,
    value:"aaaa"
})

訪問器屬性
[[Configurable]] 能否刪除重新定義
[[Enumerable]] 能否通過for-in 循環(huán)返回屬性
[[get]]讀取屬性調(diào)用的函數(shù)
[[set]]寫入屬性調(diào)用的函數(shù)

aaa._age=87;

Object.defineProperty(aaa,"age",{
    get:function(){
        return this._age;
    },
    set:function(newValue){
        this._age=newValue;
    }
})

aaa.age=88
alert(aaa.age)

定義多個屬性

var book={};
Object.defineproperties(book,{
    _year:{
        value:2004
    },
    edition:{
        value:1;
    }
}
)

讀取屬性的特性
Object.getOwnPropertyDescriptor(book,"year")
如果是訪問屬性,那么是configurable,enumerable,get,set
如果是數(shù)據(jù)屬性蚂且,那這個對象屬性有configurable\enumerable\writable和value
var descriptor = Object.getOwnPropertyDescriptor(book,"_year");
descriptor.value

創(chuàng)建對象

工廠模式

function createObject(name,age,job){
    var person = new Object;
    person.name = name;
    person.age = age;
    person.job = job;
    person.sayName = function(){
        alert(this.name)
    }
    return person;
}

無法解決對象識別問題

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

function Person(name,age,job){
    this.name=name;
    this.age=age;
    this.job=job;
    this.sayName = function(){
        alert(this.name);
    }
}
var person1= new Person("johnny",18,"workker")

沒有顯式創(chuàng)建對象配猫,直接將屬性和方法賦給this對象,沒有return語句膘掰。構(gòu)造函數(shù)要大寫章姓。
person1.constructor == Person //true
person1 instanceof Person //true
每次執(zhí)行方法,都要重建一次识埋。兩個創(chuàng)造出來的sayname不相同凡伊。把函數(shù)移到外面,但是沒有封裝了窒舟。

原型模式

function Person(){}

Person.prototype.name = "Johnny"
Person.prototype.age = 20
Person.prototype.job = "Software Engineer"
Person.prototype.sayName = function(){
    alert (this.name);
}

var person1 = new Person()
person1.sayName();
var person2 = new Person()
person2.sayName();
alert(person1.sayName == person2.sayName); //true 

Person.prototype.isPrototypeOf(person1) //true
Object.getPrototypeOF(person1).name //"Johnny"

無法通過對象實例重寫原型中的值系忙,重寫之后會給實例添加屬性,卻不能改寫原型惠豺。使用delete刪除屬性银还,從而回復(fù)對原型的訪問。使用person1.hasOwnProperty('name') 是否存在于實例中洁墙。

原型與in操作符
如果對象能通過原型或者實例訪問到屬性蛹疯,in返回true。

確定是原型中的屬性热监。

function hasPrototypeProperty(object,name){
    return !object.hasOwnProperty(name) && (name in object);
}

使用for-in循環(huán)捺弦,返回的是所有能夠通過對象訪問的、可枚舉屬性孝扛,既包括存在于實例中的屬性列吼,也包括存在于對象中的屬性。

原型簡寫

function Person(){}
Person.prototype = {
    constrotor : Person,
    name:"abc", 
    sayName : function(){
        alert(this.name);
    }
}
Object.defineProperty(Person.prototype,"constructor",{
    enumerable:false,
    value:Person
}
);

取得對象上可枚舉實例的屬性

var keys = Object.keys(Person.prototype);
alert(keys);  //"name,age,job,sayName"

取得所有實例的屬性苦始,無論是否可枚舉

Object.getOwnPropertyNames(Person.prototype);

要不然constructor無法確定對象類型寞钥。但是變成可枚舉的enumerable。

更簡單的原型語法

function Person(){}
Person.prototype = {
    constructor:Person,
    name:"Nicho",
    
    age:18,
    sayName:function(){
        alert(this.name);
    }
};

這樣從這里創(chuàng)建的新對象的constructor就不再指向Person了陌选。所以要重寫constructor.但是會導(dǎo)致constructor 的Enumerable特性被設(shè)置成true理郑。

Object.defineProperty(Person.prototype,"constructor",{
    enumerable:false,
    value:Person
})

原型的動態(tài)性
重寫一個原型屬性可以蹄溉,但是重寫整個原型會導(dǎo)致指向他的實例失去屬性。

原型對象問題
沒有傳遞參數(shù)香浩,共享本性类缤。

原型對象的問題
所有的實例在默認情況下都使用相同的屬性。

組合使用構(gòu)造函數(shù)模式和原型模式邻吭。

function Person(name, age, job){
    this.name = name;
    this.age=18
}
Person.prototype={
    constructor:Person,
    sayName:function(){
        alert(this.name);
    }
}

使用最廣泛餐弱、認同度最高

動態(tài)原型模式

function Person(name,age,job){
    this.name = name;
    this.age = age;
    this.job = job;
    if (typeof this.sayName != "function"){
        Person.prototype.sayName = function(){
            alert(this.name);
        }
    }
}

不能使用對象字面量重寫原型,會切斷聯(lián)系囱晴。

寄生構(gòu)造模式

先不看了

穩(wěn)妥構(gòu)造模式

先不看了

繼承

 function SuperType(){
    this.property = true;
}

SuperType.prototype.getSuperValue = function(){
    return this.property
}
function SubType(){
    this.subproperty = false
}

SubType.prototype = new SuperType();

SubType.prototype.getSubValue = function(){
    return this.subproperty;
}

var instance = new SubType();
alert(instance.getSuperValue())

//確定原型和實例的關(guān)系
instance instanceof Object
instance instanceof SuperType
instance instanceof SubType
Object.prototype.isPrototypeOf(instance)
SuperType.prototype.isPrototypeOf(instance)
SubType.prototype.isPrototypeOf(instance)

謹慎定義方法膏蚓,覆蓋方法,給原型添加方法一定要放在替換語句之后畸写。
重寫subtype會阻斷與super之間的聯(lián)系驮瞧。
不能通過字面量添加新方法,這樣會重寫原型枯芬。

SubType.prototype  = {
    getSubValue:function(){
        return this.subproperty;
    },
    
    someOtherMethod: function(){
        return false;
    }

}

問題1 论笔,引用類型的原型,原型會變成另一個類型的實例千所,實例對原型的修改狂魔,提現(xiàn)在了其他的實例上。在創(chuàng)建子類型的時候淫痰,不能向超類型的構(gòu)造函數(shù)傳遞參數(shù)最楷。

借用構(gòu)造函數(shù)?待错?籽孙?

function SuperType(name){
this.color = [1,2,3,"name"]
}
function SubType(){
SubType.call(this,"haha");
}
var instance1 = new SubType();
instance1.push("black")
var instance2 = new SubType();
instance2.color //沒有變化

可以傳遞參數(shù).缺點都在構(gòu)造函數(shù)中定義,無法重復(fù)使用火俄,超類型中定義的方法犯建,在子類型中不可見。

組合繼承瓜客?胎挎??忆家?

function SuperType(name){
this.name = name;
this.colors = ["red","blue","green"];
}
SuperType.prototype.sayName = function(){
alert (this.name);
}
function SubType(name,age){
SuperType.call(this,name);
this.age = age;
}

SubType.prototype = new SuperType();
SubType.prototype.constructor = SubType;
SubType.prototype.sayAge = function(){
alert(this.age);
}
var instance1 = new SubType("Nicholas",29);
instance1.color.push("black");
alert(instance1,colors); //四個顏色
instance1.sayName(); //nigulasi
instance1.sayAge(); //29

var instance1 = new SubType("aaa",28);
instance1.color.push("black");
alert(instance1,colors); //三個顏色
instance1.sayName(); //aaa
instance1.sayAge(); //28

既避免了原型鏈和借用構(gòu)造函數(shù)的缺陷,又融合了有點德迹,是最常用的繼承模式芽卿。

原型式繼承

寄生式繼承

寄生組合式繼承

第七章 函數(shù)表達式

函數(shù)聲明,函數(shù)聲明提升胳搞。
函數(shù)表達式卸例,類似于賦值語句称杨。

遞歸

arguments.callee 返回函數(shù)本身,多用于遞歸筷转。

閉包

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末姑原,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子呜舒,更是在濱河造成了極大的恐慌锭汛,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件袭蝗,死亡現(xiàn)場離奇詭異唤殴,居然都是意外死亡,警方通過查閱死者的電腦和手機到腥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門朵逝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人乡范,你說我怎么就攤上這事配名。” “怎么了晋辆?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵渠脉,是天一觀的道長。 經(jīng)常有香客問我栈拖,道長连舍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任涩哟,我火速辦了婚禮索赏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贴彼。我一直安慰自己潜腻,他們只是感情好,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布器仗。 她就那樣靜靜地躺著融涣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪精钮。 梳的紋絲不亂的頭發(fā)上威鹿,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音轨香,去河邊找鬼忽你。 笑死,一個胖子當著我的面吹牛臂容,可吹牛的內(nèi)容都是我干的科雳。 我是一名探鬼主播根蟹,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼糟秘!你這毒婦竟也來了简逮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤尿赚,失蹤者是張志新(化名)和其女友劉穎散庶,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吼畏,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡督赤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了泻蚊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躲舌。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖性雄,靈堂內(nèi)的尸體忽然破棺而出没卸,到底是詐尸還是另有隱情,我是刑警寧澤秒旋,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布约计,位于F島的核電站,受9級特大地震影響迁筛,放射性物質(zhì)發(fā)生泄漏煤蚌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一细卧、第九天 我趴在偏房一處隱蔽的房頂上張望尉桩。 院中可真熱鬧,春花似錦贪庙、人聲如沸蜘犁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽这橙。三九已至,卻和暖如春导披,著一層夾襖步出監(jiān)牢的瞬間屈扎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工撩匕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留助隧,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像并村,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子滓技,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

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