25 個 JavaScript 新特性,讓你的程式碼更簡潔、更強大!

JavaScript 作為最受歡迎的程式語言之一,隨著 ECMAScript 標準的持續更新,為開發者帶來了許多實用又強大的新功能。不管你是新手還是老手,這些新特性都能幫助你寫出更簡潔、更高效的程式碼!以下精選了 25 個超實用的 ES 新特性,一起來看看吧!


1. 可選鏈操作符(Optional Chaining)

告別繁瑣的空值檢查,只需用 ?. 就能輕鬆處理物件屬性訪問。

javascript

// 傳統寫法
const street = user && user.address && user.address.street;

// 新寫法
const street = user?.address?.street;


2. 空值合併運算符(Nullish Coalescing)

?? 處理 nullundefined 的預設值設定。

javascript

const value = null;
const defaultValue = value ?? 'default'; // 結果為 'default'

3. 私有類字段(Private Class Fields)

# 宣告私有字段,讓封裝性更強。

javascript

class Person {
#name;
constructor(name) {
this.#name = name;
}

getName() {
return this.#name;
}
}


4. 動態匯入(Dynamic Import)

按需載入模組,提升應用效能。

javascript

button.addEventListener('click', async () => {
const module = await import('./feature.js');
module.doSomething();
});

5. Array.prototype.flat() 和 flatMap()

輕鬆展平嵌套陣列。

javascript

const nested = [1, [2, 3], [4, [5, 6]]];
const flattened = nested.flat(2); // 結果為 [1, 2, 3, 4, 5, 6]

6. 物件字面量增強

更簡潔的物件屬性與方法定義。

javascript

const name = 'Tom';
const age = 18;
const person = {
name,
age,
sayHi() {
console.log('Hi!');
}
};

7. Promise.allSettled()

等待所有 Promise 完成,不管成功或失敗。

javascript

const promises = [
fetch('/api/1'),
fetch('/api/2'),
fetch('/api/3')
];

const results = await Promise.allSettled(promises);


8. BigInt

處理超大整數。

javascript

const bigNumber = 9007199254740991n;
const result = bigNumber + 1n;

9. globalThis

統一的全域物件存取方式。

javascript

console.log(globalThis);

10. String.prototype.matchAll()

更強大的字串匹配功能。

javascript

const str = 'test1test2test3';
const regexp = /test(\d)/g;
const matches = [...str.matchAll(regexp)];

11. 邏輯賦值運算符

簡化條件賦值操作。

javascript

複製
x &&= y; // 等同於 x && (x = y)
x ||= y; // 等同於 x || (x = y)
x ??= y; // 等同於 x ?? (x = y)

12. Promise.any()

返回第一個成功的 Promise。

javascript

const promises = [
fetch('/api/1'),
fetch('/api/2'),
fetch('/api/3')
];

try {

const first = await Promise.any(promises);
console.log(first);
}
catch (error) {
console.log('All promises rejected');
}

13. 數字分隔符

提高大數字的可讀性。

javascript
const billion = 1_000_000_000;
const bytes = 0xFF_FF_FF_FF;

14. String.prototype.replaceAll()

一次替換字串中所有的匹配項。


15. WeakRef 和 FinalizationRegistry

更好的記憶體管理方式。


16. 頂層 await

在模組的頂層直接使用 await


17. 類靜態初始化塊

更靈活的類靜態成員初始化。


18. at() 方法

更直觀的陣列索引訪問。

javascript
const arr = [1, 2, 3];
console.log(arr.at(-1)); // 結果為 3

19. Object.hasOwn()

更安全的屬性檢查方法。


20. 錯誤原因(Error Cause)

更好的錯誤追蹤。


21. Array.prototype.group()

方便的陣列分組操作。


22. 正則表達式命名捕獲組

更清晰的正則匹配結果。


23. Promise.withResolvers()

更優雅的 Promise 操控方式。


24. Array 複製方法

不修改原陣列的情況下進行操作。

javascript

const arr = [1, 2, 3];
const copy = arr.toReversed(); // 複製並反轉
const sorted = arr.toSorted(); // 複製並排序

25. 裝飾器

增強類與類成員的功能。

javascript

function logged(target, context) {
return class extends target {
exec(...args) {
console.log('Starting execution...');
const result = super.exec(...args);
console.log('Finished execution.');
return result;
}
};
}

@logged
class Example {
exec() {
// ...
}
}


這 25 個 JavaScript 新特性不僅讓程式碼更簡潔,也讓開發過程更加流暢!快把它們用到你的專案中,提升程式碼品質吧!

理解c# 程式非同步async 跟await

隨著軟體開發的進步,以及硬體效能不斷增加,非同步程式設計是現代程式開發很重要的技術。在c# 主要以async 與await 二個關鍵字,讓非同步更直觀與容易管理。

非同步程式設計是允許程式在等待其他非阻塞任務操作完成時,能繼續執行其他任務的一個技術。能提高系統的回應性以及性能,尤其在處理高併發請求或者是耗時間的操作上。

async關鍵字

這個關鍵字主要用宣告這個方法是非同步的,但它不會去啟動一個新的執行緒,而是告訴compiler該下來的方法會有await的關鍵字,compiler需要為這個方法支持非同步的操作。

而async主要是宣告方法,而且只能回傳Task、Task<TResult>、void一起使用,但不建議void。

await關鍵字

awiat 是用來等待非同步操作完成用的關鍵字,只能在有宣告asyncASYNC的方法內部,compliler遇到await ,會將方法中其他部門註冊為等待任務延續,然後立既返回user。


