JavaScript服務器端開發技術(對象屬性的枚舉與查詢)

既然對象是屬性的集合,那么檢測與枚舉集合中的屬性就是一項重要任務。對此,我們來分別看一下ES3ES5提供的解決方案。

wKioL1VcovzDvwUIAAFECUBZy3E663.jpg

1)?????ES3枚舉方案

示例代碼:

var contacts={

??? ID:[0,1,2,3,4,5],

??? names:["Zero","One","Two","Three","Four","Five"],

??? addresses:[

??? {

??????? Street:"ABC",

??????? State: "0"

??? },

??? {

??????? Street:"ABC",

??????? State: "1"

??? },

??? {

??????? Street:"ABC",

??????? State: "2"

??? },

??? {

??????? Street:"ABC",

??????? State: "3"

??? },

??? {

??????? Street:"ABC",

??????? State: "4"

??? },

??? {

??????? Street:"ABC",

??????? State: "5"

??? }

??? ]

};

//ES3 solutions

console.log('"ID" in contacts: ',"ID" in contacts);

console.log("'toString' in contacts: ",'toString' in contacts );

for(var key in contacts){

??? console.log("key: ",key);

??? console.log("value: ",contacts[key]);

}

上面代碼的輸出結果如下:

"ID" in contacts:? true

'toString' in contacts:? true

key:? ID

value:? [ 0, 1, 2, 3, 4, 5 ]

key:? names

value:? [ 'Zero', 'One', 'Two', 'Three', 'Four', 'Five' ]

key:? addresses

value:? [ { Street: 'ABC', State: '0' },

? { Street: 'ABC', State: '1' },

? { Street: 'ABC', State: '2' },

? { Street: 'ABC', State: '3' },

? { Street: 'ABC', State: '4' },

? { Street: 'ABC', State: '5' } ]

注意:

  • 運算符in的左側是屬性名,是字符串類型,右側是對象。無論是對象的自有屬性還是繼承屬性中包含這個屬性都會返回true

  • 對象的hasOwnProperty()方法用于檢測給定的名字是否是對象的自有屬性。對于繼承屬性則返回false。例如:

var? o={a:111,b:222};

o.hasOwnProperty("a");//true

o.hasOwnProperty("x");//false:不存在此屬性

o.hasOwnProperty("toString");//falsetoString是繼承屬性

  • propertyIsEnumerable()hasOwnProperty()方法的增強版本,用于檢測自有且可枚舉的屬性。通常JS創建的屬性都是可枚舉的,除非使用ES5中特殊方法改變了屬性的可枚舉性。例如:

var? o=inherit({a:111,b:222});

o.x=10000;

o. propertyIsEnumerable ("x");//true

o. propertyIsEnumerable ("a");//false:繼承來的屬性

Object.prototype. propertyIsEnumerable ("toString");//falsetoString是不可枚舉的屬性

?

2)?????ES5枚舉方案

除了使用ES3中的for...in循環方式來枚舉對象中的屬性外,對于前面定義的對象直接量,ES5還支持如下的枚舉方案:

console.log(Object.keys(contacts));

console.log(Object.getOwnPropertyNames(contacts));

輸出結果如下:

[ 'ID', 'names', 'addresses' ]

[ 'ID', 'names', 'addresses' ]

其中,靜態方法Object.keys()返回一個數組,這個數組由對象中可枚舉的自有屬性的名稱組成。

靜態方法Object. getOwnPropertyNames ()也是返回一個數組,這個數組由對象中所有的自有屬性的名稱組成。注意:ES3中無法實現這樣的方法,因為ES3中無法獲取對象的不可枚舉的屬性。

3)?????!==in運算符用于屬性存在判斷

前面介紹使用in運算符判斷指定屬性在否存在于某對象中。其實,有些簡單情況下,也可以使用!==運算符來決斷一個屬性是否是undefined

var oo1=new Object({lan:"JavaScript",degree:"Difficult"});

console.log("使用!==運算符的例子");

console.log(oo1.lan!==undefined);? //true

console.log(oo1.language!==undefined); //false

console.log(oo1.toString!==undefined); //true

