炫意html5
最早CSS3和HTML5移动技术网站之一

JS 如何判断字符串是否全为同一个字符?

JS:字符串,长度不为0,如何判断该字符串是否全为同一个字符,全部为同一个字符的示例:0,1,22,AAA。

回答

1. 遍历字符串,逐个比较

for (let i=0;i < str.length;i++){
  if (str[0] !== str[i]) {
    return false
  }
}

2. 使用正则 

const reg = /^(.)\1*$/
return reg.test(str)

 

方法2是真的6啊,第一次见到这种写法。:+1:学好正则能给你一些新的方法处理问题,推荐微信读书中的《正则指引》回复
@t0ken : 赞同赞同方法1:innocent::scream: 方法2牛

都是大佬,我也贴一个自己的菜鸟写法吧。

function onlyOne(str){
    let strLength = str.length;
    if(strLength === 1){
        return true;
    }
    let tmpSet = new Set(str);
    if(tmpSet.size === 1){
        return true;
    }else{
        return false;
    }
}

console.log(onlyOne('0')); //true
console.log(onlyOne('1')); //true
console.log(onlyOne('22')); //true
console.log(onlyOne('AAA')); //true
console.log(onlyOne('AB')); //false

 

方法 onlyOne 判断字符串是否由同一个字符组成。参数为字符串 s

function onlyOne(s){
	if (s.length==1)
	return true;
	else {
	s1.split('');
	for (i=1;i<s1.length;i++)
	if (s[0] != s[1]) 
	return false;
	return true;
	}
}

 

直接用 set 去重,看是不是只剩一个就行

new Set(yourString).size === 1

 

我觉得这个想法是真的秀。对于上面说不如大师傅那个高效,我觉得不一定吧。我觉得这个方法应该是最高效的。我也是这么想的, 性能不差 写的代码还少这个写法可以,但是,效率低下。不如大师傅的那个高效。好想法。🤙🤙🤙

const is_repeat_str = (str) => {
    return str === str.slice(0, 1).repeat(str.length);
};

console.log( is_repeat_str('aaaa') );  // true
console.log( is_repeat_str('abaa') );  // false

 

/^(.)\1*$/.test(‘11111111’)

简洁明了,高性能,支持 Unicode 字符(上面评论中的代码都不支持这点),代码如下:

const isSame = s => {
    if (!s) return false
    const c0 = String.fromCodePoint(s.codePointAt(0))
    for (let c of s) 
        if (c !== c0) return false
    return true
}
isSame("😁😁😁") // true
isSame("aab")   // false
isSame("aaa")   // true
isSame("a")     // true
isSame("😁")    // true
isSame("")      // false

 

 

回复
@前端大师傅 : 亲,声明一下,我是一技术渣子。想问下,V8中match方法的底层实现是怎么实现,我没看源码,我的个人推测也是通知遍历的方式实现的。你说的用正则解这道题效率不高,我不知道从哪里看出来的。还 有一个,就是你result赋值操作的那步,我的理解这个“类短路”操作实质也是if-else的另种写法罢了,实际上都是进行布尔运算。再次声明,没有怼的意思,只是纯粹地想了解下原理。勿恼!回复
@前端大师傅 : 我理解的是,代码不一定是越少越好,而是越简单越好,不要小瞧if-else,所有软件都是基于if-else这样简单的条件的分支之上实现的,再高端的技术也逃不开回复
@前端大师傅 : 如果要考虑IE兼容性又是另一种写法了,我用的是ES6标准。上面代码清晰、性能高、支持unicode,就这些fromCodePoint codePointAt连Ie11都不支持,其实这种啰里八嗦的代码,也拿出来秀,骂人我不如你,可千万不要写代码。你这种一大堆if else组成的也能算代码的话,代码逻辑混乱,除了功能完成之外我看不出有什么好。

new Set('aaa').size === 1

简单高效

切出来第一个然后字符串替换为”最后再判断长度这样是否可行?回复
@左岸恋雪Six : 看我的答案吧。大师傅差的不是一点半点。回复
@microkof : 我测试的是计算时间,大师傅的时间最短。回复
@左岸恋雪Six : 你这实验咋实验的?大师傅效率屎一样应该可以。但是要试一下性能如何。目前实验的情况,大师傅的那种效率最好。

        console.time(1);
        for (let index = 0; index < 10000; index++) {
            let calcDistinctStr = (str) => {
                // 大师傅方法 最差,差数十倍
                let result = false;
                result = ((s => {
                    let pattern = new RegExp(s.substr(0, 1) + "+", "ig");
                    return 0 < s.match(pattern).length && s.match(pattern)[0].length == s.length;
                })(str));
                return result;

                // 方法2 比方法3略差
                // var res = true;
                // var start = str[0];
                // for (let i = 0; i < str.length; i++) {
                //     if (start !== str[i]) {
                //         res = false
                //     }
                // }
                // return res;
                // 方法3 最好
                // return str === str.slice(0, 1).repeat(str.length);
            };
            calcDistinctStr('11111111')
        }
        console.timeEnd(1);

其他未列出的方法也都差不多,大师傅最差。

 

测试方法:注销其他方法,只留一个方法,不断刷新页面,看输出。

速度不是这么测的啊 这种测多次 得到单位时间运行次数的对 5,088,239 ops/sec ±0.58% (91 runs sampled) 还有就是 大样本和小样本 的结果也是不一样的

炫意HTML5 » JS 如何判断字符串是否全为同一个字符?

Java基础教程Android基础教程