Coffeescript - 用“in”查找子字符串

时间:2016-09-22 13:51:14

标签: coffeescript

在Coffeescript中,以下内容为true

"s" in "asd" # true

但是这会给出错误的

"as" in "asd" # false
  • 这是为什么?
  • 使用超过1个字符的字符串会发生什么?
  • in不适合此任务吗?

1 个答案:

答案 0 :(得分:6)

来自coffeescript的

x in y语法要求y是一个数组,或者像对象一样的数组。给定一个字符串,它会将它转换为一个字符数组(不是直接的,但它会遍历字符串的索引,就像它是一个数组一样)。

所以你使用in

"as" in "asd"
# => false

相当于

"as" in ["a","s","d"]
# => false

这样就可以更容易地看出它返回false的原因。

little book of coffeescript可以在in上说明这一点:

  

     

检查一个值是否在数组内部通常是使用indexOf()来完成的,因为Internet Explorer还没有实现它,所以相当令人难以置信地仍需要填充程序。

var included = (array.indexOf("test") != -1)
     

CoffeeScript有一个很好的替代方案,Pythonist可以识别,即。

included = "test" in array
     

在幕后,CoffeeScript正在使用Array.prototype.indexOf(),并在必要时进行匀场,以检测值是否在数组内。不幸的是,这意味着语法相同不适用于字符串。我们需要恢复使用indexOf()并测试结果是否为负数:

included = "a long test string".indexOf("test") isnt -1
     

或者甚至更好,劫持按位运算符,这样我们就不必进行-1比较。

 string   = "a long test string"
 included = !!~ string.indexOf "test"

就个人而言,我会说按位破解不是很清晰,应该避免。

我会用indexOf编写支票:

"asd".indexOf("as") != -1
# => true

或与正则表达式匹配:

/as/.test "asd"
# => true

或者如果您使用的是ES6,请使用String#includes()