заканчивается в JavaScript

Стиль создает один экземпляр Image, вы не можете использовать его в двух местах, подобных этому. Вы можете создать изображение в качестве отдельного ресурса с помощью x:Shared = false и указать его в стиле, а затем создать новый стиль в каждом месте, в котором используется стиль.


, например


    
        
        
    
    
        

1071
задан Michał Perłakowski 24 January 2016 в 19:34
поделиться

9 ответов

UPDATE (Nov 24th, 2015):

Этот ответ был первоначально опубликован в 2010 году (шесть лет назад.), поэтому, пожалуйста, обратите внимание на эти проницательные комментарии:

  • Shauna - Update for Googlers - Похоже, ECMA6 добавляет эту функцию. Статья в MDN также показывает полифилл. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith

  • T.J. Crowder - Создание подстрок не является дорогостоящим в современных браузерах; вполне возможно, что так было в 2010 году, когда был опубликован этот ответ. В наши дни простой подход this.substr(-suffix.length) === suffix быстрее всего в Chrome, так же быстро в IE11, как indexOf, и только на 4% медленнее (территория fergetaboutit) в Firefox: jsperf.com/endswith-stackoverflow/14 И быстрее во всех случаях, когда результат ложный: jsperf.com/endswith-stackoverflow-when-false Конечно, с ES6, добавляющим endsWith, вопрос спорный. :-)


ОРИГИНАЛЬНЫЙ ОТВЕТ:

Я знаю, что это вопрос годичной давности... но мне это тоже нужно, и мне нужно, чтобы это работало кроссбраузерно, так что... объединив все ответы и комментарии и немного упростив:

String.prototype.endsWith = function(suffix) {
    return this.indexOf(suffix, this.length - suffix.length) !== -1;
};
  • Не создает подстроку
  • Использует родную функцию indexOf для быстрого результата
  • Пропускает ненужные сравнения, используя второй параметр indexOf для пропуска вперед
  • Работает в Internet Explorer
  • НЕТ Regex осложнений

Также, если вам не нравится запихивать вещи в прототипы родной структуры данных, вот отдельная версия:

function endsWith(str, suffix) {
    return str.indexOf(suffix, str.length - suffix.length) !== -1;
}

EDIT: Как заметил @hamish в комментариях, если вы хотите подстраховаться и проверить, была ли уже предоставлена реализация, вы можете просто добавить проверку typeof, как например:

if (typeof String.prototype.endsWith !== 'function') {
    String.prototype.endsWith = function(suffix) {
        return this.indexOf(suffix, this.length - suffix.length) !== -1;
    };
}
1756
ответ дан 19 December 2019 в 20:19
поделиться
if( ("mystring#").substr(-1,1) == '#' )

- Или -

if( ("mystring#").match(/#$/) )
9
ответ дан duckyflip 24 January 2016 в 19:34
поделиться
  1. , К сожалению, нет.
  2. if( "mystring#".substr(-1) === "#" ) {}
87
ответ дан Phillip B Oldham 24 January 2016 в 19:34
поделиться

все они - очень полезные примеры. Добавление String.prototype.endsWith = function(str) поможет нам просто назвать метод, чтобы проверить, сделают ли наши строковые концы с ним или нет, хорошо regexp также это.

я нашел лучшее решение, чем мой. Спасибо все.

0
ответ дан Aniket Kulkarni 24 January 2016 в 19:34
поделиться

Эта версия старается не создавать подстроку и не использует регулярные выражения (здесь будут работать некоторые ответы regex; другие повреждаются):

String.prototype.endsWith = function(str)
{
    var lastIndex = this.lastIndexOf(str);
    return (lastIndex !== -1) && (lastIndex + str.length === this.length);
}

, Если бы производительность важна для Вас, это стоило бы протестировать, быстрее ли lastIndexOf на самом деле, чем создание подстроки или нет. (Это может зависеть от механизма JS, который Вы используете...), Это может быть быстрее в случае соответствия, и когда строка является маленькой - но когда строка огромна, это должно оглянуться назад через все это даже при том, что мы действительно не заботимся: (

Для проверки отдельного символа, нахождение длины и затем использование charAt являются, вероятно, лучшим способом.

56
ответ дан Jon Skeet 24 January 2016 в 19:34
поделиться
return this.lastIndexOf(str) + str.length == this.length;

не работает в случае, где длина исходной строки является той меньше, чем длина строки поиска и строка поиска не найдены:

lastIndexOf возвращается-1, тогда Вы добавляете длину строки поиска, и Вас оставляют с длиной исходной строки.

А возможная фиксация

return this.length >= str.length && this.lastIndexOf(str) + str.length == this.length
17
ответ дан user73745 25 January 2016 в 05:34
поделиться
/#$/.test(str)

будет работать над всеми браузерами, не требует исправления обезьяны String, и не требует сканирования всей строки как lastIndexOf делает, когда там не идет ни в какое сравнение.

Если Вы хотите соответствовать постоянной строке, которая могла бы содержать специальные символы регулярного выражения, такой как '$', затем можно использовать следующее:

function makeSuffixRegExp(suffix, caseInsensitive) {
  return new RegExp(
      String(suffix).replace(/[$%()*+.?\[\\\]{|}]/g, "\\$&") + "$",
      caseInsensitive ? "i" : "");
}

и затем можно использовать его как это

makeSuffixRegExp("a[complicated]*suffix*").test(str)
292
ответ дан 19 December 2019 в 20:19
поделиться

Come on, this is the correct endsWith implementation:

String.prototype.endsWith = function (s) {
  return this.length >= s.length && this.substr(this.length - s.length) == s;
}

using lastIndexOf just creates unnecessary CPU loops if there is no match.

66
ответ дан 19 December 2019 в 20:19
поделиться
function check(str)
{
    var lastIndex = str.lastIndexOf('/');
    return (lastIndex != -1) && (lastIndex  == (str.length - 1));
}
2
ответ дан 19 December 2019 в 20:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: