2023年10月30日 星期一

透過 Object.fromEntries() 將 Map 快速複製到 Object

 透過 Object.fromEntries() 將 Map 快速複製到 Object

前言

  在之前的 [ developer.mozilla.org ] Map 介紹過 Map ,最近發現 Object.fromEntries() 可以快速複製內容到 Object ,在此把學習的過程做個紀錄。


內容

  Map 的儲存結構很像 Object ,透過瀏覽的方式來複製也不是不可以,只是最近發現可以透過 Object.fromEntries() 來複製,範例如下

let map = new Map([
  ['z','aa'] , 
  [12,'bb'] , 
  ['abc',13] , 
  [1234,5678] 
]);
//
let obj = Object.fromEntries( map );
console.log( obj );
// [object Object] {
//   12: "bb",
//   1234: 5678,
//   abc: 13,
//   z: "aa"
// }
//
let obj1 = Object.assign( { a : 1} , Object.fromEntries( map ) );
console.log( obj1 );
// [object Object] {
//   12: "bb",
//   1234: 5678,
//   a: 1,
//   abc: 13,
//   z: "aa"
// }


Object.fromEntries() 只要把要 Copy 的 Map 當參數就可以得到 Copy 的結果,要複製到 Object ,可以透過 Object.assign() 來複製,如範例的 obj1 。


參考資料

[ developer.mozilla.org ] Map

[ developer.mozilla.org ] Object.fromEntries()


相關文章與資料

關於 JavaScript 的 Map

2023年10月23日 星期一

注意 Object.assign() 不能複製自定義的 Property

 注意 Object.assign() 不能複製自定義的 Property

前言

  在之前的 注意 enumerable 的特性會引響 Object.assign() 的行為 有提到 Object.assign() 在特別情形不會完全複製內容,最近又發現自定義的 Property 全部都不會複製!在此把學習的過程做個紀錄。


內容

  範例如下

let obj = {
};
//
Object.defineProperty( obj , 'prop' ,{ value:10 } );
console.log( obj.prop );//10
//
Object.defineProperty( obj , 'prop1' ,{
  value : 20,
  writable: true 
} );
console.log( obj.prop1 );//20
//
let copyObj = Object.assign( {} , obj );
console.log( copyObj.prop );//undefined
console.log( copyObj.prop1 );//undefined


範例在 obj 自定義 prop 與 prop1 ,再透過 Object.assign() 複製到 copyObj ,複製後會發現 prop 與 prop1 並不存在於 copyObj ,看來複製自定義的 function 是需要自己寫的!


參考資料

[ developer.mozilla.org ] Object.defineProperty()

[ developer.mozilla.org ] Object.assign()


相關文章與資料

注意 enumerable 的特性會引響 Object.assign() 的行為

2023年10月16日 星期一

注意 enumerable 的特性會引響 Object.assign() 的行為

 注意 enumerable 的特性會引響 Object.assign() 的行為

前言

  在之前的 關於自定義 Property 的 enumerable 與 在 JavaScript 裡複製物件的新選項 分別提到了 enumerable 與 Object.assign() ,它們其實會互相引響,在此把學習的過程做個紀錄。


內容

  範例如下

let obj = Object.create(
  {},
  {
    prop1: {
      value: 2, 
      enumerable: false, 
    },
    prop2: {
      value: 3,
      enumerable: true, 
    },
  },
);
//
let copy = Object.assign({}, obj);
console.log(copy); 
// [object Object] {
//   prop2: 3
// }


範例分別自定義 prop1 與 prop2  兩個 Property ,一個允許 enumerable ,另一個則不允許,接著透過 Object.assign() 後會發現 prop1 沒有被成功複製,所以 enumerable 不只引響 Object.getOwnPropertyNames() 的結果,也會引響 Object.assign() 的結果。


參考資料

[ developer.mozilla.org ] Object.defineProperty()

[ developer.mozilla.org ] Object.assign()


相關文章與資料

關於自定義 Property 的 enumerable

在 JavaScript 裡複製物件的新選項


