摘要:布爾值在編程中,和是經(jīng)常出現(xiàn)的兩個(gè)值。對(duì)布爾值可以執(zhí)行與或及非或叫取反操作。假如和是布爾值只有在和都為真的情況下為真。如果想用十六進(jìn)制表示整數(shù),在數(shù)值前面加上采用十六進(jìn)制記號(hào)不能表示分?jǐn)?shù),也不能使用科學(xué)計(jì)數(shù)法。
3.1 數(shù)據(jù)類型
JavaScript實(shí)際上有6種數(shù)據(jù)類型;
布爾值,只有true和false兩個(gè)值
數(shù)值,比如 81 和 4.21
文本,JavaScript里稱之為字符串
特殊值undefined
特殊值null
對(duì)象
要了解一種數(shù)據(jù)類型,不僅要看它包含什么值,還要知道能對(duì)這種數(shù)據(jù)類型執(zhí)行什么操作。比如,對(duì)數(shù)值可以執(zhí)行四則運(yùn)算,取模求冪等,對(duì)字符串可以執(zhí)行去空格、切分、反序和大寫首字符操作。本章將介紹JavaScript的所有數(shù)據(jù)類型,以及與這些類型相關(guān)的各種操作。3.2 布爾值
在編程中,true和false是經(jīng)常出現(xiàn)的兩個(gè)值。
var open = true var ready = false var gameOver = false var friendy = true var enabled = true
這兩個(gè)值有時(shí)候也會(huì)以比較結(jié)果的形式出現(xiàn)。所謂比較,就是計(jì)算一個(gè)值是等于===、不等于!==、小于<、小于等于<=、大于>,還是大于等于>=另一個(gè)值。
alert(137===5); // false alert(8!==3.0); // true alert(2<=2); // true var x = 16 > 8; alert(x); // true
這些值叫做布爾值。對(duì)布爾值可以執(zhí)行&&(與)、||(或)及!(非或叫取反)操作。假如x和y是布爾值:
x && y 只有在x和y都為真的情況下為真。即真真為真,短路:因比較運(yùn)算為左結(jié)合運(yùn)算,若x為假,&&后面表達(dá)式不執(zhí)行
x || y y或x有一個(gè)為真的情況下即為真。即一真為真,短路:若x為真,則短路跳出,||后面表達(dá)式不執(zhí)行
!x 只有在x非真情況下為真
代碼補(bǔ)充:
console.log(4 < 5 && 15 === 6); // false console.log(1 === 2 || 15 > -5); // true console.log(!(3 <= 10)); // false console.log(true && 3+2) // result:5 第一個(gè)表達(dá)式為真,則對(duì)第二表達(dá)式計(jì)算 console.log(false && 3+2) // result:false 第一個(gè)表達(dá)式為假,則短路跳出,不計(jì)算第二表達(dá)式 console.log(false || 5+5) // result:10 第一個(gè)表達(dá)式為假,繼續(xù)檢查,執(zhí)行第二表達(dá)式 console.log(true || 5+5) // result:true 第一個(gè)表達(dá)式為真,短路跳出,不計(jì)算第二表達(dá)式小練習(xí)
!(true && !false && true) || false // false false || true && false // false
證實(shí)或證否:如果x和y保存的都是布爾值,那么!(x && y) 一定等于 (!x == !y)
第三題,可畫圖,排列組合出所有可能便可證為實(shí),總之&&:一旦有假則為假,||:一旦有真則為真
接下來介紹數(shù)值類型。在JavaScript中,數(shù)值就跟你想象一樣,該怎么寫就怎么寫:1729、3.141592或者299792458。如果兩個(gè)數(shù)值之間有一個(gè)E(或e),那么整個(gè)數(shù)就等于前面那個(gè)數(shù)乘以10后面那個(gè)數(shù)次冪(就是科學(xué)計(jì)數(shù)法- -)
3.3.1 數(shù)值運(yùn)算適用于數(shù)值的操作符包括+、-、*、/和%(求余也叫取模)。
針對(duì)數(shù)值可以執(zhí)行的其他運(yùn)算還有
Math.floor(x) 取得小于等于x的最大正整數(shù)
Math.ceil(x) 取得大于等于x的最小整數(shù)
Math.sqrt(x) 對(duì)x開方
Math.random(x) 得到一個(gè)大于等于0,小于1的數(shù)
Math.pow(x,y) 得到的是x的y次方
Math.floor(2.99); // 2 Math.floor(-2.99); // -3 Math.ceil(3.99); // 4 Math.ceil(-3.99); // -3 Math.sqrt(100); // 10 Math.pow(2,4); // 16 Math.random(); // x大于等于0,小于103.3.2 大小和精度限制
JavaScript的數(shù)值與大多數(shù)編程語言的數(shù)值一樣,不同于我們?nèi)粘K姷睦硐牖瘮?shù)值。首先,它們收到計(jì)算設(shè)備固定大小的物理元件的限制。因此,存在一個(gè)最大的數(shù)值(在JavaScript里這個(gè)值約為1.79e308)和一個(gè)最小的數(shù)值(-1.79e108)。任何計(jì)算得到超過最大數(shù)值或者小于最小數(shù)值,都會(huì)轉(zhuǎn)化為特殊值Infinity或者-Infinity。數(shù)值除了存在大小的限制,還存在精度限制,計(jì)算得到無法精確表達(dá)的數(shù)值時(shí),會(huì)轉(zhuǎn)換成最接近的可表示的數(shù)值。
console.log(12157692622039623539); // 12157692622039624000 console.log(12157692622039623539+1); // 12157692622039623539 console.log(1e200 === 1e200+1); // true console.log(4.18e-1000); // 0 console.log(0.1+0.2); // 0.30000000000000004 console.log(0.3 == 0.1+0.2) // false
很多腳本不會(huì)涉及這類似近似性問題,有的即便涉及也可以容忍。但在某些情況下,精度達(dá)不到要求真的會(huì)導(dǎo)致問題(比如金融方面的數(shù)值)。因此,我們應(yīng)該對(duì)什么情況下可能出現(xiàn)精度不夠的問題有個(gè)心里預(yù)期。如以下幾點(diǎn),
可表示的數(shù)值密集度集中在0左右,事實(shí)上有一多半都介于1和-1之間;離0越遠(yuǎn),就越稀疏。
所有介于正負(fù)9e15之間的數(shù)都可以精確表示,在這個(gè)范圍之外,只有部分整數(shù)可以表示。
涉及非常大的數(shù)值、非常小的數(shù)值或者非整數(shù)的計(jì)算,經(jīng)常會(huì)導(dǎo)致不準(zhǔn)確的結(jié)果。
如果需要用到最大可表示的值,可以調(diào)用表達(dá)式Number.MAX_VALUE。最?。?Number.MIX_VALUE保存著大于0的最小可表示值,即-2e1074 3.3.3 NaNNaN這個(gè)特殊值代表的是“Not a Number”,他會(huì)在數(shù)學(xué)計(jì)算得到了非數(shù)學(xué)意義上的結(jié)果時(shí)出現(xiàn):
console.log(0/0); console.log(Infinity*Infinity); console.log(Infinity-Infinity); console.log(NaN+16); console.log(NaN === NaN); // false
NaN不等于任何值,也不等于NaN
檢測(cè)一個(gè)值是否為數(shù)值,可用 isNaN() 方法。
console.log(0/0 === NaN); // false console.log(isNaN(0/0)); // NaN console.log(isNaN(2.398472398)); // false console.log(isNaN(NaN)); // true console.log(isNaN(Infinity)); // false3.3.4 十六進(jìn)制數(shù)值
JavaScript中的非負(fù)數(shù)也可以用十六進(jìn)制記號(hào)表示。十六進(jìn)制數(shù)值的計(jì)數(shù)規(guī)則是:0、1、2、3、4、5、6、7、8、9、A、B、C、D、F、10、11、12、......、19、1A、1B、......、1F...。如果想用十六進(jìn)制表示整數(shù),在數(shù)值前面加上0x:
alert(0x9) // 9 alert(0x9FA) // 2554 alert(-0xCafe) // -51966 alert(0xbad) // 2989
采用十六進(jìn)制記號(hào)不能表示分?jǐn)?shù),也不能使用科學(xué)計(jì)數(shù)法。
某些版本的JavaScript實(shí)現(xiàn)把以0開頭的整數(shù)當(dāng)做八進(jìn)制數(shù)值:0、1、2、3、...、7、10、11、...、17、20、21、...。
如下:
alert(07) // 7 alert(011) // 9 alert(-02773) // -15313.4 文本 3.4.1 字符、符號(hào)與字符集
字符就是有名字的符號(hào),比如:
加號(hào)
斯拉夫文字小型字母TSE
黑色的象棋騎士
梵文字母OM
MUSICAL SYMBOL DERMATA BELOW
不要混淆字符和符號(hào),符號(hào)是字符的表現(xiàn)形式。比如,符號(hào):K
拉丁字母大寫:K
希臘大寫字母:K(KAPPA)
梵文大寫字母:K(KA)
類似的,符號(hào):Σ
希臘大寫字母:Σ(SIGMA)
求和號(hào)
符號(hào):φ
帶斜線的拉丁大寫字母:O
直徑
空集
字符集由一組特定的字符組成,其中每個(gè)字符都有唯一的編號(hào),叫碼點(diǎn)(codepoint)。與大多數(shù)語言一樣,JavaScript使用unicode字符集。unicode字符集一般用十六進(jìn)制為每個(gè)字符編碼。
要了解全部碼點(diǎn),可訪問Unicode碼點(diǎn)
為什么要知道碼點(diǎn),因?yàn)樵贘avaScript中可以通過他們輸出鍵盤上沒有的字符。比如,下面的碼點(diǎn)可以輸出字符串"Привет"
"u041fu0440u0438u0432u0435u0442"
每個(gè)字符以u(píng)開頭,后跟代表該字符碼點(diǎn)的四位十六進(jìn)制數(shù)字。此外,也可以用x開頭跟兩位十六進(jìn)制數(shù)字表示字符。比如,字符串"o1é"可以有以下兩種表示法:
"o1xc9"
"o1u00c9"
有些字符不會(huì)顯式出來,所以必須用使用碼點(diǎn)表示法。比如"從左到右標(biāo)記"(u200e)、"從右到左標(biāo)記"(u200f)和"零寬度非中斷空白"(ufeff)"。其中,前兩個(gè)字符會(huì)出現(xiàn)在混合了從左到右閱讀的文字(英語,西班牙語)與從右到左(希伯來和阿拉伯語)閱讀的文字的文檔中。
轉(zhuǎn)義序列:
如:
" 單引號(hào)
" 雙引號(hào)
xhh hh是兩位十六進(jìn)制值,相應(yīng)字符的碼點(diǎn)
uhhhh hhhh是四位十六進(jìn)制值,也是相應(yīng)字符碼點(diǎn)
、 、、f、 、v 換行符、制表符、退格符、進(jìn)紙符、回車符、制表符
反斜杠本身
反斜杠不僅用于通過碼點(diǎn)來表示字符,而且也用于與后續(xù)字符組織成所謂的轉(zhuǎn)義序列。
換行符n導(dǎo)致后面的字符出現(xiàn)在下一行,t制表符表示按列對(duì)齊文本。如:
alert("1. f3 e5 2. g4 u265bh4++")
u加碼點(diǎn)的方式只在JavaScript代碼中有效。如果想在HTML文檔顯示字符,則需要在碼點(diǎn)兩側(cè)分別加上和分號(hào);
字符 JavaScript表示法 HTML表示法 黑旗皇后 u265b ♛ 骰子1 u2680 ⚀ 骰子2 u2681 ⚁ 藏文 u0f5c ཛྷ
一個(gè)擲骰子的程序,隨機(jī)生成0~6中一個(gè)數(shù)。因?yàn)?strong>骰子六面的字符在Unicode中的碼點(diǎn)為2680~2685。 由于程序非常短,所以才把程序嵌入到了HTML文檔中。如果代碼比較長(zhǎng),請(qǐng)把它們轉(zhuǎn)移到多帶帶的文件中。樣式規(guī)則也一樣,因?yàn)檫@里只有一條規(guī)則,我們才把它放到了文檔頭部。大型頁面中,所有樣式規(guī)則也應(yīng)該保存在一個(gè)多帶帶的文件匯總。這樣,文檔的結(jié)構(gòu)、樣式、行為才能各安其位,相互分離。在軟件工程中,關(guān)注點(diǎn)分離是一個(gè)非常重要的思想。 3.4.2 字符串操作
JavaScript支持很多種字符串操作,比如查詢字符串長(zhǎng)度(即字符數(shù))、字母的大小寫轉(zhuǎn)換以及替換字符串中某一部分,等等。
console.log("Hello, there".length); // 12 console.log("Hello,there".toLowerCase()); // hello,there console.log("Hello,there".toUpperCase()); // HELLO,THERE console.log("Hello,there".replace("ello","i")); // Hi,there
Sometimes,你可能想知道某個(gè)字符在字符串的哪個(gè)位置,或者某個(gè)位置上是哪個(gè)字符。JavaScript字符串的第一索引為0,第二個(gè)字符的索引為1,第三個(gè)為2,以此類推。要知道字符串s中位置為p的字符,可以使用表達(dá)s.charAt(p)。要定位字符串中文本的位置,可以使用indexOf和lastIndexOf。表達(dá)式s.substring(x,y)會(huì)得到字符串s中,從位置x開始直到(但不包含)位置y的所有字符。
"Some text".charAt(2) // "m" var str = "Some text"; str[str.length-1]; // "t" 可獲取任意字符串最后一個(gè)字符(包含空格) "Some text".indexOf("me") // 2 返回某個(gè)指定的字符串值在字符串中首次出現(xiàn)的位置 "Some text".lastIndexOf("e") // 6 返回一個(gè)指定的字符串值最后出現(xiàn)的位置,從后向前搜索 alert("Some text".substring(3,0)) // "e te" 返回上標(biāo)(包括)至下標(biāo)(不包括)之間的字符
操作符+用于拼接兩個(gè)字符串....略
String 對(duì)象的方法 slice()、substring() 和 substr() (不建議使用)都可返回字符串的指定部分。slice() 比 substring() 要靈活一些,因?yàn)樗试S使用負(fù)數(shù)作為參數(shù)。slice() 與 substr() 有所不同,因?yàn)樗脙蓚€(gè)字符的位置來指定子串,而 substr() 則用字符位置和長(zhǎng)度來指定子串。 substr(start,length)必需。一個(gè)非負(fù)的整數(shù),規(guī)定要提取的子串的第一個(gè)字符在 stringObject 中的位置
可選。子串中的字符數(shù)。必須是數(shù)值。如果省略了該參數(shù),那么返回從 stringObject 的開始位置到結(jié)尾的字串
var str = "Hello World"; console.log(str.substr(-3,5)) // "rld" 倒數(shù)第3個(gè)字符開始的5個(gè)字符 console.log(str.substr(1,-1)) // "" length參數(shù)必須為正整數(shù) console.log(str.substr(1,4)) // "ello" 正數(shù)第2個(gè)字符開始的4個(gè)字符 console.log(str.substr(2)) // "llo World" 正數(shù)第2個(gè)字符開始到結(jié)尾所有字符
Test中,參數(shù)start可為負(fù)整數(shù),與W3C描述不同,待驗(yàn)證
slice(start,end)要抽取的片斷的起始下標(biāo)。如果是負(fù)數(shù),則該參數(shù)規(guī)定的是從字符串的尾部開始算起的位置。也就是說,-1 指字符串的最后一個(gè)字符,-2 指倒數(shù)第二個(gè)字符,以此類推
緊接著要抽取的片段的結(jié)尾的下標(biāo)。若未指定此參數(shù),則要提取的子串包括 start 到原字符串結(jié)尾的字符串。如果該參數(shù)是負(fù)數(shù),那么它規(guī)定的是從字符串的尾部開始算起的位置
var str = "Hello World"; console.log(str.slice(1,4)) // "ell" 第2個(gè)字符,到第5個(gè)字符的前一個(gè)字符,參數(shù)end本身并不包含 console.log(str.slice(-5,-2)) // "Wor" 倒數(shù)第5個(gè)字符,到倒數(shù)第二個(gè)字符前一個(gè)字符,和正數(shù)同理 console.log(str.slice(3)) // "lo World" 不指定參數(shù)end,提取到結(jié)尾字符串 console.log(str.slice(-(str.length-1))) // "ello World" 倒數(shù)也同上substring(start,stop)
必需。一個(gè)非負(fù)的整數(shù),規(guī)定要提取的子串的第一個(gè)字符在 stringObject 中的位置
可選。一個(gè)非負(fù)的整數(shù),比要提取的子串的最后一個(gè)字符在 stringObject 中的位置多 1。如果省略該參數(shù),那么返回的子串會(huì)一直到字符串的結(jié)尾
var str = "Hello World"; console.log(str.substring(2,7)); // "llo W" 從索引為2到索引為7之間的字符(不包括索引7的字母) console.log(str.substring(-3,2)); // "He" start參數(shù)不識(shí)別負(fù)數(shù),從頭部開始選擇 console.log(str.substring(3)) // "lo World" 索引為3的字符后所有字符,因?yàn)槲粗付╯top參數(shù) console.log(str.substring(4,-2)) // "Hell" 選擇從頭部首字符至索引為4的字符前一個(gè)字符,stop參數(shù)不能識(shí)別負(fù)數(shù)3.5 undefined與null
一般來說,我們都希望通過編程得到一些實(shí)際效果,比如某個(gè)東西的成本多少(數(shù)值),游戲中某個(gè)玩家是否處于活動(dòng)狀態(tài)(布爾值)或者你輔導(dǎo)員的名字(字符串)。不過,在某些情況下,我們也需要知道某個(gè)數(shù)據(jù)不存在,或者某個(gè)數(shù)據(jù)不可靠。就以輔導(dǎo)員為例,有幾個(gè)問題來表示:
我有個(gè)輔導(dǎo)員,她名叫Alice
我壓根就沒有輔導(dǎo)員
我可能有也可能沒有輔導(dǎo)員,我真的不知道
我不知道自己有沒有輔導(dǎo)員,不過我不介意讓別人知道這件事
JavaScript為表示第二種情況提供了null,為第三種情況提供了undefined。
var supervisor = "Alice"; // 輔導(dǎo)員是Alice var chief = null; // 肯定沒有輔導(dǎo)員 var assistant = undefined; // 可能有助理3.6 對(duì)象 3.6.1 對(duì)象基礎(chǔ)
在JavaScript中,所有不是布爾值、數(shù)值、字符串、null和undefined的值,都是對(duì)象。對(duì)象有屬性,屬性有值。屬性名可以是字符串(位于引號(hào)內(nèi)),也可是非負(fù)整數(shù)(0、1、2...)。屬性值也可以是對(duì)象,可以定義復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。對(duì)象字面量是一種定義的表達(dá)式,如:
var dress = { size:4, color:"green", brand:"DKNY", price:834.95 }; var Location = { latitude:31.131013, longitude:29.976977 }; var part = { "serial number":"367DRT2219873X-785-11P", description:"air intake manifold", "unitr cost":29.95 }; var p = { name:{first:"Sean",last:"O" Brien"}, country:"Ireland", birth:{year:1981,month:2,day:17}, kidNames:{1:"Ciara",2:"Bearach",3:"Mairead",4:"Aisling"} };
定義對(duì)象之后,可以使用點(diǎn)或方括號(hào)讀取屬性的值。
p.country; // "Ireland" p["country"]; // 方括號(hào)內(nèi)屬性名必須加引號(hào) p:birth.year; // 1981 p.birth["year"]; // 1981 p["birth"].year; // 1981 p["birth"]["year"]; // 1981 p.kidNames[4]; // "Aisling" p["kidNames"][3] // "Aisling"
用點(diǎn)號(hào)訪問屬性的方式雖然簡(jiǎn)潔,卻不能用于讀取以整數(shù)命名的屬性(比如不能用"a.1"),在ES3中也不能讀取以JavaScript保留字命名的屬性。這時(shí)候,就要使用方括號(hào)表示法(a[10]、a["var"])。方括號(hào)表示法還適用于包含空格及其他非字母的屬性(part["serial number"]),對(duì)象屬性并非一成不變,可以隨時(shí)給對(duì)象添加或刪除屬性,如:
var dog = {}; // 將一個(gè)對(duì)象引用賦值給變量 dog.name = "Karl"; // 添加屬性1 dog.breed = "Rottweiler"; // 添加屬性2 console.log(delete dog.name); // 刪除屬性2,返回true console.log(dog.name); // undefined
在使用JavaScript開發(fā)Web應(yīng)用,構(gòu)成網(wǎng)頁的元素就是帶有屬性的對(duì)象。下面這個(gè)小程序演示這一點(diǎn),它通過每2秒隨機(jī)變換一次笑臉的位置在實(shí)現(xiàn)笑臉在瀏覽器中的跳躍。
JavaScript Temperature Converter ☺
這里的笑臉就是字符U+263a,嵌在了ID為face的div的元素中。作為對(duì)象,這個(gè)元素有一個(gè)style屬性,而這個(gè)屬性本身也是一個(gè)對(duì)象,又有
position、left和top等屬性。這段腳本通過setinterval每2000毫秒執(zhí)行一次move函數(shù)。樣式屬性left和top的值都是字符串,有幾種格式,其中一種就是288px這樣的屬性值,表示相對(duì)于窗口的偏移量。這個(gè)腳本每次運(yùn)行move函數(shù)都會(huì)重新設(shè)定樣式的值。JavaScript檢測(cè)到樣式變化就會(huì)刷新瀏覽器窗口。除非你關(guān)閉瀏覽器窗口或者打開了其他網(wǎng)頁,否則這個(gè)程序會(huì)一直運(yùn)行。
什么情況下必須使用方括號(hào)表訪問對(duì)象的屬性?
使用了不能作為標(biāo)識(shí)符的屬性名的情況
將變量的值作為屬性名使用的情況
將表達(dá)式的求值結(jié)果作為屬性名使用的情況
如下代碼會(huì)輸出什么,為什么?
var pet = { name:"Oreo", type:"Rat" }; alert(pet[name]);
Answer:方括號(hào)內(nèi)的值是屬性名的字符串,缺少引號(hào),將搜索name變量,但是并不存在此變量及相應(yīng)的值,所以將彈出undefined
3.6.2 理解對(duì)象引用對(duì)象與其他五種值(數(shù)值、字符串、布爾值、null、undefined)是不同的,其他五種值統(tǒng)稱基本類型值,對(duì)象與他們的區(qū)別主要表現(xiàn)在兩方面。雖然說起來有點(diǎn)嚴(yán)肅,但明白這兩點(diǎn)區(qū)別對(duì)于正確高效地使用對(duì)象至關(guān)重要,必須牢記。第一點(diǎn):
對(duì)象表達(dá)式的值并非對(duì)象本身,而是一個(gè)指向?qū)ο蟮囊谩?/strong>如圖示,基本類型值直接存儲(chǔ)在變量中,而對(duì)象不是。對(duì)象的值中存儲(chǔ)的是指向?qū)ο蟮囊?/strong>(變量b)。
由于對(duì)象的值其實(shí)是引用,所以把一個(gè)對(duì)象賦值給一個(gè)變量,實(shí)際上會(huì)產(chǎn)生該對(duì)象引用的一個(gè)副本,而不會(huì)賦值對(duì)象本身。換句話說,對(duì)象賦值不會(huì)產(chǎn)生新對(duì)象。想想看,對(duì)象的賦值與基本類型值賦值過程并沒有不同。變量間的賦值就是把保存一個(gè)盒子里的東西賦值一份再保存到另一個(gè)盒子中,而該盒子中存儲(chǔ)的可能是數(shù)值,也可能是一個(gè)引用。下圖表示基本類型賦值和對(duì)象賦值,可以想一想。
對(duì)象與其他類型值的第二個(gè)重要的區(qū)別是:
對(duì)同一個(gè)對(duì)象字面量的每次求值,都會(huì)產(chǎn)生一個(gè)新對(duì)象。
如上:腳本聲明了三個(gè)變量,創(chuàng)建了兩個(gè)對(duì)象。雖然兩個(gè)對(duì)象擁有相同的屬性,每個(gè)屬性的值也相同,但它們卻是兩個(gè)不同的對(duì)象,因此這個(gè)腳本會(huì)創(chuàng)建兩個(gè)對(duì)象。
關(guān)于變量只保存對(duì)象的引用而非對(duì)象這一點(diǎn),不僅在賦值的時(shí)候有所體現(xiàn),在等同性測(cè)試的時(shí)候也會(huì)有所體現(xiàn)。這兩種情況下,我們都必須搞明
白。對(duì)于測(cè)試表達(dá)式x===y,我們想知道x和y中等值是否相同。
var a = {x:1,y:2}; // 聲明對(duì)象字面量1 var b = a; // 將變量a引用對(duì)象的引用賦值給變量b var c = {x:1,y:2}; // 聲明對(duì)象字面量2 alert(a===b); // true alert(a===c); // false // 1. 即使兩個(gè)對(duì)象的內(nèi)部結(jié)構(gòu)相同,但是比較結(jié)果:false // 2. 相等運(yùn)算,比較的是引用的對(duì)象是否來自同一個(gè)對(duì)象,a、b變量引用同一個(gè)對(duì)象,全等運(yùn)算為:true // 3. 值得一提的是,a,b變量操作過程中,并沒有產(chǎn)生新對(duì)象 // 再次強(qiáng)調(diào)!對(duì)象相等運(yùn)算比較的是,引用對(duì)象來源是否是同一個(gè)對(duì)象
如下,一個(gè)對(duì)象可以同時(shí)被多個(gè)變量引用,因此通過其中任何一個(gè)變量都可以修改對(duì)象的屬性,也都可以查看修改后的結(jié)果。
小練習(xí):對(duì)表達(dá)式{x:1,y:2}=== {x:1,y:2}求值,解釋結(jié)果。
false:使用{}大括號(hào)就已經(jīng)聲明了對(duì)象字面量,本質(zhì)上和上面的變量a,c引用的對(duì)象是相同的,所過結(jié)果為假。
3.6.3 對(duì)象原型每個(gè)JavaScript對(duì)象都有一個(gè)暗藏的鏈接指向自己的原型對(duì)象(prototype),如果你讀取的的屬性不在對(duì)象本身上,那么JavaScript就會(huì)進(jìn)一步查詢這個(gè)對(duì)象的原型對(duì)象。如果在這個(gè)原型對(duì)象上也沒找到,還會(huì)進(jìn)一步查詢?cè)蛯?duì)象的原型對(duì)象,以此類推。這個(gè)原型鏈最后一個(gè)對(duì)象的暗藏鏈接,應(yīng)該指向null值。如果整個(gè)原型鏈都沒有你想讀取的屬性,那么你會(huì)看到一個(gè)錯(cuò)誤。
實(shí)際上,這里基于原型創(chuàng)建c1對(duì)象使用的是Object.create()。這是ES5定義的操作,在老版本JavaScript引擎中,還有一種基于原型創(chuàng)建對(duì)象愛的技術(shù),后面會(huì)繼續(xù)討論。
在需要定義大量相似對(duì)象時(shí),原型是非常有用的。下圖又基于一個(gè)原型創(chuàng)建了兩個(gè)新對(duì)象。其中一個(gè)完全沒有自己的屬性,因而它的屬性完全繼承原型對(duì)象。
小練習(xí):
說說什么是自有屬性,什么是繼承屬性。
字面意思先簡(jiǎn)單理解,自有屬性在自身,直接訪問,不需通過原型鏈。繼承屬性繼承自原型,通過_proto_向上查詢如果運(yùn)行protoCircle.radius = 5,那么訪問c1.radius和c2.radius結(jié)果發(fā)生什么?
c1.radius = 5,c2.radius = 15,原型的屬性改變,則凡是繼承它屬性的都會(huì)受到影響。c1,c2對(duì)象均繼承自原型,但是c2存在自有屬性,并未查詢?cè)?,所以讀取的是自有屬性。 3.6.4 自引用對(duì)象對(duì)象的屬性可以引用自身,兩個(gè)對(duì)象也可以通過屬性相互作用。但這種情況下,光靠對(duì)象字面量無法描述了。
于是先使用對(duì)象字面量創(chuàng)建對(duì)象的部分屬性,然后在通過賦值方式定義其他屬性。當(dāng)然也可以為彼此賦值。
3.7 數(shù)組數(shù)組是一種特殊的對(duì)象,它的屬性是從0開始的連續(xù)非負(fù)整數(shù),而且有一個(gè)名為length的對(duì)應(yīng)屬性。之所以說數(shù)組特殊,主要是因?yàn)椴荒苁褂贸R?guī)的對(duì)象字面量來創(chuàng)建它,必須使用另一種專用語法:
var a = []; var b =[8,false,[[null,9]]]; var numbers = [ "zero", "one", "two", "three", "four", "five", "six" ];
這種專用語法實(shí)際上是用來創(chuàng)建屬性0,1,2...,還有length的。當(dāng)然,length屬性也很特殊:為它賦值可以擴(kuò)大或縮小數(shù)組,那么新增屬性會(huì)被設(shè)定為undefined。另外,在超過數(shù)組長(zhǎng)度的某個(gè)位置上賦值也可以擴(kuò)大數(shù)組。
var a = [9,3,2,1,3]; // a[0]值為9,a.length等于5 a[20] = 6; // a[5]到a[19]的值都是undefined,a[20]說明有20 + a[0]個(gè)值,length:21 alert(a.length); // 21 a.length = 50; // a[21]到a[49]的值都是undefined a.length = 3; // a現(xiàn)在是[9,3,2]
基于某個(gè)分隔符拆分(split)字符串、切割(slice)現(xiàn)有數(shù)組都可以創(chuàng)建新數(shù)組,另外把兩個(gè)數(shù)組拼接(concat)起來也可以創(chuàng)建新數(shù)組。反之,把數(shù)組元素連接(join)起來可以創(chuàng)建一個(gè)由同一個(gè)分隔符分隔的字符串:
var s = "A red boat"; var a = s.split(" "); // a是["A","red","boat"] var b = [9,3,2,1,3,7]; var c = b.slice(2,5); // c是[2,1,3] var d = c.concat(a); // d是[2,1,3,"A","red","boat"] console.log(d.join("|")) // "2|1|3|A|red|blat"
注意,使用slice切割數(shù)組b中從位置2到位置5的元素,返回?cái)?shù)組是[ b[2],b[3],b[4] ]。換句話說,切割得到的數(shù)組包含位于切割起點(diǎn)的元素,不包含位于切割終點(diǎn)的元素;和substring截取字符串的操作相同。a.slice(x,y),則返回a[x]和a[y-1]構(gòu)成的數(shù)組。還有另外兩種slice操作:
var a = [9,4,1,7,8]; var b = a.slice(2); // a[2]開始到最后 var c = a.slice(); // 所有索引,得到a的副本
拆分字符串的split操作不會(huì)修改原字符串、切割(slice)、拼接(concat)和連接(join)數(shù)組元素也不會(huì)修改原數(shù)組。不過。確實(shí)有一些操作會(huì)修改數(shù)組對(duì)象本身。比如,可以使用push在數(shù)組末尾、使用unshift在數(shù)組開頭添加元素;反之,可以使用pop在數(shù)組末尾、使用shift在數(shù)組開頭刪除元素。另外,還可使用reverse反轉(zhuǎn)數(shù)組元素的順序,使用sort對(duì)數(shù)組元素進(jìn)行排序。這些會(huì)修改數(shù)組本身的操作為可變操作(mutator)。
var a = []; // a是長(zhǎng)度(length)為0的數(shù)組 var b = [3,5]; // length:2 b.push(2); // [3,5,2] b.unshift(7); // [7,3,5,2] a.push(3,10,5); // [3,10,5] a.reverse(); // [5,10,3] a.pop(); // [5,10] a.shift(); // [10] b.push(a[0],1); // [7,3,5,2,10,1] b.sort(); // [1,10,2,3,5,7] b.reverse(); // [7,5,3,2,10,1]
JavaScript默認(rèn)是將所有的數(shù)組元素都當(dāng)成字符串來排序的,就算數(shù)組中包含數(shù)值、布爾值、對(duì)象或別的數(shù)據(jù)也一樣。既然是按字符串排序,那排序標(biāo)準(zhǔn)就是字母表,因此字符串"1"小于"10",后者有小于"2"(就如同"foot"小于"football",后者又小于"goal")。實(shí)際上也可以按照數(shù)值進(jìn)行排序,具體后面章節(jié)會(huì)介紹。
把數(shù)組放到對(duì)象字面量中,或者反之,可以創(chuàng)造出任何復(fù)雜的數(shù)組結(jié)構(gòu):
var song = { title:"In My Head", track_number:10, album:"Rock Steady", artist:"No Doubt", authors:["Gwen Stefani","Tony Kannal","Tom Dumont"], duration:205 }; var triangle = [{x:0,y:0},{x:3,y:-6},{x:-4,y:-1.5}];
實(shí)踐中,我們會(huì)使用對(duì)象(多帶帶)描述一種具體的事物,如裙子、人、歌曲和坐標(biāo)點(diǎn)等等,會(huì)用數(shù)組描述一組事物,如一張專輯中的歌曲或一個(gè)多邊形的頂點(diǎn)。數(shù)組也不是構(gòu)造數(shù)據(jù)集合的唯一方式。
小練習(xí):把變量song和triangle用圖表示出來,包括引用的對(duì)象。(PS大法...這書實(shí)在啊,教JS順便復(fù)習(xí)PS基礎(chǔ)操作:)
請(qǐng)把變量a引用的數(shù)組在執(zhí)行下列操作之后的結(jié)果用圖示形式畫出來:
var a = [1,2,3,4];a.unshift(a.pop());
答:圖就免了,pop();會(huì)刪除數(shù)組末尾元素并返回,之后被unshift()接收,添加至數(shù)組頭部,需要注意的是,由于數(shù)組長(zhǎng)度不變,刪除末尾元素后,只是a[3]的值變?yōu)閡ndefined,所以最后a數(shù)組內(nèi)元素是:[4,1,2,3,undefined]
3.8 類型轉(zhuǎn)換 3.8.1 弱類型目前,接觸到的從操作符,如:
布爾值 && 布爾值 布爾值 || 布爾值 !布爾值 -數(shù)值 數(shù)值+,-,*,/,%數(shù)值 Math.sqrt(ceil,floor,PI,pow,random...)(數(shù)值) 字符串+字符串 字符串.toUpperCase() 字符串.indexOf(數(shù)值) 對(duì)象[字符串] ...
如果讓操作符搭配一個(gè)或多個(gè)"錯(cuò)誤的"的類型會(huì)怎么樣?
這里是數(shù)值:
7 * false // 0 7 * true // 7 7 * "5" // 35 7 * " " // 0 7 * "dog" // NaN 7 * null // 0 7 * undefined // NaN 7 * {x:1} // NaN
這里是布爾值:
!5 // false !0 // true !"dog" // false !"" // true !" " // false !null // true !undefined // true !{x:1} // false
這里是字符串:
"xyz"+false // "xyzfalse" "xyz"+true // "xyztrue" "xyz"+7 // "xyz7" "xyz"+null // "xyznull" "xyz"+undefined // "xyzundefined" "xyz"+{x:1} // xyz[object Object] "xyz"+[1,2,3] // xyz1,2,3
通過以上實(shí)驗(yàn),可以看出操作符搭配錯(cuò)誤的類型,不僅不會(huì)報(bào)錯(cuò),還會(huì)正常顯示。通過類型轉(zhuǎn)換以有意義的方式處理了錯(cuò)誤類型的值。
轉(zhuǎn)換為數(shù)值:false被轉(zhuǎn)換為0,true被轉(zhuǎn)換為1,字符串為轉(zhuǎn)換成可能的值,null被轉(zhuǎn)換成0;如果無法把字符轉(zhuǎn)換成數(shù)值,則轉(zhuǎn)換成NaN。對(duì)象x會(huì)調(diào)用x.valueOf();
轉(zhuǎn)換為布爾值:0、空字符串("")、null、undefined、NaN。其他值都被轉(zhuǎn)換成true。false一般稱為假值,true則為真值;
轉(zhuǎn)換為字符串:JavaScript會(huì)按常理處理,如例子所示。只是對(duì)象x會(huì)調(diào)用x.toString(),具體后面會(huì)討論。
關(guān)于valueOf和toString的詳細(xì)解釋,&&與||其實(shí)他們并不是真的需要比較布爾值,后續(xù)繼續(xù)討論。
由于存在隱式數(shù)據(jù)類型轉(zhuǎn)換,JavaScript被稱為弱類型編程語言。在強(qiáng)類型編程語言中,由錯(cuò)誤類型值構(gòu)成的表達(dá)式會(huì)導(dǎo)致錯(cuò)誤。如果腳本里含有這種"病句",要么不會(huì)被允許執(zhí)行,要么干脆直接停止工作,要么會(huì)在問題表達(dá)式被求值時(shí)拋出異常。
有時(shí)候,這種自動(dòng)類型轉(zhuǎn)換會(huì)造成一些意外。比如isNaN有時(shí)會(huì)產(chǎn)生一些難以理解的行為,我們知道它的作用是判斷某個(gè)值是不是非數(shù)值(Not a Number)。一般來說,我們會(huì)覺得布爾值、字符串、null會(huì)被判定為非數(shù)值,但實(shí)驗(yàn)表明并非如此。
isNaN(true); // false,因?yàn)閠rue轉(zhuǎn)換成了1 isNaN(null); // false,因?yàn)閚ull轉(zhuǎn)換成了0 isNaN("water"); // true,很明顯 isNaN("100"); // false,因?yàn)?100"轉(zhuǎn)換成了100
看來,應(yīng)該把isNaN的作用解讀為"不能轉(zhuǎn)換成數(shù)值"。再比如數(shù)值與字符串間的轉(zhuǎn)換,也是不可避免會(huì)碰到的:
var x = prompt("Enter a number"); var y = prompt("Enter another number"); alert(x+y); // 結(jié)果是拼接后的字符串,而非數(shù)學(xué)意義上的加法
每次提示都輸入2,結(jié)果是22,因?yàn)閷?duì)prompt求值的結(jié)果總是字符串,而+操作符又同時(shí)適用于數(shù)值和字符串。如果提示框顯示x-y,執(zhí)行的那就是數(shù)值減法。因?yàn)?b>-在JavaScript只能用于數(shù)值,所以得到的字符串都會(huì)先被轉(zhuǎn)換成數(shù)值。當(dāng)然,乘法和除法也是"安全的"。但不管怎樣,在數(shù)值和字符串相遇的時(shí)候,你總得自己多加小心才是。
3.8.2 顯式轉(zhuǎn)換鑒于字符串與數(shù)值間的轉(zhuǎn)換容易出問題,很多JavaScript程序員傾向于在代碼中顯式地實(shí)現(xiàn)字符串到數(shù)值的轉(zhuǎn)換。
如:
"3.14"-0; // 3.14 "3.14"*1; // 3.14 ("3.14"/1); // 3.14 +"3.14"; // 3.14 [速度最快] Number("3.14"); // 3.14 [清除,速度最慢] parseFloat("3.14"); // 3.14
前三個(gè)表達(dá)式使用了-、*、/,作為數(shù)值操作符,它們會(huì)在執(zhí)行計(jì)算(在這里都是無效計(jì)算)之前把字符串轉(zhuǎn)換成數(shù)值。第四個(gè)表達(dá)式也使用了一個(gè)數(shù)值操作符,叫做一元加。把它放到數(shù)值前面,不會(huì)產(chǎn)生任何操作,而與之對(duì)應(yīng)的一元減操作符就不一樣了。
+4 // 4 [一元加] -4 // -4 [一元減]
由于一元加需要一個(gè)數(shù)值參與計(jì)算,因此如果它后面是一個(gè)字符串,JavaScript就會(huì)把這個(gè)字符串轉(zhuǎn)換成數(shù)值。使用+把字符串轉(zhuǎn)換成數(shù)值的做法顯得有點(diǎn)神秘,但這種技術(shù)很方便,而且也并不少見。類似這種的編程方法被稱為:習(xí)語,對(duì)外人并不顯見,必須習(xí)而得之。
var x = +prompt("Enter a nunber"); var y = +prompt("Enter another nunber"); alert(x+y); // 算術(shù)加法
那么Number(s)和parseFloat(s)中s如果是字符串,結(jié)果又會(huì)怎么樣?
var x = Number(prompt("Enter....number")); var y = Number(prompt("Enter another...ber")); alert(x+y); // 算術(shù)加法
不過,很多程序員并不使用這種方式,因?yàn)樾实停篔avaScript引擎在運(yùn)行以上代碼時(shí)會(huì)額外多做一些工作,導(dǎo)致腳本執(zhí)行速度降低,內(nèi)存占用增多。究其原因,就是Number生成的并非基本類型值,而是一個(gè)包裝著數(shù)值的對(duì)象,這個(gè)對(duì)象在被當(dāng)成數(shù)值使用時(shí)會(huì)把數(shù)值拿出來。對(duì)象比基本類型值更讓JavaScript引擎費(fèi)勁,一方面創(chuàng)建對(duì)象需要分配空間,而在不需要對(duì)象時(shí),還要銷毀對(duì)象。然而,有時(shí)候可讀性確實(shí)比效率更重要,也可以使用Number。
parseFloat(string);還可以使用parseFloat及parseInt顯式把字符串轉(zhuǎn)換成數(shù)值。轉(zhuǎn)換從字符串開頭開始,但不一定轉(zhuǎn)換整個(gè)字符串,而且首尾的空格會(huì)被忽略。
console.log(parseFloat("23.9")); // 23.9 console.log(parseFloat("5.663E2")); // 566.3 console.log(parseFloat(" 8.11 ")); // 8.11 console.log(parseFloat("52.3xyz")); // 52.3 console.log(parseFloat("xyz52.3")); // NaN console.log(parseFloat("3 .5 .6")); // 3 console.log(parseFloat("123456 454")); // 123456 // 首尾空格忽略 // 除了+、-、數(shù)字、小數(shù)點(diǎn)、科學(xué)計(jì)數(shù)法(E或e)這些符號(hào),其他的字符本身以及后面的所有字符都會(huì)被忽略 // 如果參數(shù)字符串第一個(gè)字符串不能被解析為數(shù)字,會(huì)直接返回NaN
parseFloat 是全局函數(shù),不屬于任何對(duì)象。 parseFloat 將它的字符串參數(shù)解析成為浮點(diǎn)數(shù)并返回。如果在解析過程中遇到了正負(fù)號(hào)(+ 或 -)、數(shù)字 (0-9)、小數(shù)點(diǎn),或者科學(xué)記數(shù)法中的指數(shù)(e 或 E)以外的字符,則它會(huì)忽略該字符以及之后的所有字符,返回當(dāng)前已經(jīng)解析到的浮點(diǎn)數(shù)。同時(shí)參數(shù)字符串首位的空白符會(huì)被忽略。 如果參數(shù)字符串的第一個(gè)字符不能被解析成為數(shù)字,則 parseFloat 返回 NaN。提示:您可以通過調(diào)用 isNaN 函數(shù)來判斷 parseFloat 的返回結(jié)果是否是 NaN。如果讓 NaN 作為了任意數(shù)學(xué)運(yùn)算的操作數(shù),則運(yùn)算結(jié)果必定也是 NaN。parseInt(string, radix);
parseInt得到的數(shù)值沒有小數(shù)部分,其實(shí)parseInt中的Int就是integer,整數(shù)的意思。數(shù)值中含有小數(shù)的叫浮點(diǎn)數(shù)(Why?)
console.log(parseInt("23.9")); // 23 console.log(parseInt("5.663E2")); // 5 console.log(parseInt(" 8.11 ")); // 5 console.log(parseInt("52.3xyz")); // 52 console.log(parseInt("xyz52.3")); // NaN
使用parseInt可以轉(zhuǎn)換基數(shù)為2到36的任何數(shù)值,進(jìn)制轉(zhuǎn)換。
console.log(parseInt("75EF2",16)); // 483058 console.log(parseInt("50",8)); // 40 console.log(parseInt("110101",2)); // 53 console.log(parseInt("hello",30)); // 14167554 console.log(parseInt("36",2)); // NaN
當(dāng)參數(shù) radix 的值為 0,或沒有設(shè)置該參數(shù)時(shí),parseInt() 會(huì)根據(jù) string 來判斷數(shù)字的基數(shù)(前提)。 舉例,如果 string 以 "0x" 開頭,parseInt() 會(huì)把 string 的其余部分解析為十六進(jìn)制的整數(shù)。如果 string 以 0 開頭,那么 ECMAScript v3 允許 > parseInt() 的一個(gè)實(shí)現(xiàn)把其后的字符解析為八進(jìn)制或十六進(jìn)制的數(shù)字。如果 string 以 1 ~ 9 的數(shù)字開頭,parseInt() 將把它解析為十進(jìn)制的整數(shù)。3.8.3 松散相等操作符
因?yàn)镴avaScript是弱類型的,所以在執(zhí)行+-*/<等計(jì)算時(shí),要確保數(shù)據(jù)的類型匹配,就算是相等操作符,也會(huì)發(fā)生同樣的類型轉(zhuǎn)換。
console.log(false === 0) // false 嚴(yán)格相等比較(類型不轉(zhuǎn)換) console.log(false == 0) // true 相等比較(類型轉(zhuǎn)換)
JavaScript提供兩種相等測(cè)試機(jī)制,一種會(huì)執(zhí)行隱式類型轉(zhuǎn)換,一種不會(huì)。
相等操作符===當(dāng)且僅當(dāng)兩個(gè)表達(dá)式的值相同,類型相同時(shí)才會(huì)返回true(除了null)。而!==的結(jié)果自然與===截然相反。這兩種相等操作符叫做嚴(yán)格相等操作符。
另一種測(cè)試機(jī)制==和!=被人喻為嚴(yán)格操作符的"邪惡表親"。==在測(cè)試之前會(huì)不顧一切地轉(zhuǎn)換表達(dá)式類型,因此盡量不要使用它。
不過,==的轉(zhuǎn)換是有意義的,只是要記住比難。JavaScript官方規(guī)范對(duì)此有詳細(xì)描述,但我們這里可以簡(jiǎn)短歸納。
要確定x == y的結(jié)果,JavaScript會(huì)嘗試對(duì)它們進(jìn)行類型轉(zhuǎn)換,以便比較。
如果x和y中有一個(gè)字符串,有一個(gè)數(shù)值,JavaScript會(huì)把字符串轉(zhuǎn)換成數(shù)值。
如果一個(gè)是布爾值,另一個(gè)不同,JavaScript會(huì)把布爾值轉(zhuǎn)換成數(shù)值。
如果是一個(gè)對(duì)象,另一個(gè)是字符串是或數(shù)值,JavaScript會(huì)把對(duì)象轉(zhuǎn)換成字符串或者數(shù)值。
最后,undefined == null、null == undefined。待尋找原因。
由于上述情況復(fù)雜,一般更傾向于使用嚴(yán)格相等操作符===和!==。雖然松散相等操作符==和!==可以像前面討論的那樣在代碼提供一些快捷操作,即自動(dòng)幫我們實(shí)現(xiàn)字符串到數(shù)值的轉(zhuǎn)換,但轉(zhuǎn)換結(jié)果很多情況下無法預(yù)見,規(guī)則很難牢記。
使用===和!==,盡量不使用==和!=。3.9 typeof操作符
有時(shí)候,你可能必須某個(gè)值的類型。JavaScript有一個(gè)古怪的typeof操作符,能夠返回關(guān)于表達(dá)式類型的字符串描述。說它古怪,是因?yàn)樗姆祷刂涤袝r(shí)候可信,有時(shí)候又不可信。
typeof 101.3; // number typeof false; // boolean typeof "dog"; // string typeof {x:1,y:2}; // object typeof undefined; // undefined typeof null; // object typeof [1,2,3]; // object typeof alert; // function typeof (typeof 1); // string
null的類型沒有里有是object。數(shù)組的類型返回object倒可以理解,畢竟數(shù)組是對(duì)象??蔀槭裁春瘮?shù)的類型又不是了呢?函數(shù)也是一種對(duì)象啊。
小練習(xí):
測(cè)試typeof Infinity和typeof NaN
console.log(typeof Infinity); // number console.log(typeof NaN); // number
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/82608.html
摘要:如在上列中結(jié)果實(shí)際上是給定數(shù)字的字符串形式無效語法有效語法在上列中結(jié)果是因?yàn)榈谝粋€(gè)被視為的一部分,第二個(gè)是屬性訪問運(yùn)算符。用于檢查傳入的對(duì)象是否是傳入對(duì)象的原型第章將討論原型。返回對(duì)象的字符串表示。 只挑本人重要的寫(有夾雜其他補(bǔ)充) 3.1 語法 注釋 單行注釋以兩個(gè)斜杠開頭,如下所示: // 單行注釋 塊級(jí)注釋以一個(gè)斜杠和一個(gè)星號(hào)( /* )開頭, 以一個(gè)星號(hào)和...
摘要:設(shè)計(jì)模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開始接觸的時(shí)候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設(shè)計(jì)模式必須要先搞懂面向?qū)ο缶幊?,否則只會(huì)讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學(xué)習(xí)總結(jié)。知識(shí)只有分享才有存在的意義。 是時(shí)候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...
摘要:如果參數(shù)不在與之間,該方法將返回一個(gè)空字符串這個(gè)不解釋了方法用于在字符串中用一些字符替換另一些字符,或替換一個(gè)與正則表達(dá)式匹配的子串。 主要總結(jié) JavaScript的六種數(shù)據(jù)類型:Boolean、Number、String、Null、Undefined、Object 布爾類型 布爾真假判定:短路原則 x && y 只有在x和y都為真的情況下為真。即真真為真,短路:因比較運(yùn)算為左...
摘要:操作符,會(huì)將數(shù)值改變正數(shù)變成負(fù)數(shù)負(fù)數(shù)變成正數(shù)。同時(shí),也說明了,使用兩個(gè)邏輯非操作符和的操作結(jié)果相同。操作符得到的是余數(shù)。不相等操作符有兩種。 這篇筆記的內(nèi)容對(duì)應(yīng)的是《JavaScript高級(jí)程序設(shè)計(jì)(第三版)》中的第三章。 1.操作符 1-1 一元操作符 遞增和遞減操作符 遞增和遞減操作符有兩個(gè) ++ 和 --。一元操作符使用的時(shí)候,可以前置也可以后置。由于兩個(gè)操作方式類似,先只說明 ...
摘要:在本例中,使用屬性指定鏈接的目標(biāo),其中表示超文本鏈接。您應(yīng)該認(rèn)為和元數(shù)據(jù)隱式出現(xiàn)在示例中,即使它們沒有實(shí)際顯示在文本中。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目原文:JavaScript and the Browser 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 自豪地采用谷歌翻譯 部分參考了《JavaScript 編程精解(第 2 版)》 ...
閱讀 1062·2019-08-30 12:57
閱讀 2150·2019-08-30 11:11
閱讀 2187·2019-08-29 15:20
閱讀 1879·2019-08-29 14:12
閱讀 3282·2019-08-28 17:51
閱讀 2387·2019-08-26 13:23
閱讀 809·2019-08-26 10:34
閱讀 3870·2019-08-23 12:37