JavaScript的endsWith函数无法正常工作

7

我有一个Web应用程序,在其中一个页面中,我会遍历所有HTML元素的ID,无论它们是否以指定的字符串结尾。页面上的每个JS函数都能正常工作,但是"endsWith"函数不起作用。我真的不明白原因。有人能帮忙吗?

var str = "To be, or not to be, that is the question.";
alert(str.endsWith("question."));

上述简单的JS代码完全不起作用?

1
这个问题与JSF有什么关系?你是在暗示当你删除所有JSF内容(并使用普通的.html页面)时,这个问题就消失了吗?这是不可信的,因为JSF实际上不在Web浏览器中运行,而是在Web服务器中运行。我会编辑你的问题,以摆脱无关的JSF噪音。至于你的问题,请仔细阅读https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith的浏览器兼容性列表。对于未来的问题,请更仔细地确定问题。 - BalusC
冷静点 @BalusC!JSF有一个叫做“endsWith”的函数。很明显,问题的提问者已经混淆了,可以查看http://myfaces.apache.org/core20/myfaces-impl/tlddoc-facelets/fn/endsWith.fn.html。包含JSF在问题中确实是有帮助的,这样我们就可以说他们混淆了JSF和JavaScript的功能。 - Joe
1
@BalusC - 我是在说nudastack很困惑,而不是我,他给了我们一个帮助他/她的机会,而不仅仅是嘲笑他。在回复之前停下来思考一分钟。 - Joe
1
我是在说包含JSF标签是提示提问者混淆了JSF和JS。我知道我在说什么。你误读了我的评论,可能是因为你的态度而出于错误或故意。我不会再花费更多的精力去找出原因。 - Joe
1
很明显我们存在沟通问题,而且努力修复它们是不值得的。要么我很难清晰地表达英语,要么你很难准确理解它。我并没有说上面的代码是JSF。我并没有说JavaScript中有一个 endsWith 函数。我也没有说你可以从JS中调用JSF函数。我没有混淆它们各自的执行环境。我是在尝试做些努力去理解这个问题,而不是左右开弓地侮辱人。我是来帮忙的。我不想继续这个对话了。 - Joe
显示剩余5条评论
4个回答

9
根据这篇文章http://rickyrosario.com/blog/javascript-startswith-and-endswith-implementation-for-strings/中所述,该文章介绍了JavaScript中字符串的startswith和endswith实现。
var str = "To be, or not to be, that is the question.";
function strEndsWith(str, suffix) {
    return str.match(suffix+"$")==suffix;
}
alert(strEndsWith(str,"question."));

如果字符串以给定的后缀结尾,这将返回true。 JSFIDDLE 编辑 之前也有类似的问题,请在这里查看。
答案说:
var str = "To be, or not to be, that is the question$";
String.prototype.endsWith = function(suffix) {
    return this.indexOf(suffix, this.length - suffix.length) !== -1;
};
alert(str.endsWith("$"));

使用后缀"$"测试您的解决方案。它将被视为正则表达式,因此即使字符串“ To be, or not to be, that is the question.”也将匹配。 - SheetJS
根据使用目的而定,否则您可以添加对 $ 的检查。 - vikas devde

5

ES5没有endsWith函数(或者说没有startsWith函数)。你可以自己编写函数,就像这个来自MDN的版本:

if (!String.prototype.endsWith) {
    Object.defineProperty(String.prototype, 'endsWith', {
        enumerable: false,
        configurable: false,
        writable: false,
        value: function (searchString, position) {
            position = position || this.length;
            position = position - searchString.length;
            var lastIndex = this.lastIndexOf(searchString);
            return lastIndex !== -1 && lastIndex === position;
        }
    });
}

他们使用lastIndexOf而不是substring,这很奇怪。 - Dan Tao
如果在字符串中出现两次针头怎么办?substring 在这种情况下能行吗? - Joe
@DanTao 这是由于他们的 endsWith 版本语义所致。第二个参数(position)被描述为“搜索此字符串,就好像此字符串只有这么长;默认为此字符串的实际长度,在由该字符串长度建立的范围内夹紧。”,这需要进行第二次检查。 - SheetJS
@Joe,你可以像这样做:str.substring(str.length - needle.length),从而避免那个问题。 - SheetJS
可以省略 enumerable、configurable 和 writable,因为它们默认都是 false 参见此处 - Jan Turoň
显示剩余2条评论

0

我从未在JS中看到过一个endsWith函数。相反,您可以使用String.length,然后通过手动引用要检查的每个字符来检查最后一个单词。

更好的方法是使用正则表达式查找字符串中的最后一个单词,然后使用它(在句子中查找最后一个单词的正则表达式)。


0

我在Chrome控制台中找到了endsWith()函数,但奇怪的是,在使用VS Code(与Chrome一起调试)时未定义。您可以尝试通过删除polyfill来编辑下面的片段,以查看您的浏览器是否支持它。

这是MDN开发者文档中关于String.prototype.endsWith()的一句引用:

String.prototype.endsWith()

此方法已添加到ECMAScript 6规范中,可能尚未在所有JavaScript实现中提供。但是,您可以使用以下代码段填充String.prototype.endsWith():

// If string.endsWith() isn't defined, Polyfill it.
if (!String.prototype.endsWith) {
  String.prototype.endsWith = function(search, this_len) {
    if (this_len === undefined || this_len > this.length) {
      this_len = this.length;
    }
    return this.substring(this_len - search.length, this_len) === search;
  };
}

// Use it.
const myString = "Mayberry";
const result = myString.endsWith("berry") ? 'Yes' : 'Nope';
document.body.append('A. ' + result);
Q. Does Mayberry end with "berry"?<br>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接