在函数中使用.includes方法

30

我有一个对象jsonRes[0],其中包含需要根据条件删除的值。以下内容可用于删除字符串化对象中的null、缺失值和等于零的值:

function replacer(key, value) {
          // Filtering out properties
          if (value === null || value === 0 || value === "") {
            return undefined;
          }
          return value;
        } 

JSON.stringify(jsonRes[0], replacer, "\t")

然而,当我使用 includes 方法添加一个条件时,我收到了一个错误:

function replacer(key, value) {
          // Filtering out properties
          if (value === null || value === 0 || value === "" || value.includes("$")) {
            return undefined;
          }
          return value;
        } 


Uncaught TypeError: value.includes is not a function

为什么会出现这种情况?有没有解决办法?

如果一个值是未定义的,就意味着它没有像“includes”函数一样的东西。 - Jswq
如果您查看includes()的文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes,大多数浏览器都不支持此属性。 https://dev59.com/j10Z5IYBdhLWcg3whQwj 您可以在将该属性转换为字符串后使用广泛支持的indexOf()函数: - S M
如果 value 是一个数字、非数组对象或布尔值,它就没有 .includes 方法?你可能是想写类似于 typeof value == "string" && value.includes("$") 这样的代码。 - Bergi
5个回答

45

您可以使用 String.indexOf() 代替 String.includes,因为前者在 ES6 中可用,而后者在IE中不支持。

typeof value == "string" && value.indexOf('$') > -1

请注意,如果value不是字符串类型,它仍然会引发boolean错误。 Number不支持该方法。 您可以使用typeof验证value是否为字符串。


16

.includes() API是StringArray数据类型的一部分。

所以这个错误试图告诉你的是,变量value的值,比如一个整数或对象,没有.includes属性。

您可以像下面这样检查:

  1. typeof a_string ==='string'
  2. an_array instanceof Array

.includes() api之前进行检查以防止此问题。

显然,由于您必须进行多次检查,这将使您的if语句变得相当丑陋。

根据您的代码编写方式,我怀疑您更感兴趣的是检查“String”而不是数组。所以要小心数组。如果它是数组,您的代码可能无法正常工作。

无论如何,这里是您代码的重构版本。

function replacer(key, value) {
   // Filtering out properties
   if (!value || typeof value === "string" && value.includes("$")) {
        return undefined;
   }
   return value;
 } 

console.log("NULL returns:" + replacer('test', null));
console.log("$Test returns:" + replacer('test', '$test'));
console.log("Blah returns:" + replacer('test', 'Blah'));


1
这个答案应该是被接受的答案的第二部分。'还要注意...' - Moff452

6
也许还有一种可能性:你的value不是一个字符串类型的对象。 (typeof(value) == "string" && value.includes("$"))

1

当我将“includes”应用于“window.location”值时,出现了错误,我通过添加“.toString();”解决了这个问题。

var requestUrl = window.location.toString();

如果(requestUrl.includes(urlBase +“#”){ ...


0

我其实不确定变量名为value的类型是什么,但无论如何,Array.prototype.includesString.prototype.includes只在ES6中可用。您需要使用babel-polyfill或任何其他捆绑模块,例如rollup.jswebpack与babel或类似的东西来使用includes函数。


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