JavaScript 中的包含方法

Posted by cl9000 on May 25, 2020

设计是品牌无声的形象大使。——<兰德·保罗>

indexOf()

默认情况下,JavaScript没有包含方法。为了检查字符串中是否存在子字符串或数组中的项,您可以执行以下操作:

1
2
3
4
5
6
7
var someText = 'javascript rules';
if (someText.indexOf('javascript') !== -1) {
}

// or
if (someText.indexOf('javascript') >= 0) {
}

但是,让我们看一下这些 Expressjs 代码片段。https://github.com/expressjs/express

例子 /mvc/lib/boot.js, 参考https://github.com/expressjs/express/blob/2f8ac6726fa20ab5b4a05c112c886752868ac8ce/examples/mvc/lib/boot.js#L26

1
2
3
for (var key in obj) {
// "reserved" exports
if (~['name', 'prefix', 'engine', 'before'].indexOf(key)) continue;

lib/utils.js, 参考https://github.com/expressjs/express/blob/2f8ac6726fa20ab5b4a05c112c886752868ac8ce/lib/utils.js#L93

1
2
3
4
5
exports.normalizeType = function(type){
return ~type.indexOf('/')
? acceptParams(type)
: { value: mime.lookup(type), params: {} };
};

examples/web-service/index.js, 参考https://github.com/expressjs/express/blob/2f8ac6726fa20ab5b4a05c112c886752868ac8ce/examples/web-service/index.js#L35

1
2
// key is invalid
if (!~apiKeys.indexOf(key)) return next(error(401, 'invalid api key'));

问题在于 位操作符~,“位操作符对二进制表示执行操作,但它们返回标准的JavaScript数值。”

它将 -1 转换为 0,在JavaScript0 的值为 false:

1
2
3
4
5
var someText = 'text';
!!~someText.indexOf('tex'); // someText contains "tex" - true
!~someText.indexOf('tex'); // someText NOT contains "tex" - false
~someText.indexOf('asd'); // someText doesn't contain "asd" - false
~someText.indexOf('ext'); // someText contains "ext" - true

String.prototype.includes()

ES6 引入了 include()方法,您可以使用它来确定一个字符串是否包含另一个字符串:

语法:

1
2
3
// searchString 要在此字符串中搜索的字符串。
// position 可选 从当前字符串的哪个索引位置开始搜寻子字符串,默认值为 0。
str.includes(searchString[, position])
1
'something'.includes('thing'); // true

includes() 方法是区分大小写的。例如,下面的表达式会返回 false

1
'Blue Whale'.includes('blue'); // returns false

示例

1
2
3
4
5
6
7
var str = 'To be, or not to be, that is the question.';

console.log(str.includes('To be')); // true
console.log(str.includes('question')); // true
console.log(str.includes('nonexistent')); // false
console.log(str.includes('To be', 1)); // false
console.log(str.includes('TO BE')); // false

Array.prototype.includes()

使用 ECMAScript 2016(ES7),甚至可以将以下技术与 Arrays 结合使用:
includes() 方法用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回 false

1
2
!!~[1, 2, 3].indexOf(1); // true
[1, 2, 3].includes(1); // true

语法

1
2
3
// valueToFind 需要查找的元素值。
// fromIndex 可选 从fromIndex 索引处开始查找 valueToFind。如果为负值,则按升序从 array.length + fromIndex 的索引开始搜 (即使从末尾开始往前跳 fromIndex 的绝对值个索引,然后往后搜寻)。默认为 0。
arr.includes(valueToFind[, fromIndex])

示例

1
2
3
4
5
[1, 2, 3].includes(2);     // true
[1, 2, 3].includes(4); // false
[1, 2, 3].includes(3, 3); // false
[1, 2, 3].includes(3, -1); // true
[1, 2, NaN].includes(NaN); // true

不幸的是,只有Chrome,Firefox,Safari 9或更高版本以及Edge才支持该功能;不是IE11或更低版本。 最好在受控环境中使用。

参考

关注【公众号】,了解更多。



支付宝打赏 微信打赏

赞赏一下 坚持原创技术分享,您的支持将鼓励我继续创作!