我希望 JavaScript 中也存在 PHP 8 的功能
1:
2:
3:
我知道现在还有很多人对 PHP 不满,但在我看来,PHP 最新的 7 版本(已经问世五年多了!)已经发展成为一门优秀的语言,既有趣又类型安全。除了即时编译(JIT)可以大幅提升 PHP 应用程序的性能之外,PHP 8 版本还带来了许多实用功能。
我想介绍其中三个我真心希望也能在 JavaScript 中使用的功能。希望这些功能对那些还没接触过 PHP 8 的朋友有所帮助。开始吧!
#1 命名参数
假设您有一个foo
具有 6 个参数的函数a
,这些f
参数具有不同的默认值,现在您想调用该函数false
并仅传递最后一个参数的参数。
PHP 8:
foo(f: false);
//-----^
JavaScript:
foo('test', 42, true, 'bar', 5.5, false);
//--------------------------------^
不幸的是,在 JavaScript 中,向函数传递参数完全取决于参数的位置。我知道可以使用对象和解构来模拟命名参数,但原生特性在这里会更方便。
参见RFC:命名参数
#2 匹配表达式
PHP 的新match
表达式与语句非常相似switch
,只不过它是一个表达式,可以用来直接给变量赋值或返回值。如果您有两个以上的赋值可能值,这将非常方便。
PHP 8:
$fontWeight = match ($weight) {
100, 200 => "Super Thin",
300 => "Thin",
400, 500 => "Normal",
600, 700, 800 => "Bold",
900 => "Heavy",
default => "Not valid"
};
JavaScript:
let fontWeight = '';
switch (weight) {
case 100:
case 200:
fontWeight = "Super Thin";
break;
case 300:
fontWeight = "Thin";
break;
case 400:
case 500:
fontWeight = "Normal";
break;
case 600:
case 700:
case 800:
fontWeight = "Bold";
break;
case 900:
fontWeight = "Heavy";
break;
default:
fontWeight = "Not valid";
break;
}
该match
表达式可以由 JavaScript 对象模拟,但这将需要额外的变量(因此需要更多的保留内存),并且在检查的值不允许用作对象键的情况下将会失败。
参见文档:match
#3 可选链式调用
仅当所需属性存在时才进行链式查询,这是一种非常优雅的对象查询方式。在 PHP 中,现在您可以使用 nullsafe 运算符来实现这一点。
PHP 8:
$country = $session?->user?->getAddress()?->country;
JavaScript:
const country =
session && session.user && session.user.getAddress() && session.user.getAddress()['country']
? session.user.getAddress()['country']
: null;
在 JavaScript 中,你仍然需要一步步检查相应的属性是否存在。目前有一个相应的TC39 提案,处于第 4 阶段,我非常期待它能成为 ECMAScript 规范的一部分。
总结
以上我们介绍了 PHP 8 的一些新功能,它们对 JavaScript 来说也是一个很好的补充。也许你还想到了 JavaScript 中缺少的其他 PHP 功能,或者你知道比我更好的 JavaScript 方案来解决上述问题?太好了!欢迎在评论区留言讨论。
编辑日期:2021 年 2 月 10 日(扩展match
示例)
发布日期:2021 年 2 月 8 日