尝试在 CoffeeScript 中注册服务工作者时,最新的 Chrome 浏览器似乎不支持服务工作者,我知道这不是真的。这是我的 app.coffee,它被转换为 JavaScript 并加载到我的网页上:
registerServiceWorker = () =>
if 'serviceWorker' in navigator
await navigator.serviceWorker.register '/service-worker.js'
console.log "Service Worker Registered"
else
console.log "No service worker support"
registerServiceWorker()
这是生成的 JavaScript:
// Generated by CoffeeScript 2.7.0
(function() {
var registerServiceWorker,
indexOf = [].indexOf;
registerServiceWorker = async() => {
if (indexOf.call(navigator, 'serviceWorker') >= 0) {
await navigator.serviceWorker.register('/service-worker.js');
return console.log("Service Worker Registered");
} else {
return console.log("No service worker support");
}
};
registerServiceWorker();
}).call(this);
JavaScript 控制台显示“No service worker support”。我的 Chrome 版本是版本 111.0.5563.65(官方构建)(64 位)。它在 Windows 11 上运行。
如我所料,如果我将“if navigator.serviceWorker”中的“if 'serviceWorker'”更改为“if navigator.serviceWorker”,那么一切正常。但是,尽管我有解决方法,但我开始怀疑在 CoffeeScript 中使用“X in Y”是否安全。有人有解释吗?
你应该使用
of
而不是 in
.
这可能是遗留问题,因为 coffeescript 使用
in
进行数组迭代,而 of
用于对象。这些存在运算符是为了匹配现有的迭代器语法,这使得它与对象的 in
和数组的 of
的 javascript 相反。
我个人会使用
if navigator?.serviceWorker
,因为 JS in
不会检查该值是否为空或在原型上定义。
在您的用例中,这些例外不适用,因此如果您愿意,您可以安全地使用in
。
您可以使用 in 来测试数组是否存在,以及 of 来测试 JavaScript 对象键是否存在。
...
变成a in b
[].indexOf.call(b, a) >= 0
变成a of b
a in b