Javascript 不使用正则表达式验证十六进制颜色

Javascript 不使用正则表达式验证十六进制颜色,javascript,Javascript,我正在研究如何在不使用regExp的情况下验证十六进制颜色(“1234a6”和“#1cf”)。谁能告诉我为什么我的代码不能正常工作 function checkHex(input) { var i, code, len; // If first letter isn't "#" stop executing if(input.charAt(0) !== "#") return false; code = input.charCodeAt(i); f

我正在研究如何在不使用regExp的情况下验证十六进制颜色(“1234a6”和“#1cf”)。谁能告诉我为什么我的代码不能正常工作

function checkHex(input) 
{
    var i, code, len;
    // If first letter isn't "#" stop executing
    if(input.charAt(0) !== "#") return false;
     code = input.charCodeAt(i);
      for(i = 1; len = input.length, i < len; i++) {
        if(len == 3 || len == 6 ) {
          if((code > 47 && code < 58) && (code > 96 && code < 103)) {
            return true;
          }
        }
        return false;
      }
}
checkHex("#1234a6"); // returns false; which should be true;
函数校验十六进制(输入)
{
变量i,代码,len;
//如果第一个字母不是“#”,则停止执行
if(input.charAt(0)!=“#”)返回false;
代码=输入。charCodeAt(i);
对于(i=1;len=input.length,i47&&代码<58)和((代码>96&&代码<103)){
返回true;
}
}
返回false;
}
}
勾选十六进制(“#1234a6”);//返回false;这应该是真的;

谢谢。

无需循环或字符编码

函数校验十六进制(输入){
var检查,代码,len;
如果(typeof input=='string'){//检查它是一个字符串
如果(输入[0]==“#”){//并且它以#
len=输入长度;
//如果(len==4 | | len==7 | | len==5 | | len==9){//5和9表示| RGBA和| RRGGBBAA
如果(len==4 | | len==7){//它是4或7个字符
input=input.toLowerCase();//转换为小写
//将其解析为十六进制,并输出为带有#前缀的十六进制
check='#'+('00000000'+parseInt(input.substr(1),16).toString(16)).substr(1-len);
//检查一下号码是否相同
返回检查===输入;
}
}
}
//所有其他条件都适用于此处
返回false;
}
log(checkHex(#1234a6”);//true
console.log(checkHex(“1234a6”);//false
console.log(checkHex(#1234”);//false
console.log(checkHex(#12345t”);//false
console.log(checkHex(#aBc”);//true
console.log(checkHex(#000”);//true
console.log(checkHex(#00001”);//false

console.log(checkHex(#000001”);//true
不需要循环或charcodeat

函数校验十六进制(输入){
var检查,代码,len;
如果(typeof input=='string'){//检查它是一个字符串
如果(输入[0]==“#”){//并且它以#
len=输入长度;
//如果(len==4 | | len==7 | | len==5 | | len==9){//5和9表示| RGBA和| RRGGBBAA
如果(len==4 | | len==7){//它是4或7个字符
input=input.toLowerCase();//转换为小写
//将其解析为十六进制,并输出为带有#前缀的十六进制
check='#'+('00000000'+parseInt(input.substr(1),16).toString(16)).substr(1-len);
//检查一下号码是否相同
返回检查===输入;
}
}
}
//所有其他条件都适用于此处
返回false;
}
log(checkHex(#1234a6”);//true
console.log(checkHex(“1234a6”);//false
console.log(checkHex(#1234”);//false
console.log(checkHex(#12345t”);//false
console.log(checkHex(#aBc”);//true
console.log(checkHex(#000”);//true
console.log(checkHex(#00001”);//false

log(checkHex(“#000001”);//true
好的,下面是一个简单的代码片段,它可以正确地执行此操作,而不需要循环等

您会注意到,我在其中创建了一个lambda函数来处理
s
#

这是为了允许您扩展概念以处理规范,如
rgb(1,2,3)
rgba(4,5,6,1)

isRGB=函数{
如果(类型)!=“字符串”)
返回false;
如果(s[0]=='#')
返回(函数(hextr){
如果(hexStr.length!=3&&hexStr.length!=6)
返回false;
return!isNaN(数字(“0x”+hexStr));
})(s.r(1));
返回false;
}
console.log(isRGB('01a5');
console.log(isRGB(“#0a5”);

log(isRGB(“#0a5029”);
好的,下面是一个简单的代码片段,它可以正确地执行此操作,而无需循环等

您会注意到,我在其中创建了一个lambda函数来处理
s
#

这是为了允许您扩展概念以处理规范,如
rgb(1,2,3)
rgba(4,5,6,1)

isRGB=函数{
如果(类型)!=“字符串”)
返回false;
如果(s[0]=='#')
返回(函数(hextr){
如果(hexStr.length!=3&&hexStr.length!=6)
返回false;
return!isNaN(数字(“0x”+hexStr));
})(s.r(1));
返回false;
}
console.log(isRGB('01a5');
console.log(isRGB(“#0a5”);

console.log(isRGB('#0a5029'));
您可以直接将值解析为数字,并对照以10为基数的整数值进行检查:

function checkHex(input) {
    /*
      1193126 = 0x1234a6
      463 = 0x1cf
      1166591 = 0x11ccff
    */
    if(input.charAt(0) == '#') {
        var intNumber = Number(input.replace("#","0x"));
        return isNaN(intNumber) ? false : (intNumber == 1193126 || intNumber == 463 || intNumber == 1166591);
    } else {
        return false;
    }
}

您可以直接将该值解析为数字,并对照以10为基数的整数值进行检查:

function checkHex(input) {
    /*
      1193126 = 0x1234a6
      463 = 0x1cf
      1166591 = 0x11ccff
    */
    if(input.charAt(0) == '#') {
        var intNumber = Number(input.replace("#","0x"));
        return isNaN(intNumber) ? false : (intNumber == 1193126 || intNumber == 463 || intNumber == 1166591);
    } else {
        return false;
    }
}

为什么
code=input.charCodeAt(i);
在您的循环之外?只使用十六进制格式还是您想要任何CSS颜色值?另外,您是否关心#RGBA和#RRGGBBAA格式?或者更简单地说,用例到底是什么?为什么
code=input.charCodeAt(i)
在你的循环之外?只使用十六进制格式还是你想要任何CSS颜色值?另外,你是否关心#RGBA和#RRGGBBAA格式?或者更简单地说,用例到底是什么?OP希望确保它是一个有效的RGB规范,而不仅仅是一个数字。尽管
数字
类的使用是正确的(例如与parseInt相比)OP希望确保它是一个有效的RGB规范,而不仅仅是一个数字。虽然
number
类的使用是正确的(例如vs.parseInt)。可能在chrome中运行了该死的东西,但它确实可以工作,但是使用isNaN是正确的!可能会运行吗