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

Enr*_*ent 3 coffeescript

在Coffeescript中,以下给出 true

"s" in "asd" # true
Run Code Online (Sandbox Code Playgroud)

但这给出了错误

"as" in "asd" # false
Run Code Online (Sandbox Code Playgroud)
  • 为什么是这样?
  • 字符串超过1个字符会发生这种情况吗?
  • in不适合这项任务?

caf*_*ech 6

x in ycoffeescript的语法期望y是一个数组或类似对象的数组。给定一个字符串,它将把它转换成一个字符数组(不是直接转换成字符数组,但是它将像遍历数组一样遍历字符串的索引)。

所以你使用in

"as" in "asd"
# => false
Run Code Online (Sandbox Code Playgroud)

相当于

"as" in ["a","s","d"]
# => false
Run Code Online (Sandbox Code Playgroud)

这样一来,更容易弄清为什么它返回false。

本关于咖啡小书对此说in

包括

通常,检查值是否在数组内是由indexOf()完成的,这相当令人费解,因为Internet Explorer尚未实现它,所以它仍然需要填充程序。

var included = (array.indexOf("test") != -1)
Run Code Online (Sandbox Code Playgroud)

CoffeeScript具有Python工作者可以识别的一种巧妙的替代方法。

included = "test" in array
Run Code Online (Sandbox Code Playgroud)

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

included = "a long test string".indexOf("test") isnt -1
Run Code Online (Sandbox Code Playgroud)

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

 string   = "a long test string"
 included = !!~ string.indexOf "test"
Run Code Online (Sandbox Code Playgroud)

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

我会用以下任何一种写您的支票indexOf

"asd".indexOf("as") != -1
# => true
Run Code Online (Sandbox Code Playgroud)

或正则表达式匹配:

/as/.test "asd"
# => true
Run Code Online (Sandbox Code Playgroud)

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