切記:只有in運算符能夠區分不存在的屬性和存在但值為undefined的屬性。此時,!==已經無能為力。參考如下代碼片斷:

var ou={key1:undefined};

console.log("只能使用in運算符的例子");

console.log(ou.key1!==undefined);//false

console.log(ou.key2!==undefined);//false

console.log("key1" in ou);//true

console.log("key2" in ou);//false

delete ou.key1; //delete property 'key1'

console.log("key1" in ou);//false

4)?????與屬性枚舉相關的幾個工具函數

?

在本節給出的工具函數中,我們把對象看作屬性集合,所給的圖示試圖從集合論角度給出這些函數的功能示意。

求并集1

示意圖:wKiom1VcocXx7J2NAACyhRseASg260.jpg

此工具函數并兩個對象中屬性的并集,但對于相同的屬性,使用present對象的屬性覆蓋對象orig中同名屬性。

function extend(orig,present){

??? for(var prop in present){

??????? orig[prop]=present[prop];

??? }

??? return orig;

}

?

求并集2

示意圖:wKioL1Vco2KAtKS7AACuW-Xxf6M913.jpg

此工具函數并兩個對象中屬性的并集,但對于相同的屬性,使用保留對象orig中的屬性而舍棄present中同名屬性。

function merge(orig,present){

??? for(var prop in present){

??????? if(orig.hasOwnProperty(prop)) continue;

??????? orig[prop]=present[prop];

??? }

??? return orig;

}

求交集1

wKiom1VcohCREjYhAACV0duhL2U821.jpg

此工具函數并兩個對象中屬性的交集,但對于相同的屬性,使用保留對象orig中的屬性而舍棄present中同名屬性。

function restrict(orig,present) {

??? for(var prop in orig){

??????? if(!(prop in present)){

??????????? delete orig[prop];

??????? }

??????? return orig;

??? }

}

求交集2

wKioL1Vco6vh3tlbAACW7zKu9Cs255.jpg

此工具函數并兩個對象中屬性的交集,但對于相同的屬性,使用保留對象orig中的屬性而舍棄present中同名屬性。因此,交集結果同上面“求交集1”,但是返回新集合。

function intersection(o,p) {

??? return restrict(extend({},o),p);

}

求集合減法
wKioL1Vco9OiCjMFAACfG8oI5mM147.jpg

function subtract(orig,present) {

??? for (var prop in present) {

??????? delete? orig[prop];

??? }

??? return orig;

}

?

求并集3

實際上等同于“求并集1”,但是返回一個新對象。

function union(orig,present) {

??? return extend(extend({},orig),present);

}

類似于ES5版本的Object.keys(o)

function keys(obj){

??? if(typeof obj!=="object") throw TypeError("The parameter 'obj' must be an object!");

??? var result=[];

??? for(var prop in obj){

??????? if(obj.hasOwnProperty(prop)){

??????????? result.push(prop);

??????? }

??? }

??? return result;

}

求多個集合并集的函數

下面這個工具函數在許多JS庫中都有它的影子,來自于
Pomelo
示例工程中的文件
chatofpomelo-websocket\game-server\node_modules\pomelo\node_modules\cliff\node_modules\winston\lib\winston\config.js
,可以實現多個集合并集求解。

但對于相同屬性,使用后面加入的集合中同名屬性覆蓋前面集合中屬性。

function mixin (targetObj) {

??? //下面代碼把函數的參數轉換成一個數組,并取得從第1個元素開始直到最后的參數組成的子數組

??? var args = Array.prototype.slice.call(arguments, 1);

??? args.forEach(function (a) {

??????? var keys = Object.keys(a);//ES5:?返回對象所有自有屬性的名稱

??????? for (var i = 0; i < keys.length; i++) {

??????????? targetObj[keys[i]] = a[keys[i]];

??????? }

??? });

??? return targetObj;

};

?

以上屬性操作工具函數還存在不同程度的缺點,僅供學習者參考。
















本文轉自朱先忠老師51CTO博客,原文鏈接:http://blog.51cto.com/zhuxianzhong/1653360?,如需轉載請自行聯系原作者


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454172.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454172.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454172.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

