如何判断是否支持JavaScript操作符?

如何判断是否支持JavaScript操作符?,javascript,Javascript,刚刚意识到我的脚本在我的iphone上不起作用,并发现以下几行是罪魁祸首 return (this.currentElements[0].labels[0].textContent ?? 'This field') + " must be one of " + validValues.join(', '); 表示Safari 13.4支持它,我想我有13.3。不管怎样,都需要解决 有没有办法通过在客户机上执行JavaScript来判断诸如?之类的运算符是否受支持?如果是这样

刚刚意识到我的脚本在我的iphone上不起作用,并发现以下几行是罪魁祸首

return (this.currentElements[0].labels[0].textContent ?? 'This field') + " must be one of " + validValues.join(', ');
表示Safari 13.4支持它,我想我有13.3。不管怎样,都需要解决

有没有办法通过在客户机上执行JavaScript来判断诸如
之类的运算符是否受支持?如果是这样,我会在必要时检测并执行一些替代方法

有点离题了,但是有人知道可以与Safari和iOS一起使用的polyfill吗?

您可以试试这个检查

const运算符supported=eval('null??true')
但是如果??不支持,因此函数应为try…catch

const运算符支持=(()=>{
试一试{
返回eval('null??true');
}捕捉(错误){
返回错误
}
})();

为了运行它一次,块被包装到匿名函数中,因此eval变得有点性能

,而不是检查函数是否工作,您可以重写它,以便最终结果相同

_content = this.currentElements[0].labels[0].textContent;

return ((_content === null || _content === undefined) ? 'This field' : _content) + " must be one of " + validValues.join(', ');
您甚至可以有一个可重复使用的函数来完成相同的任务:

function nullish(a,b){
  return (a === null || a === undefined) ? b : a
}
如何检测操作员支持? 单独使用try/catch是不可能的。您可以尝试/捕获表达式,但不能使用新语法。例如,此代码甚至不会解析:

const-support\u-dollar\u操作符=()=>{
试一试{
1 $ 2;
返回true;
}捕获(e){
返回false;
}
}
支持_-dollar_操作符();//你的浏览器在那之前爆炸了
但是,可以使用
eval

const-support\u-dollar\u操作符=()=>{
试一试{
估价(`1$2`);
返回true;
}捕获(e){
返回false;
}
}
支持_-dollar_操作符();
//=>错误
是否可以对操作员进行多填充? 是和否

是的,你可以在Babel等工具中使用新的操作符,但如果你的目标受众不支持该操作符,它会在幕后重写你的代码。它看起来是这样的:

//您的代码
酒吧??'巴兹
//运输
bar==未定义?“巴兹:酒吧
如何解决您的问题? 您尚未发布错误消息,因此我们不能假定您的问题是由于不支持
造成的

即使支持
??
,此操作也会失败:

var-foo;
foo.bar??'巴兹';
//=>错误:未捕获类型错误:无法读取未定义的属性“bar”
??
运算符并不意味着在路径上的某些内容未定义时提供回退。这是
操作员的工作。
操作员:

var-foo;
foo?.bar??'巴兹';
//=>“baz”
在代码中,如果A或B未定义,则可能会导致错误:

(this.currentElements[0]。标签[0]。文本内容???“此字段”)
//    ^                  ^
//A B

好消息是,
?。
操作符在iOS上的Safari中受支持

,您只需将其放入try-catch即可block@ritaj是正确的,但如果这样做,则需要编写两次代码—一次用于受支持的环境,一次用于不受支持的环境。你可以跳过这一点,用Babel传输代码。或者你可以使用最新的JavaScript规范,编译成不太现代的版本,以支持你想要支持的浏览器。感谢imvain2,虽然我很欣赏你的答案,也可能会使用它,但它并没有真正回答具体的问题。不管怎样,我投了一票。谢谢uke,用它试过了(没有mac),结果导致脚本崩溃。我尝试了
警报(运算符支持?'true':'false')
如果我只是将
运算符支持
设置为
,我会收到警报,但如果我使用
eval('null??true')
来设置它,则不会收到警报。嘿,我不熟悉lamdatest。此代码对于支持它的浏览器返回true,对于不支持它的浏览器返回undefined。可能会有关于eval的安全检查,但如果你主持该网站,它应该是好的,你可能是对的,我试图确认,但无法。我回到lamdatest尝试
eval('null?true:false')
,但显然有六分钟的试用时间限制,并意外使用了它。请更新我的答案,你能试试吗?谢谢,似乎有效,但除非我能找到一个好的实现方法,否则可能会使用imvain2解决方案。类似于
nullishCoalese('this.currentElements[0].labels[0].textContent','this field')
将这两个问题传递给您的解决方案,尝试评估,如果没有,则执行性能较低的解决方案。感谢您的回复。也许可以将其扩展为尝试使用
,如果它引发异常,则按
(并处理数组)拆分,然后递归检查每个属性。@user1032531请参阅更新。我想我们需要先看到一条错误消息。谢谢客户的回复。是的,我也想看到一条错误消息!我在Chrome、IE、FF等方面没有问题,但在我的iPhone7上有问题。但是,似乎没有办法查看手机上的错误。我的黑客解决方案是把警报信息放在所有地方,这样我就可以消除潜在的罪犯。我还包括了一些只包含几行脚本的页面,看来问题出在
上。如果您有更好的方式查看错误,请告知!关于
?。
更合适,他们看起来很接近,但希望你是对的。PHP只是有
,所以我想我使用它的原因。