DOM對(duì)象和類數(shù)組對(duì)象的探索

實(shí)踐是最好的老師,愿你的每一天都在學(xué)習(xí)中成長(zhǎng)

本文的主題是DOM對(duì)象和DOM數(shù)組护奈,但是在正文開(kāi)始之前,需要一點(diǎn)點(diǎn)鋪墊

在沒(méi)有遇到這樣的場(chǎng)景之前,我一直不清楚DOM對(duì)象和普通對(duì)象的區(qū)別乐尊,可是當(dāng)我們遇見(jiàn)了需要處理的場(chǎng)景,就需要為了解決問(wèn)題而做一些實(shí)踐划址,深入了解一下其中的緣由扔嵌。

前言

判斷對(duì)象是否為空的方法
  • JSON.stringify()
judgeEmptyObjectByJSON: function (obj) {
      return JSON.stringify(obj) === '{}';
 }

console.log(judgeEmptyObjectByJSON({}));
//true

console.log(judgeEmptyObjectByJSON({name:'andy'}));
//false

  • Object.keys()
judgeEmptyObjectByObjectKeys: function (obj) {

    return Object.keys(obj).length === 0;
}

console.log(this.judgeEmptyObjectByObjectKeys({}));
//true

console.log(this.judgeEmptyObjectByObjectKeys({name:'andy'}));
//false
  • $.isEmptyObject()
    在JQuery的源碼中,isEmptyObject()函數(shù)時(shí)是這樣寫的:
    JQuery的源碼isEmptyObject()

原理是通過(guò)for...in遍歷key

judgeEmptyObjectByForIn: function (obj) {

      for(let name in obj){
        return false;
      }

      return true;
}

console.log(this.judgeEmptyObjectByForIn({}));
//true

console.log(this.judgeEmptyObjectByForIn({name:'andy'}));
//false

正文

通過(guò)操作DOM元素拿到的Object和Array的特殊使用方法:

關(guān)于Object
  • 場(chǎng)景
    在前端做上傳文件夺颤,提交之前拿到和上傳的文件有關(guān)的對(duì)象痢缎,按照需求對(duì)此對(duì)象進(jìn)行判空處理。

  • 實(shí)踐
    上傳文件時(shí)世澜,我們需要用到的基本html元素如下:

<div class="main-content">
    <input type="file" class="input-file">
</div>

然后通過(guò)JQuery的選擇器拿到相應(yīng)的元素独旷,為它綁定函數(shù)

 let fileInput = $('.input-file');
 fileInput.bind('change', this.updateFile);

在updateFile()函數(shù)中取到和file有關(guān)的對(duì)象,它里面存著和上傳的文件有關(guān)的信息:

updateFile: function () {
      let file = $('.input-file');
      this.fileObject = file[0].files[0];

      console.log(this.fileObject);
      console.log(typeof this.fileObject);
 }

然后在控制臺(tái)看見(jiàn)打出的信息如圖:


file對(duì)象

首先可以確定這是一個(gè)對(duì)象寥裂,而且對(duì)象中相關(guān)的字段都是肉眼可見(jiàn)嵌洼,現(xiàn)在有需求描述:對(duì)此文件對(duì)象作判空處理,如果為空封恰,則做其他處理麻养。

按照之前總結(jié)過(guò)的對(duì)象判空方法,我們先操作一下看結(jié)果:

updateFile: function () {
      let file = $('.input-file');
      this.fileObject = file[0].files[0];
      
      console.log(this.fileObject);
      console.log(typeof this.fileObject);

      let isEmpty = JSON.stringify(this.fileObject) === '{}';
      console.log(isEmpty);
},

判斷file對(duì)象是否為空

好了诺舔,神奇的事情發(fā)生了鳖昌,控制臺(tái)告訴我們备畦,此時(shí)的我們拿到的file對(duì)象是空的!R抛瘛萍恕!
很奇妙吧,當(dāng)然一開(kāi)始不知道是為什么车要,查了一些解決辦法允粤,也明白了一點(diǎn):

通過(guò)$()取出來(lái)的對(duì)象,是JQuery包裝過(guò)的DOM對(duì)象翼岁,它的本質(zhì)是和普通的數(shù)據(jù)對(duì)象是一致的

