成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

《 JavaScript程序設(shè)計(jì)》—— 第三章 數(shù)據(jù)

roland_reed / 2659人閱讀

摘要:布爾值在編程中,和是經(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ù)類型;

布爾值,只有truefalse兩個(gè)值

數(shù)值,比如 814.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 布爾值

在編程中,truefalse是經(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í)行&&)、||)及!或叫取反)操作。假如xy是布爾值:

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í)或證否:如果xy保存的都是布爾值,那么!(x && y) 一定等(!x == !y)
第三題,可畫圖,排列組合出所有可能便可證為實(shí),總之&&:一旦有假則為假,||:一旦有真則為真

3.3 數(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,小于10

3.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 NaN

NaN這個(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));        // false
3.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)    // -1531
3.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)。要定位字符串中文本的位置,可以使用indexOflastIndexOf。表達(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)行。

小練習(xí):

什么情況下必須使用方括號(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,我們想知道xy中等值是否相同。

        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.radiusc2.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)換為0true被轉(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、undefinedNaN。其他值都被轉(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
W3C官方說明:
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
W3C官方說明:
當(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 Infinitytypeof 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

相關(guān)文章

  • Javascript高級(jí)程序設(shè)計(jì) (第三版)》第三 基本概念

    摘要:如在上列中結(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)和...

    caige 評(píng)論0 收藏0
  • JS程序

    摘要:設(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ù)組的那些迭代方法~ ...

    melody_lql 評(píng)論0 收藏0
  • JavaScript程序設(shè)計(jì)》—— 第三 數(shù)據(jù)章 總結(jié)及練習(xí)

    摘要:如果參數(shù)不在與之間,該方法將返回一個(gè)空字符串這個(gè)不解釋了方法用于在字符串中用一些字符替換另一些字符,或替換一個(gè)與正則表達(dá)式匹配的子串。 主要總結(jié) JavaScript的六種數(shù)據(jù)類型:Boolean、Number、String、Null、Undefined、Object 布爾類型 布爾真假判定:短路原則 x && y 只有在x和y都為真的情況下為真。即真真為真,短路:因比較運(yùn)算為左...

    W4n9Hu1 評(píng)論0 收藏0
  • 004-讀書筆記-JavaScript高級(jí)程序設(shè)計(jì) 基本概念(下)

    摘要:操作符,會(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è)操作方式類似,先只說明 ...

    nevermind 評(píng)論0 收藏0
  • JavaScript 編程精解 中文第三版 十三、瀏覽器中的 JavaScript

    摘要:在本例中,使用屬性指定鏈接的目標(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 版)》 ...

    zhiwei 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<