2023年10月9日 星期一

注意 preventExtensions() 在空物件運行時的特別行為

 注意 preventExtensions() 在空物件運行時的特別行為

前言

  在 關於檢查 Object.preventExtensions() 、Object.seal() 與 Object.freeze() 的注意事項 有提到 Object.preventExtensions()  ,但我發現它在空物件時遽然有不一樣的結果 ,在此把學習的過程做個紀錄。


內容

  範例如下

let objPE = {
};
let objPE1 = {
  a : 10
};
let objSeal = {
};
let objFrozen = {
};
//
Object.preventExtensions( objPE );
Object.preventExtensions( objPE1 );
Object.seal( objSeal );
Object.freeze( objFrozen );
//
console.log( Object.isExtensible( objPE ) );//false
console.log( Object.isSealed( objPE ) );//false
console.log( Object.isFrozen( objPE ) );//false
//
console.log( Object.isExtensible( objPE1 ) );//false
console.log( Object.isSealed( objPE1 ) );//true
console.log( Object.isFrozen( objPE1 ) );//true

//
console.log( Object.isExtensible( objSeal ) );//false
console.log( Object.isSealed( objSeal ) );//true
console.log( Object.isFrozen( objSeal ) );//false

//
console.log( Object.isExtensible( objFrozen ) );//false
console.log( Object.isSealed( objFrozen ) );//true
console.log( Object.isFrozen( objFrozen ) );//true


範例的 "objPE" 與 "objPE1" 分別代表要進行 Object.preventExtensions()  的非空物件與空物件,要注意比對在 Object.isSealed() 與 Object.isForzen() 的結果是不一樣的!而 Object.seal() 與 Object.freeze() 在空物件與非空物件的結果是一樣的。


參考資料

[ developer.mozilla.org ] Object.isExtensible()

[ developer.mozilla.org ] Object.isSealed()

[ developer.mozilla.org ] Object.isFrozen()


相關文章與資料

關於檢查 Object.preventExtensions() 、Object.seal() 與 Object.freeze() 的注意事項

2023年10月2日 星期一

關於檢查 Object.preventExtensions() 、Object.seal() 與 Object.freeze() 的注意事項

 關於檢查 Object.preventExtensions() 、Object.seal() 與 Object.freeze() 的注意事項

前言

  Object.preventExtensions() 、Object.seal() 與 Object.freeze() 這三個相似的功能,看似個別獨立,但實際上有相關聯,在此把學習的過程做個紀錄。


內容

  JavaScript 提供 Object.isExtensible() 、Object.isSealed() 與 Object.isFrozen() 來分別檢查狀態,範例如下

let objPE = {
  a:123
};
let objSeal = {
  b:123
};
let objFrozen = {
  c:123
};
//
Object.preventExtensions( objPE );
Object.seal( objSeal );
Object.freeze( objFrozen );
//
console.log( Object.isExtensible( objPE ) );//false
console.log( Object.isSealed( objPE ) );//false
console.log( Object.isFrozen( objPE ) );//false

//
console.log( Object.isExtensible( objSeal ) );//false
console.log( Object.isSealed( objSeal ) );//true
console.log( Object.isFrozen( objSeal ) );//false

//
console.log( Object.isExtensible( objFrozen ) );//false
console.log( Object.isSealed( objFrozen ) );//true
console.log( Object.isFrozen( objFrozen ) );//true


範例準備三個物件分別做 Object.preventExtensions() 、Object.seal() 與 Object.freeze()  ,接著分別用檢查個別狀態,經過 Object.preventExtensions() 後,不算是 seal 與 freeze ,接著經過 Object.seal() 後 ,算是 preventExtensions 但不算是 freeze ,最後經過 freezec 後,不但是 preventExtensions  也是 seal  ,這三個相似功能看似個別獨立,但事實上是有相關性的!在使用時要注意這個特性。


參考資料

[ developer.mozilla.org ] Object.isExtensible()

[ developer.mozilla.org ] Object.isSealed()

[ developer.mozilla.org ] Object.isFrozen()


相關文章與資料