但是类垫,$(xxx)[0]就把JQuery對(duì)象轉(zhuǎn)化成了DOM對(duì)象,一般對(duì)象的方法不適用于DOM對(duì)象

所以琅坡,如果是通過(guò)操作DOM拿到的DOM對(duì)象悉患,要先把他轉(zhuǎn)化成JQuery對(duì)象,再使用對(duì)象的方法

  • 擴(kuò)展:DOM對(duì)象轉(zhuǎn)化的方法
    (1)榆俺、使用JQuery的$包裹對(duì)象售躁;
this.fileObject = $(this.fileObject);

let isEmpty = JSON.stringify(this.fileObject) === '{}';
console.log(isEmpty);    //false
console.log(this.judgeEmptyObjectByObjectKeys(this.fileObject));     //false
console.log(this.judgeEmptyObjectByForIn(this.fileObject));      //false

(2)、使用JSON.stringify()時(shí)傳入白名單

let file = $('.input-file');
 this.fileObject = file[0].files[0];

let isEmpty = JSON.stringify(this.fileObject,['lastModifiedDate','name','size','type','webkitRelativePath']) === '{}';
console.log(isEmpty);      //false

JSON.stringify(Object,[名單列表])

  • 遺留問(wèn)題:
    此時(shí)的對(duì)象是DOM對(duì)象茴晋,其他的方法判斷都是空的陪捷,但是JQuery的$.isEmptyObject()卻可以正確判斷,并且按理說(shuō)DOM對(duì)象是不可以使用JQuery的方法的诺擅,但是現(xiàn)在幾乎都不城里市袖,不知原因?yàn)楹危?/li>
關(guān)于Array-Like(類數(shù)組)
  • 場(chǎng)景
    DOM元素通過(guò)ClassName或者TagName返回一個(gè)“數(shù)組”,希望對(duì)它進(jìn)行操作烁涌。

  • 實(shí)踐
    基本的html元素如下:

 <div>
      <div class="element">name</div>
      <div class="element">name</div>
      <div class="element">name</div>
      <div class="element">name</div>
      <div class="element">name</div>
 </div>

通過(guò)操作dom拿到相應(yīng)的數(shù)組對(duì)象:

let domArray = document.getElementsByClassName('element');
console.log(domArray);
DOM數(shù)組對(duì)象

判斷類型:

console.log(typeof domArray );    //object
console.log(domArray instanceof Array);    //false

此時(shí)苍碟,這個(gè)DOM數(shù)組的類型是對(duì)象,但又不是數(shù)組撮执,只能稱之為類數(shù)組對(duì)象
在JS中微峰,類數(shù)組對(duì)象是一個(gè)很特殊對(duì)象,它具有以下的特點(diǎn):
- 擁有l(wèi)ength屬性抒钱,其它屬性(索引)為非負(fù)整數(shù)
-不具有數(shù)組所具有的方法

驗(yàn)證:

console.log(domArray.slice(0,1));
驗(yàn)證結(jié)果
  • 擴(kuò)展:類數(shù)組對(duì)象轉(zhuǎn)化為數(shù)組對(duì)象的方法
    為了方便操作類數(shù)組對(duì)象县忌,使其能夠使用數(shù)組對(duì)象的方法,我們需要將類數(shù)組對(duì)象轉(zhuǎn)化為數(shù)組對(duì)象继效。
    (1)、Array.prototype.slice.call(arguments)装获;
let domArray = document.getElementsByClassName('element');
let nodes = Array.prototype.slice.call(domArray);
console.log(nodes instanceof Array);
console.log(nodes.slice(0,1));

轉(zhuǎn)化結(jié)果

(2)瑞信、Array.prototype.concat.apply([],arguments);

let domArray = document.getElementsByClassName('element');
let nodes = Array.prototype.concat.apply([],domArray);
console.log(nodes instanceof Array);
console.log(nodes.slice(0,1));

轉(zhuǎn)化結(jié)果

(3)穴豫、Array.from(arguments)凡简;

let domArray = document.getElementsByClassName('element');
let nodes = Array.from(domArray);
console.log(nodes instanceof Array);
console.log(nodes.slice(0,1));
轉(zhuǎn)化結(jié)果

(4)逼友、 Object.values(obj)

let domArray = document.getElementsByClassName('element');
let nodes = Object.values(domArray);
console.log(nodes instanceof Array);
console.log(nodes.slice(0,1));

