javascript對(duì)象

為了區(qū)分對(duì)象的類(lèi)型腮考,我們用typeof操作符獲取對(duì)象的類(lèi)型惕稻,它總是返回一個(gè)字符串:
typeof 123; // 'number'
typeof NaN; // 'number'
typeof 'str'; // 'string'
typeof true; // 'boolean'
typeof undefined; // 'undefined'
typeof Math.abs; // 'function'
typeof null; // 'object'
typeof []; // 'object'
typeof {}; // 'object'

2.包裝對(duì)象

number、boolean和string都有包裝對(duì)象坛善。
沒(méi)錯(cuò),在JavaScript中戚丸,字符串也區(qū)分string類(lèi)型和它的包裝類(lèi)型羞反。包裝對(duì)象用new創(chuàng)建:
var n = new Number(123); // 123,生成了新的包裝類(lèi)型
var b = new Boolean(true); // true,生成了新的包裝類(lèi)型
var s = new String('str'); // 'str',生成了新的包裝類(lèi)型
雖然包裝對(duì)象看上去和原來(lái)的值一模一樣,顯示出來(lái)也是一模一樣腿倚,
但他們的類(lèi)型已經(jīng)變?yōu)閛bject了纯出!所以,包裝對(duì)象和原始值用===比較會(huì)返回false:
typeof new Number(123); // 'object'
new Number(123) === 123; // false
typeof new Boolean(true); // 'object'
new Boolean(true) === true; // false
typeof new String('str'); // 'object'
new String('str') === 'str'; // false
所以閑的蛋疼也不要使用包裝對(duì)象敷燎!尤其是針對(duì)string類(lèi)型T蒹荨!硬贯!
如果我們?cè)谑褂肗umber焕襟、Boolean和String時(shí),沒(méi)有寫(xiě)new會(huì)發(fā)生什么情況饭豹?
此時(shí)鸵赖,Number()务漩、Boolean和String()被當(dāng)做普通函數(shù),把任何類(lèi)型的數(shù)據(jù)轉(zhuǎn)換為number它褪、boolean和string類(lèi)型(注意不是其包裝類(lèi)型):
var n = Number('123'); // 123饵骨,相當(dāng)于parseInt()或parseFloat()
typeof n; // 'number'
var b = Boolean('true'); // true
typeof b; // 'boolean'
var b2 = Boolean('false'); // true! 'false'字符串轉(zhuǎn)換結(jié)果為true!因?yàn)樗欠强兆址?var b3 = Boolean(''); // false
var s = String(123.45); // '123.45'
typeof s; // 'string'
總結(jié)一下茫打,有這么幾條規(guī)則需要遵守:
不要使用new Number()居触、new Boolean()、new String()創(chuàng)建包裝對(duì)象老赤;
用parseInt()或parseFloat()來(lái)轉(zhuǎn)換任意類(lèi)型到number轮洋;
用String()來(lái)轉(zhuǎn)換任意類(lèi)型到string,或者直接調(diào)用某個(gè)對(duì)象的toString()方法抬旺;
通常不必把任意類(lèi)型轉(zhuǎn)換為boolean再判斷弊予,因?yàn)榭梢灾苯訉?xiě)if (myVar) {...};
typeof操作符可以判斷出number开财、boolean汉柒、string、function和undefined床未;
判斷Array要使用Array.isArray(arr)竭翠;
判斷null請(qǐng)使用myVar === null;
判斷某個(gè)全局變量是否存在用typeof window.myVar === 'undefined'薇搁;
函數(shù)內(nèi)部判斷某個(gè)變量是否存在用typeof myVar === 'undefined'斋扰。
最后有細(xì)心的同學(xué)指出,任何對(duì)象都有toString()方法嗎啃洋?
null和undefined就沒(méi)有传货!確實(shí)如此,這兩個(gè)特殊值要除外宏娄,雖然null還偽裝成了object類(lèi)型问裕。
更細(xì)心的同學(xué)指出,number對(duì)象調(diào)用toString()報(bào)SyntaxError:
123.toString(); // SyntaxError
遇到這種情況孵坚,要特殊處理一下:
123..toString(); // '123', 注意是兩個(gè)點(diǎn)粮宛!
(123).toString(); // '123'