禁止擴充物件的另一個選擇

2023年9月25日 星期一

禁止擴充物件的另一個選擇

 禁止擴充物件的另一個選擇

前言

  在之前的 在 JavaScript 禁止物件擴充 介紹了禁止擴充物件的方法,最近發現還有另一個方法也可以禁止物件擴充,在此把學習的過程做個紀錄。


內容

  這次要透過 Object.seal() 來禁止擴充物件,範例如下

let obj = {
  a : 1,
  b : 2
};
Object.seal(obj);
obj.c = 3;
console.log( obj );
// [object Object] {
//   a: 1,
//   b: 2
// }
delete obj.b;
console.log( obj );
// [object Object] {
//   a: 1,
//   b: 2
// }
obj.b = 42;
console.log( obj );
// [object Object] {
//   a: 1,
//   b: 42
// }


範例開頭就透過 Object.seal()  來禁止物擴充,接著實驗擴充該物件後發現是不可以的,接著測試刪除成員,結果一樣是不行,接著試驗修改成員,結果是可以的! Object.seal() 與 Object.preventExtensions() 最大的不同是 Object.seal() 是"不可"刪除成員,但 Object.preventExtensions() 是可以的。


參考資料

[ blog.boggy.tw ] 搞懂 JavaScript的Object.freeze, Object.seal, Object.preventExtensions 到底在幹嘛


相關文章與資料

在 JavaScript 禁止物件擴充

關於 Object.preventExtensions() 的注意事項

2023年9月18日 星期一

在重灌 Windows 時如何分割 2T 以上的磁碟

 在重灌 Windows 時如何分割 2T 以上的磁碟

前言

  最近因為主硬碟掛了,所以買了個 6T 的硬碟來重灌,但重灌時卡在磁碟分割,分割後硬碟的容量只剩 2T ,在此把解決問題的過程做個紀錄。


內容

  在分割程式分割後只剩 2T ,而且不能夠刪除!這時按下 Shift+F10 ,這時會跑出 console ,並在 console 下輸入

diskpart


接著輸入

list disk


其實 diskpart 就是 Windows 磁碟分割的程式,接著可以透過以下確認被割壞的硬碟的號碼

接著透過以下命令

select disk (被割壞的磁碟號碼)
clean all


接著回到 Windows 的分割程式,有個重整的按鈕,按下後就可以看到磁碟回復到未分割的狀態,這樣只是把割壞的硬碟變回正常的狀態,還是無法正常分割。


  查了一下發現是 Windows 有分用 MBR 與 UEFI 兩種開機,一般不選就是用 MBR 的方式,但這個方法會發生無法分割 2T 以上的硬碟的問題,所以要換成用 UEFI 的方式開機,在用 UEFI  開機時要先確認一些 BIOS 的設定,可以參考以下


我這邊對了一下,我需要開啟的只有 Intel PXE Option ROM,這個其實我並沒有確認必要性,因為我的情況是用 CD-ROM 來開機,而不是隨身碟,接著是我卡最久的地方,就是把設定的射完後,再把 CD-ROM (我的情況是 CD-ROM 會提供兩種開機讓我選,其中有一個開頭有 "(UEFI)" )設為最優先開機,結果不行!最後發現要直接在 BIOS 調整順序那,直接"雙擊"你要開機的選項,結果神奇的事情發生了! Windows 可以正常分割 2T 的硬碟,也就是成功用 UEFI 來開機,之前把 UEFI 光碟開機選項調成第一後跳出 BIOS ,無論如何都會用 MBR 來開,這是 Bug 嗎?我不確定 ,這坑沒踩得一定不會知道,就當上了一課。


參考資料

[ learn.microsoft.com ] 安裝 Windows 期間,在大於 2.2 TB 的磁片磁碟機上建立單一磁碟分割時,發生錯誤

[ tw.easeus.com ] Diskpart 是什麼

[ ofeyhong.pixnet.net ] 【教學】搞懂硬碟分割:舊版BIOS/MBR 與 新版UEFI/GPT 有什麼差別?