轉(zhuǎn)化結(jié)果

(5)、 [...obj]

let domArray = document.getElementsByClassName('element');
let nodes = [...domArray];
console.log(nodes instanceof Array);
console.log(nodes.slice(0,1));
轉(zhuǎn)化結(jié)果

結(jié)語(yǔ)

這些JS中的細(xì)節(jié)秤涩,看見(jiàn)也沒(méi)有在意過(guò)帜乞,但是在具體的問(wèn)題面前,理解并解決問(wèn)題也是很重要的筐眷。DOM對(duì)象是在需求中明確遇到了黎烈,類數(shù)組對(duì)象以前是沒(méi)有見(jiàn)過(guò)的,有一天在社區(qū)看見(jiàn)一個(gè)人說(shuō)出去面試遇到了這樣的提問(wèn)匀谣,問(wèn)如何對(duì)類數(shù)組對(duì)象做迭代操作照棋,但是實(shí)踐中發(fā)現(xiàn),類數(shù)組對(duì)象也是有l(wèi)ength屬性武翎,可以通過(guò)for…in迭代的烈炭,當(dāng)然也可以轉(zhuǎn)化后再迭代。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宝恶,一起剝皮案震驚了整個(gè)濱河市符隙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌垫毙,老刑警劉巖霹疫,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異露久,居然都是意外死亡更米,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門毫痕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)征峦,“玉大人,你說(shuō)我怎么就攤上這事消请±赴剩” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵臊泰,是天一觀的道長(zhǎng)蛉加。 經(jīng)常有香客問(wèn)我,道長(zhǎng)缸逃,這世上最難降的妖魔是什么针饥? 我笑而不...
    開(kāi)封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮需频,結(jié)果婚禮上丁眼,老公的妹妹穿的比我還像新娘。我一直安慰自己昭殉,他們只是感情好苞七,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布藐守。 她就那樣靜靜地躺著,像睡著了一般蹂风。 火紅的嫁衣襯著肌膚如雪卢厂。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天惠啄,我揣著相機(jī)與錄音慎恒,去河邊找鬼。 笑死礁阁,一個(gè)胖子當(dāng)著我的面吹牛巧号,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播姥闭,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼丹鸿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了棚品?” 一聲冷哼從身側(cè)響起靠欢,我...
    開(kāi)封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铜跑,沒(méi)想到半個(gè)月后门怪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锅纺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年掷空,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片囤锉。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坦弟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出官地,到底是詐尸還是另有隱情酿傍,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布驱入,位于F島的核電站赤炒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏亏较。R本人自食惡果不足惜莺褒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雪情。 院中可真熱鬧癣朗,春花似錦、人聲如沸旺罢。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)扁达。三九已至正卧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跪解,已是汗流浹背炉旷。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叉讥,地道東北人窘行。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像图仓,于是被迫代替她去往敵國(guó)和親罐盔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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

  • 前端開(kāi)發(fā)面試題 <a name='preface'>前言</a> 只看問(wèn)題點(diǎn)這里 看全部問(wèn)題和答案點(diǎn)這里 本文由我...
    自you是敏感詞閱讀 760評(píng)論 0 3
  • 第2章 基本語(yǔ)法 2.1 概述 基本句法和變量 語(yǔ)句 JavaScript程序的執(zhí)行單位為行(line)救崔,也就是一...
    悟名先生閱讀 4,149評(píng)論 0 13
  • 1. 人生,是通往死亡的一次旅行劫窒。 也許你覺(jué)得你不過(guò)20歲左右本今,現(xiàn)在談?wù)撍劳鲞€太遙遠(yuǎn)。但是明天和死亡主巍,誰(shuí)會(huì)先來(lái)沒(méi)人...
    寫周記的Wang閱讀 664評(píng)論 2 3
  • 石肖孤島菩薩 小橋湖水清雅 蘆葦亭臺(tái)閑暇
    京九如郵幣收藏閱讀 200評(píng)論 0 0
  • Anna艷娜 2018年6月5日復(fù)盤 還好早起完成了60s的練習(xí)冠息,晚上加班做方案and公司有事,近10點(diǎn)才回家煤禽,到...
    Anna艷娜閱讀 164評(píng)論 0 1