treelistview 所有節點失去焦點_垃圾詢盤過濾,焦點科技的 Milvus 實踐

文章作者&#xff1a;黎陽&#xff0c;焦點科技軟件開發工程師李成龍&#xff0c;Zilliz 數據工程師Milvus (https://milvus.io/) 向量搜索引擎開源半年以來&#xff0c;全球已經有數百家企業或組織用戶。焦點科技是一家以 B2B 外貿交易為主營業務的科技公司&#xff0c;也是 M…

《操作系統》OS學習(四):計算機體系結構、內存層次和地址生成

計算機除了計算能力之外還有存儲能力&#xff0c;存儲能力即計算機擁有一系列的存儲介質&#xff0c;我們可以在存儲介質上存儲我們的代碼和數據。計算機體系結構中約定了哪些地方可以用來存儲數據&#xff1a;CPU內的寄存器、內存和外存。不同的存儲介質&#xff0c;容量、速度…

GCC中SIMD指令的應用方法

X86架構上的多媒體應用開發&#xff0c;如果能夠使用SIMD指令進行優化&#xff0c; 性能將大大提高。目前&#xff0c;IA-32的SIMD指令包括MMX&#xff0c;SSE&#xff0c;SSE2等幾級。 在GCC的開發環境中&#xff0c;有幾種使用SIMD指令的方式&#xff0c;本文逐一介紹。X86的…

使用angular4和asp.net core 2 web api做個練習項目(二), 這部分都是angular

上一篇: http://www.cnblogs.com/cgzl/p/7755801.html 完成client.service.ts: import { Injectable } from angular/core; import { Http, Headers } from angular/http; import { Observable } from rxjs/Observable; import { ErrorHandler } from angular/core; import rxj…

leelen可視對講怎么接線_樓宇對講系統怎么布線 樓宇對講系統布線方式【介紹】...

隨著智能小區規模不斷增加&#xff0c;樓宇可視對講系統應用越來越廣泛&#xff0c;因而視頻信號的傳輸方式與布線設計顯得越來越重要。視頻信號與數據和音頻信號不同&#xff0c;可行的一種傳輸方式為視頻信號基帶傳輸&#xff0c;下面小編就簡要介紹一下這種傳輸方式和布線方…

路由匯總實例

5.2.2.2 路由匯總策略 之前提到過&#xff0c;在網絡管理員計劃好子網選擇并進行預期地路由匯總時&#xff0c;手動路由匯總工作能取得最佳效果。例如&#xff0c;之前的例子設定好了一個考慮周全的計劃&#xff0c;管理員只使用遠離Yosemite路由器并以10.2開頭的子網。這個規定…

《操作系統》OS學習(五):連續內存分配 內存碎片、動態分配、碎片整理、伙伴系統

內存碎片 在沒有其他方式輔助的情況下&#xff0c;我們分配給一個進程的內存是連續的。在分配時候我們需要有動態分配與碎片處理。如何理解呢&#xff1f;就是每個進程需要一塊內存&#xff0c;我們要選取合適的位置的內存分配給它。當有的進程先結束了內存還給操作系統&#…

GCC 中文手冊 - 摘自純C論壇

GCC Section: GNU Tools (1) Updated: 2003/12/05 Index Return to Main Contents NAME gcc,g-GNU工程的C和C編譯器(egcs-1.1.2) 總覽(SYNOPSIS) gcc[option|filename ]... g[option|filename ]... 警告(WARNING) 本手冊頁內容摘自GNU C編譯器的完整文檔,僅限于解釋選項的含義…

python如何實現支持中文

#codingutf-8print("我要python支持中文") 默認情況下&#xff0c;python是不支持中文的。 如果要實現python支持中文&#xff08;我是從python3.6開始學習的&#xff09;&#xff0c;只要在python文檔的開頭加入&#xff1a;“#codingutf-8"就可以了。轉載于:h…

世界之窗瀏覽器刪除文本框信息_文本框——Excel里的便利貼

工作表里面的單元格應該是足夠我們來記錄數據和信息了。但是文本框這個功能在工作表中還是存在&#xff0c;可以理解為便利貼功能。插入文本框1.點擊“插入”選項卡。2.然后點擊“文本框”。3.在下拉菜單里面&#xff0c;有兩種可供選擇&#xff1a;橫排文本框和垂直文本框。在…