4.json

在JSON中,一共就這么幾種數(shù)據(jù)類(lèi)型:
    number:和JavaScript的number完全一致卖宠;
    boolean:就是JavaScript的true或false巍杈;
    string:就是JavaScript的string;
    null:就是JavaScript的null扛伍;
    array:就是JavaScript的Array表示方式——[]筷畦;
    object:就是JavaScript的{ ... }表示方式。
    以及上面的任意組合刺洒。
并且鳖宾,JSON還定死了字符集必須是UTF-8吼砂,表示多語(yǔ)言就沒(méi)有問(wèn)題了。
為了統(tǒng)一解析鼎文,JSON的字符串規(guī)定必須用雙引號(hào)""渔肩,Object的鍵也必須用雙引號(hào)""。
由于JSON非常簡(jiǎn)單漂问,很快就風(fēng)靡Web世界赖瞒,并且成為ECMA標(biāo)準(zhǔn)女揭。
幾乎所有編程語(yǔ)言都有解析JSON的庫(kù)蚤假,而在JavaScript中,我們可以直接使用JSON吧兔,
因?yàn)镴avaScript內(nèi)置了JSON的解析磷仰。
把任何JavaScript對(duì)象變成JSON,就是把這個(gè)對(duì)象序列化成一個(gè)JSON格式的字符串境蔼,
這樣才能夠通過(guò)網(wǎng)絡(luò)傳遞給其他計(jì)算機(jī)灶平。
如果我們收到一個(gè)JSON格式的字符串,只需要把它反序列化成一個(gè)JavaScript對(duì)象箍土,
就可以在JavaScript中直接使用這個(gè)對(duì)象了逢享。

4.1.序列化

讓我們先把小明這個(gè)對(duì)象序列化成JSON格式的字符串:
var xiaoming = {
    name: '小明',
    age: 14,
    gender: true,
    height: 1.65,
    grade: null,
    'middle-school': '\\"W3C\\" Middle School',
    skills: ['JavaScript', 'Java', 'Python', 'Lisp']
};
JSON.stringify(xiaoming); // '{"name":"小明","age":14,"gender":true,"height":1.65,"grade":null,"middle-school":"\\"W3C\\" Middle School","skills":["JavaScript","Java","Python","Lisp"]}'
要輸出得好看一些,可以加上參數(shù)吴藻,按縮進(jìn)輸出:
JSON.stringify(xiaoming, null, '  ');
結(jié)果:
{
  "name": "小明",
  "age": 14,
  "gender": true,
  "height": 1.65,
  "grade": null,
  "middle-school": "\\"W3C\\" Middle School",
  "skills": [
    "JavaScript",
    "Java",
    "Python",
    "Lisp"
  ]
}
第二個(gè)參數(shù)用于控制如何篩選對(duì)象的鍵值瞒爬,如果我們只想輸出指定的屬性,可以傳入Array:
JSON.stringify(xiaoming, ['name', 'skills'], '  ');
結(jié)果:
{
  "name": "小明",
  "skills": [
    "JavaScript",
    "Java",
    "Python",
    "Lisp"
  ]
}
還可以傳入一個(gè)函數(shù)沟堡,這樣對(duì)象的每個(gè)鍵值對(duì)都會(huì)被函數(shù)先處理:
function convert(key, value) {
    if (typeof value === 'string') {
        return value.toUpperCase();
    }
    return value;
}
JSON.stringify(xiaoming, convert, '  ');
上面的代碼把所有屬性值都變成大寫(xiě):
{
  "name": "小明",
  "age": 14,
  "gender": true,
  "height": 1.65,
  "grade": null,
  "middle-school": "\\"W3C\\" MIDDLE SCHOOL",
  "skills": [
    "JAVASCRIPT",
    "JAVA",
    "PYTHON",
    "LISP"
  ]
}
如果我們還想要精確控制如何序列化小明侧但,可以給xiaoming定義一個(gè)toJSON()的方法,直接返回JSON應(yīng)該序列化的數(shù)據(jù):
var xiaoming = {
    name: '小明',
    age: 14,
    gender: true,
    height: 1.65,
    grade: null,
    'middle-school': '\\"W3C\\" Middle School',
    skills: ['JavaScript', 'Java', 'Python', 'Lisp'],
    toJSON: function () {
        return { // 只輸出name和age航罗,并且改變了key:
            'Name': this.name,
            'Age': this.age
        };
    }
};
JSON.stringify(xiaoming); // '{"Name":"小明","Age":14}'

