56

I have been working on a project and developing a JavaScript framework. The original code is about 700 lines so I only pasted this line. The includes method doesn't work on Internet Explorer. Is there any solution for this?

var row_cells = tbl_row.match(/<td[\s\S]*?<\/td>/g);

    row.Cells = new Array();
    if (onRowBindFuncText != null) { /*Fonksyon tanımlanmaışsa daha hızlı çalış*/

        var cellCount = 0;
        for (i = 0; i < row_cells.length; i++) {

            var cell = new Cell();
            $.each(this, function (k, v) {

                if ((row_cells[i]+"").includes("#Eval(" + k + ")")) {

                    cell.Keys.push(new Key(k,v));

...Code goes on

2
  • Is there any equivalent method ? Don't people check if a str is included in other str in internet explorer ? :) Commented Jul 4, 2015 at 13:51
  • 5
    I just solved that by using indexOf method.. Commented Jul 4, 2015 at 13:58

8 Answers 8

76

Because it's not supported in IE, it is not supported also in Opera (see the compatibility table), but you can use the suggested polyfill:

Polyfill

This method has been added to the ECMAScript 2015 specification and may not be available in all JavaScript implementations yet. However, you can easily polyfill this method:

if (!String.prototype.includes) {
  String.prototype.includes = function(search, start) {
    'use strict';
    if (typeof start !== 'number') {
      start = 0;
    }

    if (start + search.length > this.length) {
      return false;
    } else {
      return this.indexOf(search, start) !== -1;
    }
  };
}
Sign up to request clarification or add additional context in comments.

2 Comments

Thanks @InferOn. This is great stuff. I'm picking up JavaScript right now, but wanted to ask what exactly the arguments variable being passed into apply() is? I console.log() it in IE and see that it is some sort of Argument object, but I don't understand where it's coming from exactly since it doesn't appear to be defined anywhere.
50

@Infer-on shown great answer, but it has a problem in a specific situation. If you use for-in loop it will return includes "includes" function you added.

Here is another pollyfill.

if (!Array.prototype.includes) {
  Object.defineProperty(Array.prototype, "includes", {
    enumerable: false,
    value: function(obj) {
        var newArr = this.filter(function(el) {
          return el == obj;
        });
        return newArr.length > 0;
      }
  });
}

4 Comments

=== instead of ==
may I suggest an improvement: value: item => this.some(el => el === item)
The question is about the includes() for string not array
Performance would not be good, when you find the first appearance you should stop iterating.
11

You could just use .search() > -1 which behaves in the exact same way. http://www.w3schools.com/jsref/jsref_search.asp

if ((row_cells[i]+"").search("#Eval(" + k + ")") > -1) {

Comments

7

This selected answer is for String, if you are looking for 'includes' on an array, I resolved my issue in an Angular project by adding the following to my polyfills.ts file:

import 'core-js/es7/array';

2 Comments

What's up with polyfills.ts? Why do you have that file in your project?
Good question, I just realized that this question was not specific to Angular when I posted my answer so my answer could be confusing (I updated it to specify that it pertains to Angular). polyfills.ts comes out of the box with a new angular (8/9/10...) project.
4

This is a polyfill for TypeScript projects, taken from https://developer.mozilla.org/nl/docs/Web/JavaScript/Reference/Global_Objects/Array/includes and modified to be valid TypeScript:

if (!Array.prototype.includes) {
    Object.defineProperty(Array.prototype, 'includes', {
        value: function(searchElement, fromIndex) {

            if (this == null) {
                throw new TypeError('"this" is null or not defined');
            }

            const o = Object(this);
            // tslint:disable-next-line:no-bitwise
            const len = o.length >>> 0;

            if (len === 0) {
                return false;
            }
            // tslint:disable-next-line:no-bitwise
            const n = fromIndex | 0;
            let k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);

            while (k < len) {
                if (o[k] === searchElement) {
                    return true;
                }
                k++;
            }
            return false;
        }
    });
}

Comments

1
if (fullString.indexOf("partString") >= 0) {
//true 

} else {
//false
}

Comments

0
var includes = function(val, str) {
  return str.indexOf(val) >= 0;
};

Comments

0

jquery got a solution for that:

if ($.inArray(val,ar)===-1){
    console.log ("val not found in ar");
}
else{
    console.log ("val found in ar");
}

the $.inArray(val,ar,[startingIndex]) function.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.