RHEL 5服務篇—常用網絡配置命令

常用網絡配置命令 在“Linux系統管理”的文章中&#xff0c;大家已經學習了Linux系統的基本管理命令和技巧&#xff0c;為了進一步學習Linux網絡服務打下了良好的基礎。所以我作者以后將陸續推出Linux網絡服務的相關文章。希望大家能給與我大大的支持。 今天我們就來學習一下…

清華大學《操作系統》(六):非連續內存分配 段式、頁式、段頁式存儲管理

背景 連續內存分配給內存分配帶來了很多不便&#xff0c;可能所有空閑片區大小都無法滿足需求大小&#xff0c;這個分配就會失敗。基于這種現狀&#xff0c;就有了非連續內存分配的需求。非連續分配成功的幾率更高&#xff0c;但也面對更多的問題&#xff0c;比如分配時是不是…

python監控文件內容變化_Python監控文件內容變化

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云文件存儲NAS是一個可共享訪問&#xf…

C語言第三次博客作業---單層循環結構

一、PTA實驗作業。 題目1 1.實驗代碼 int n,i; double height1,height2;//1為輸入身高&#xff0c;2為輸出身高。 char sex; //1<height1<3; //N<1; scanf("%d",&n); while(n--){getchar();scanf("%c%lf",&sex,&height1);switch(sex)…

函數和函數式編程

python的過程就是函數&#xff0c;因為解釋器會隱式地返回默認值None。 實際編程中大部分偏函數更接近過程&#xff0c;不顯示地返回任何東西。 當沒有顯示地返回元素或者如果返回None時&#xff0c;python會返回一個None。 * 元組 ** 字典 def子句的剩余部分包括了一個雖…

清華大學《操作系統》(七):虛擬存儲、覆蓋、交換

接下來幾節都是對虛擬存儲的講解。虛擬存儲是非連續存儲管理的擴展。通過將內存中的數據暫存到外存的方式&#xff0c;為進程提供更大的內存空間。虛擬存儲出現的主要原因是因為程序規模的增長速度遠遠大于存儲器容量的增長速度&#xff0c;導致內存空間不夠用。其實針對內存空…

遵義大數據中心項目工程概況_市委書記張新文到曹州云都大數據中心等項目現場調研建設情況...

4月25日&#xff0c;市委書記張新文到曹縣調研重點項目建設情況&#xff0c;研究推進措施。市委常委、秘書長任仲義參加活動。張新文首先來到曹州云都大數據中心項目建設現場&#xff0c;查看項目推進情況。曹州云都大數據中心&#xff0c;是涵蓋云計算區、研發辦公區、公寓生活…

linux 可執行文件的分析(gcc GUN BUILEIN)

1、GCC The History of GCC 1984年&#xff0c;Richard Stallman發起了自由軟件運動&#xff0c;GNU (Gnus Not Unix)項目應運而生&#xff0c;3年后&#xff0c;最初版的GCC橫空出世&#xff0c;成為第一款可移植、可優化、支持ANSI C的開源C編譯器。GCC最初的全名是GNU C Com…

Cassandra 的數據存儲結構——本質是SortedMapRowKey, SortedMapColumnKey, ColumnValue

Cassandra 的數據存儲結構 Cassandra 的數據模型是基于列族&#xff08;Column Family&#xff09;的四維或五維模型。它借鑒了 Amazon 的 Dynamo 和 Googles BigTable 的數據結構和功能特點&#xff0c;采用 Memtable 和 SSTable 的方式進行存儲。在 Cassandra 寫入數據之前&a…

清華大學《操作系統》(八):置換算法

功能&#xff1a;置換算法是指當出現缺頁異常時&#xff0c;需要調入新頁面而內存已滿時&#xff0c;置換算法選擇被置換的物理頁面。 設計目標&#xff1a; 盡可能減少頁面的調入調出次數&#xff1b;把未來不再訪問或短期內不訪問的頁面調出。 頁面鎖定&#xff1a; 了解具…