4.2.反序列化

拿到一個(gè)JSON格式的字符串禀横,我們直接用JSON.parse()把它變成一個(gè)JavaScript對(duì)象:
JSON.parse('[1,2,3,true]'); // [1, 2, 3, true]
JSON.parse('{"name":"小明","age":14}'); // Object {name: '小明', age: 14}
JSON.parse('true'); // true
JSON.parse('123.45'); // 123.45
JSON.parse()還可以接收一個(gè)函數(shù),用來(lái)轉(zhuǎn)換解析出的屬性:
JSON.parse('{"name":"小明","age":14}', function (key, value) {
    // 把number * 2:
    if (key === 'name') {
        return value + '同學(xué)';
    }
    return value;
}); // Object {name: '小明同學(xué)', age: 14}
在JavaScript中使用JSON粥血,就是這么簡(jiǎn)單柏锄!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市复亏,隨后出現(xiàn)的幾起案子趾娃,更是在濱河造成了極大的恐慌,老刑警劉巖蜓耻,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茫舶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡刹淌,警方通過(guò)查閱死者的電腦和手機(jī)饶氏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)讥耗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人疹启,你說(shuō)我怎么就攤上這事古程。” “怎么了喊崖?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵挣磨,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我荤懂,道長(zhǎng)茁裙,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任节仿,我火速辦了婚禮晤锥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘廊宪。我一直安慰自己矾瘾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布箭启。 她就那樣靜靜地躺著壕翩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪傅寡。 梳的紋絲不亂的頭發(fā)上放妈,一...
    開(kāi)封第一講書(shū)人閱讀 51,578評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音赏僧,去河邊找鬼大猛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛淀零,可吹牛的內(nèi)容都是我干的挽绩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼驾中,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼唉堪!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起肩民,我...
    開(kāi)封第一講書(shū)人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤唠亚,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后持痰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體灶搜,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了割卖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片前酿。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鹏溯,靈堂內(nèi)的尸體忽然破棺而出罢维,到底是詐尸還是另有隱情,我是刑警寧澤丙挽,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布肺孵,位于F島的核電站,受9級(jí)特大地震影響颜阐,放射性物質(zhì)發(fā)生泄漏平窘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一瞬浓、第九天 我趴在偏房一處隱蔽的房頂上張望初婆。 院中可真熱鬧蓬坡,春花似錦猿棉、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至兆龙,卻和暖如春杖爽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背紫皇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工慰安, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人聪铺。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓化焕,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親铃剔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子撒桨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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

  • 1. 本文是在學(xué)習(xí)廖雪峰先生的JavaScrip教程 后的歸納 一、標(biāo)準(zhǔn)對(duì)象 typeofJavaScript的世...
    ting723閱讀 317評(píng)論 0 2
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理键兜,服務(wù)發(fā)現(xiàn)凤类,斷路器,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 1.用typeof操作符來(lái)獲取對(duì)象類(lèi)型,返回值總是一個(gè)字符串typeof 123; // 'number'type...
    _我和你一樣閱讀 162評(píng)論 0 0
  • 前言 本文要解決的問(wèn)題: 為什么會(huì)有深拷貝(deep clone)和淺拷貝(shallow clone)的存在 理...
    無(wú)亦情閱讀 1,875評(píng)論 0 5
  • 群主是91年的女漢子普气,為什么說(shuō)是漢子呢谜疤,一方面是由于她自己經(jīng)常自嘲,另一方面是她在群里面大大咧咧的話語(yǔ),我們男同胞...
    愛(ài)吃果凍閱讀 508評(píng)論 0 1