padStart padEnd
padStart()
用于头部补全,如果用来补全的字符串与原字符串,两者的长度之和超过了指定的最小长度,则会截去超出位数的补全字符串
{
let str = 'i';
let str1 = str.padStart(5, 'mooc');
console.log(str1);
let str2 = str.padEnd(5, 'mooc');
console.log(str2);
}
repeat
repeat()
方法返回一个新字符串,表示将原字符串重复n次,参数如果是小数,会被取整
{
function repeat(str, num) {
return new Array(num + 1).join(str);
}
console.log(repeat('s', 3));
}
startsWith endsWith
检测字符串是否以指定的子字符串开始/结尾。
返回值:boolean
{
const str = 'A promise is a promsie';
console.log(str.startsWith('B'));
console.log(str.startsWith('A pro'));
console.log(str.endsWith('promsie'));
console.log(str.endsWith('A'));
}
includes
includes()
方法用来判断一个数组是否包含一个指定的值,如果是返回 true,否则false
{
const str = 'A promise is a promise';
// if (str.indexOf('promise') !== -1) {
if (~str.indexOf('promise')) {
console.log('存在1');
}
if (str.includes('a promise')) {
console.log('存在2');
}
}
这里的~运用了位运算符
以下参考:https://javascript.ruanyifeng.com/grammar/operator.html#toc19
二进制否运算符
二进制否运算符(~)将每个二进制位都变为相反值(0变为1,1变为0)。它的返回结果有时比较难理解,因为涉及到计算机内部的数值表示机制。
~ 3 // -4
上面表达式对3进行二进制否运算,得到-4。之所以会有这样的结果,是因为位运算时,JavaScirpt 内部将所有的运算子都转为32位的二进制整数再进行运算。
3的32位整数形式是00000000000000000000000000000011,二进制否运算以后得到11111111111111111111111111111100。由于第一位(符号位)是1,所以这个数是一个负数。JavaScript 内部采用补码形式表示负数,即需要将这个数减去1,再取一次反,然后加上负号,才能得到这个负数对应的10进制值。这个数减去1等于11111111111111111111111111111011,再取一次反得到00000000000000000000000000000100,再加上负号就是-4。考虑到这样的过程比较麻烦,可以简单记忆成,一个数与自身的取反值相加,等于-1。
~ -3 // 2
上面表达式可以这样算,-3的取反值等于-1减去-3,结果为2。
对一个整数连续两次二进制否运算,得到它自身。
~~3 // 3
所有的位运算都只对整数有效。二进制否运算遇到小数时,也会将小数部分舍去,只保留整数部分。所以,对一个小数连续进行两次二进制否运算,能达到取整效果。
~~2.9 // 2
~~47.11 // 47
~~1.9999 // 1
~~3 // 3
使用二进制否运算取整,是所有取整方法中最快的一种。
对字符串进行二进制否运算,JavaScript 引擎会先调用Number函数,将字符串转为数值。
// 相当于~Number('011')
~'011' // -12
// 相当于~Number('42 cats')
~'42 cats' // -1
// 相当于~Number('0xcafebabe')
~'0xcafebabe' // 889275713
// 相当于~Number('deadbeef')
~'deadbeef' // -1
Number函数将字符串转为数值的规则,参见《数据的类型转换》一章。
对于其他类型的值,二进制否运算也是先用Number转为数值,然后再进行处理。
// 相当于 ~Number([])
~[] // -1
// 相当于 ~Number(NaN)
~NaN // -1
// 相当于 ~Number(null)
~null // -1