using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
static async Task Main(string[] args) // Main也可以非同步的
{
try
{
string content = await DownloadContentAsync(“https://example.com”);
Console.WriteLine(content.Substring(0, 100));
}
catch (Exception ex)
{
Console.WriteLine($”An error occurred: {ex.Message}”);
}
}

static async Task DownloadContentAsync(string url)
{
using (HttpClient client = new HttpClient())
{
HttpResponseMessage response = await client.GetAsync(url); // 透過非同步取得
response.EnsureSuccessStatusCode(); // 確定回應碼是是正確
return await response.Content.ReadAsStringAsync(); // 透過非同步取得回傳內容作回應
}
}
}

上面的例子中,透過await 關鍵字 donwloadcontentasync 的方法,不會阻塞主執行緒,而是允許程式在等網路回應時繼續執行其他任務

非同步的異常處理

在處理非同步的異常,可以用try catch 來await 。而非同步方法在拋出異常時,會封裝在回傳的Task 裡。

注意的事

避免在非同步用.Result 跟 wait() 會導致死結與效能問題

非同步方法會盡可能快速回傳,避免在非同步的方法裡執行需長時間運行的同步程式,會造成執行緖阻塞。
確實處理非同步中會發生的異常,避免程式崩潰與資料損毀

團購、直播下單使用google 表單並即時mail/SMS通知

google 有一個apps script的服務,可以結合表單 。

 

function sendEmailOnNewEntry(e) {
var sheet = e.source.getActiveSheet();
var range = e.range;
var row = range.getRow();

var emailAddress = sheet.getRange(row, 2).getValue();
var ordername =sheet.getRange(row, 3).getValue();
var ordernum = sheet.getRange(row,5).getValue();
var ordergetdate = sheet.getRange(row,6).getValue();
var mobileNumber = sheet.getRange(row, 4).getValue();

var subject = '【豐原團購】甲竹園玫瑰檸檬塔訂購成功';
var message = ordername+'您好:提醒您玫瑰檸檬塔訂購成功. 訂購數量為'+ordernum+'盒,預計取貨日為:'+ordergetdate;

if (emailAddress) {
MailApp.sendEmail(emailAddress, subject, message);
}
// 發送簡訊
if (mobileNumber) {
var smsMessage = ordername+'您好,玫瑰檸檬塔訂購成功。數量為' + ordernum + '盒,取貨日為:' + ordergetdate;
sendSMS(mobileNumber, smsMessage);
}
var lineMessage= ordername+'您好,玫瑰檸檬塔訂購成功。數量為' + ordernum + '盒,取貨日為:' + ordergetdate;
sendLineNotify(lineMessage);
}

function sendLineNotify(message) {

var lineNotifyToken = 'xxxxxxxxxxxx';
var url = 'https://notify-api.line.me/api/notify';
var options = {
'method': 'post',
'payload': 'message=' + message,
'headers': {
'Authorization': 'Bearer ' + lineNotifyToken
}
};
UrlFetchApp.fetch(url, options);
}

function sendSMS(mobile, message) {
var url = 'http://api.twsms.com/json/sms_send.php';
var username = 'xxxxxxxx'; // 替換為你的用戶名
var password = 'xxxxxxxxxx'; // 替換為你的密碼

var payload = {
username: username,
password: password,
mobile: mobile,
message: encodeURIComponent(message)
};

var options = {
method: 'post',
payload: payload
};

UrlFetchApp.fetch(url, options);
}

有趣的.net core 後端人員AI面試

昨天晚上,wil 保哥發了一則貼文。就是用gpt4訓練了一個.net core 後端工程師的面試line。主要是透過問答方式,瞭解像.net core與.net framework的異同、restful api的設計原則、非同步、DI、memorycache、middleware、entity framework。

wil保哥徵才原貼

gpt 多奇 AI 面試官 ( .NET )

line官方帳號  @290quxfz

地震使用業務型無線電防災

2017年辦市集時,前小編建議的無線電
用的時間不多,但為了怕電池問題 三不五時都帶出來
這次地震,剛好就拿到公司做防震的一個宣導
在地震當下會有停電,這時候依靠基地台的手機通訊僅能撐一小時
而一般無線電1800毫安(mah),以接收的耗電量100ma來計算。可以待機18小時(電池續航力 = 電池容量 (mAh) / 負載電流 (mA)),以救難整點呼救的慣例,可以有至少一週的電量。
而這種免考照的UHF業務型無線電,依台灣發給的FRS從467.5125~467.6750共14頻道以及38組CTCSS (Continuous Tone-Coded Squelch System),也是很容易找得到。缺點是聽不到收音機而已~ 但這頻率對於室內的穿透性是很高的

使用.net 搖控 DJI TELLO 無人機

 

看到DJI TELLO有SDK,幾個重點

1 使用的是UDP

2   IP是: 192.168.10.1

3  使用的PORT有 8889(指令) 8890(狀態) 11111(取得畫面)

程式碼大概就是


// 定義 IP

string DJIIP = "192.168.10.1";

//定義埠號

int DJIPort = 8889;

// 開啟

UdpClient udpClient = new UdpClient();

udpClient.Connect(DJIIP,DJIPort);

//
Byte[] sendCmdBytes = null;

sendCmdBytes = Encoding.UTF8.GetBytes(“takeoff”);

udpClient.Send(sendCmdBytes, sendCmdBytes.Length);

 

 

https://www.ryzerobotics.com/zh-tw

https://www.ryzerobotics.com/zh-tw/tello/downloads