走進JavaScript——重拾對象

来源:http://www.cnblogs.com/pssp/archive/2017/05/29/6919286.html
-Advertisement-
Play Games

創建對象 Object構造器的參數如果為空或null、undefined將返回一個空的Object對象,如果為其他值則調用相應的構造器,如 如果傳遞多個參數取第一個,由於使用構造器來創建對象需要判斷參數所以一般比我們直接使用字面量{}創建對象要慢一些。 我們也可以自己定義一個構造器來創建對象,如下 ...


創建對象

Object構造器的參數如果為空或null、undefined將返回一個空的Object對象,如果為其他值則調用相應的構造器,如

new Object()
// Object {}
new Object(null)
// Object {}
new Object(undefined)
// Object {}
new Object(1)
// Number {[[PrimitiveValue]]: 1}
new Object("a")
// String {0: "a", length: 1, [[PrimitiveValue]]: "a"}
new Object({})
// Object {}
new Object([1,2,3])
// [1, 2, 3]
new Object(function(){})
// function (){}

如果傳遞多個參數取第一個,由於使用構造器來創建對象需要判斷參數所以一般比我們直接使用字面量{}創建對象要慢一些。

我們也可以自己定義一個構造器來創建對象,如下

function CreateObj(){}
var obj = new CreateObj();
obj.a = 10;
// 10

這些方法創建的對象都不是一個真正乾凈的對象,如果希望創建一個沒有原型繼承的空對象則可以使用Object.create方法

Object.create(null)
// Object {} No Properties

對象直接量

var obj = {
    title: '晴天',
    content: '....'
};

key可以以字元串形式來寫也可以按標識符來寫,一般我們會以標識符來寫,當遇到需要使用一些不合法的標識符時我們會以字元串的形式來寫,如:

{1:2};
{.l:1};

由於以上對象屬性名是不合法的,因此我們需要使用字元串的形式來寫。

{'1':2};
{'.l':1};

如果key和value名一樣,value值可以不寫

var a = 1;
var obj = {a};
console.log(obj);
// Object {a: 1}

如果希望key是一個變數,我們可以這樣

var a = 'hello';
console.log({[a]:a});
Object {hello: "hello"}

在一個對象中不能有多個同名屬性,如果相同最後一個將覆蓋之前的

{
    a:123,
    a:456
}
// Object {a: 456}

對象不能有多個同名屬性的特性,我們可以使用它來實現數組過濾重覆項

var arr = [1,3,3,2,1,1],
    obj = {};
arr.forEach((item)=>obj[item] = item);
console.log(obj)
// Object {1: 1, 2: 2, 3: 3}

但由於對象的儲存並不是按照我們填寫的順序來的,因此對於有順序要求的我們就不能使用上面的方式來實現了。

對象和數組在某些方面非常相似,因此只需要我們按照數組的格式來寫就可以將對象轉換成一個數組

Array.from({
    '0':'hello',
    '1':'world',
    'length':2
})
// ["hello", "world"]

遍歷對象

for in

var obj = {html:111,javascript:222};
for(let key in obj){
    console.log(obj[key]);
}
// 111
// 222

for in會將原型繼承中的值也迴圈出來,因此我們需要過濾一下

// 沒過濾之前
Object.prototype.a = '搗亂的';
var obj = {html:111,javascript:222};
for(let key in obj){
    console.log(obj[key]);
}
// 111
// 222
// 搗亂的

// 過濾之後
Object.prototype.a = '搗亂的';
var obj = {html:111,javascript:222};
for(let key in obj){
    if(obj.hasOwnProperty(key)){
        console.log(obj[key]);
    }
}
// 111
// 222

我們也可以用for來迴圈對象,不過我們得先使用Object.keys來取對象的key

Object.prototype.a = '搗亂的';
var obj = {html:111,javascript:222};
var arr = Object.keys(obj);
for(let i = 0; i < arr.length; i++){
    console.log(obj[arr[i]]);
}
// 111
// 222

for of

Object.prototype.a = '搗亂的';
var obj = {html:111,javascript:222};
for(let key of Object.keys(obj)){
    console.log(obj[key]);
}
// 111
// 222

對象與其他值的運算

和對象、function相加會轉換成字元串拼接,如果是其他值則會轉換為數字

{} + null
// 0
{} + undefined
// NaN
{} + 'a'
// NaN
{} + '111'
// 111
{} + {}
// "[object Object][object Object]"
{} + [2]
// 2
{} + function(){}
// "[object Object]function (){}"

如果是相減則會將對象轉換為-0(註意是-0),如果是對象減對象則是NaN

{} - ''
// -0
{} - []
// -0
{} - null
// -0
{} - undefined
// NaN
{} - {}
// NaN
{} - function(){}
// NaN
{} - 2
// -2

為什麼說對象被轉換成負0而不是0呢,我們用一個例子來證明

0 - 0
// 0
-0 - 0
// -0

所以說對象被轉換成-0而不是0


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 頁面編碼(告訴瀏覽器是什麼編碼) 刷新和跳轉 關鍵詞 X-UA-Compatible Title網頁頭部信息 常用標簽 表格 實例: ...
  • 學習和工作中經常會通過搜索引擎的引導進入到博客園中,技術大牛們的知識概括往往一針見血解決了困擾我很久的大大小小的問題。可是一直都是看別人寫的博客,自己一直沒動過手,直到看到一個博客說到,從簡到繁地記記讀書筆記或知識總結是促進技術進步的一個很好的方法,覺得非常在理,學習後的整理更能記得牢固,於是最近下 ...
  • 本書從現代前端開發的標準、趨勢和常用工具入手,由此引出了優秀的構建工具webpack 和JavaScript庫React,之後用一系列的實例來闡述兩者的特色、概念和基本使用方法。隨著應用複雜度的增加,進而介紹了Flux 和Redux 兩種架構思想,並且使用Redux 對現有程式進行改造,最後介紹了在 ...
  • 一、在nodejs中path模塊時使用頻率很高的模塊,其中不乏有很多API寫得很模糊,但仔細琢磨下來,也不是很難理解。 1.獲取文件所在路徑 2.獲取路徑中的最後一部分 3.獲取文件的拓展名 二、組合路徑 1. 路徑的拼接 path.join(); 2.path.resove(from,to);將t ...
  • JavaScript是一門弱類型語言,它的數據類型分為兩大類:簡單數據類型(5種:Undefined、Null、Boolean、Number、String)和複雜數據類型(1種:Object)。Object是ECMAScript中使用最多的一個類型,所有的引用類型的值都是Object類型的實例。引用 ...
  • rem單位大家可能已經很熟悉,rem是隨著html的字體大小來顯示代表寬度的方法,我們怎樣進行移動端響應式開發呢 瀏覽器預設的字體大小為16px 及1rem 等於 16px 如果我們想要使1rem等於 12px 只需設置html的字體大小為 12/16 及html的字體大小為font-size:75 ...
  • 語義化是指用合理HTML標記以及其特有的屬性去格式化文檔內容。通俗地講,語義化就是對數據和信息進行處理,使得機器可以理解. 語義化的HTML文檔有助於提升你的網站對訪客的易用性,比如使用PDA、文字瀏覽器以及殘障人士將從中受益。對於搜索引擎或者爬蟲軟體來說,則有助於它們建立索引,並可能給予一個較高的 ...
  • 我們在angualrjs移動開發中遇到輪播圖的功能 安裝 swiper npm install --save swiper 或者 bower install --save swiper 引入文件路徑 指令中的編寫方式 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...