题1、将 rgb 颜色字符串转换为十六进制的形式,如 rgb(255, 255, 255) 转为 #ffffff
1. rgb 中每个 , 后面的空格数量不固定
2. 十六进制表达式使用六位小写字母
3. 如果输入不符合 rgb 格式,返回原始输入
方法1:1)判断 参数是否符合 rgb 格式,不符合直接return;2)去除参数 中每个 , 后面的空格;3)16进制转10进制,使用num.toString( radix ); 4)注意16进制只有1位的情况,前面要补0;
主要知识点:16进制转10进制使用num.toString( radix ),radix 是数字的基数,范围是 2 ~ 36 (包括)。
有关颜色相关知识:https://blog.csdn.net/start_XUEBA/article/details/88747594
function rgb2hex(sRGB) {
let reg = /^rgb\(([1-2]?[0-5]?[0-5],){2}[1-2]?[0-5]?[0-5]\)$/;
if(!reg.test(sRGB)){
return sRGB;
}
let rgb = sRGB.split(",").map(item=>item.trim()).join(",");
let str = "";
//2 16进制转10进制
for(var i=0;i<3;i++){
var s = ( +/\d{1,3}/.exec(rgb) ).toString(16);
str+=s.length===1 ? "0"+s:s;
rgb=rgb.slice(rgb.indexOf(",")+1)
}
return "#"+str;
}
方法二:记录一下别人的方法。(这里rgb格式判断不严谨,参考思路即可。)
主要知识点:replace,捕获组,num.toString( radix );
function rgb2hex(sRGB) {
return sRGB.replace(/^rgb\((\d+)\s*\,\s*(\d+)\s*\,\s*(\d+)\)$/g, function(a, r, g, b){
return '#' + hex(r) + hex(g) + hex(b);
});
}
function hex(n){
return n < 16 ? '0' + (+n).toString(16) : (+n).toString(16);
}
题2、找出对象 obj 不在原型链上的属性
1、返回数组,格式为 key: value
2、结果数组不要求顺序
方法一:遍历obj对象的属性,如果该属性不是原型链上的,则在数组中添加;
知识点:
1)for (a in obj):遍历的可枚举属性,如果属性加在原型对象上也会遍历出来。另外:a是属性,不是值,获取值是obj[a]。
2)obj.hasOwnProperty("val") : 是用来判断一个对象是否有给出名称的属性或对象。此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员。
function iterate(obj) {
let arr=[];
for (var i in obj){
if(obj.hasOwnProperty(i)){
arr.push(i+": "+obj[i]);
}
}
return arr;
}
方法二:记录一下大佬的方法。(我什么时候才能如此优秀( ; ^ ; )~~~)
知识点:Object.getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。
function iterate(obj) {
return Object.getOwnPropertyNames(obj).map(function(key){
return key+": "+obj[key];
});
}