走進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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...