[英]Using ES6 spread operator on an object that is returned from a function
我正在使用一个函数将十六进制代码转换为 rgb 值,这是我在本网站上找到的一个,并且一切正常。 该函数接受一个字符串作为参数,并返回一个带有r,g,b
属性及其关联值的 obj。
然后我将这些值打印在 React 功能组件中。 我只是想整理一下语法并避免:
rgbValue={'rgb=(' + hexToRgb('#000').r + ', ' + hexToRgb('#000').g + ', ' + hexToRgb('#000').b + ')'}
并用以下内容替换它:
rgbValue={ 'rgb=(' + ...hexToRgb('#000') + ')'}
希望这会从对象返回r,g,b
值,最终结果是:
rgbValue={'rgb=(0,0,0)'}
但是,这并没有按预期工作。 我不知道这是逻辑问题还是语法错误。 我是使用扩展运算符的新手,所以我不太熟悉它,但是有没有办法使用我当前的设置来实现这一点?
用于显示返回内容的 JS 函数:
function hexToRgb(hex) {
// Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
hex = hex.replace(shorthandRegex, function(m, r, g, b) {
return r + r + g + g + b + b;
});
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
// return rgb values as properties on an object
return result ? {
r: parseInt(result[1], 16),
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
} : null;
}
我不知道这是逻辑问题还是语法错误。
这是一个语法错误。 您只能在定义 spread 的地方使用 spread (这就是为什么它是符号/语法,而不是运算符的部分原因)。
如果你想在字符串连接中使用hexToRgb
的结果,你有几个选择:
让它返回一个字符串。
让它返回一个数组并在该数组上调用.join(",")
; 确保数组按 r、g、b 顺序排列。
rgbValue={'rgb=(' + formatRgb(hexToRgb('#000')) + ')'}
让它返回一个对象(总是,有时不为null
)并使用Object.values(hexToRgb('#000')).join(",")
。 确保对象是按 r、g、b 顺序创建的(您的顺序是),并且此代码仅在现代 JavaScript 引擎上运行。 对象属性的顺序仅用于定义Object.values
最近(的变化,将在ES2020); 在此之前,尽管某些操作存在顺序,但Object.values
和其他一些操作不需要它。 但是现代引擎已经实现了定义的顺序,所以只要你不必为 IE11 或类似的东西进行转换......
// See caveats in the text rgbValue={'rgb=(' + Object.values(hexToRgb('#000')).join(",") + ')'}
有一个格式化函数,你将结果传递给
rgbValue={'rgb=(' + formatRgb(hexToRgb('#000')) + ')'}
我没有完全掌握这条线
这是一个语法错误。 您只能在定义 spread 的地方使用 spread (这就是为什么它是符号/语法,而不是运算符的部分原因)。
但我会调查一下。
公平地说,这是对一些复杂事物的非常简短的总结。 只是 FWIW:
...
不是运营商。 运算符具有操作数(如函数的参数)和单个结果值(如函数的返回值),并且几乎可以在任何需要表达式的地方使用。 ...
不是运算符,也不可能是,因为它没有单个结果值。 相反, ...
被定义为具有五种含义的主要语法:
...
在数组文字或函数参数列表中,将可迭代值作为新数组的离散条目或函数调用的离散参数展开。 const source = [1, 2, 3, 4]; // In an array literal const dest = [...source, 5, 6]; console.log(dest); // [1, 2, 3, 4, 5, 6] function example1(a, b, c, d) { console.log(a, b, c, d); // 1 2 3 4 } // In a function argument list example1(...source);
...
在函数参数列表中的最终声明参数之前标记“休息参数”,它将接收从该点开始作为数组提供的所有参数。 function example2(a, b, ...rest) { console.log(`a = ${a}, b = ${b}, rest = ${JSON.stringify(rest)}`); } example2(1, 2, 3, 4); // a = 1, b = 2, c = [3,4]
...
在对象字面量中,将对象自己的可枚举属性展开为正在创建的对象的离散属性。 const source = {a: 1, b: 2, c: 3}; const dest = {...source, d: 4, e: 5}; console.log(dest); // {a: 1, b: 2, c: 3, d: 4, e: 5}
...
)。 const source = [1, 2, 3, 4]; const [a, b, ...rest] = source; console.log(`a = ${a}, b = ${b}, rest = ${JSON.stringify(rest)}`); // a = 1, b = 2, rest = [3,4]
...
在对象解构模式中标记目标,该目标将接收模式中其他目标未消耗的属性的“剩余”(作为对象)。 const source = {a: 1, b: 2, c: 3}; const {a, ...rest} = source; console.log(a); // 1 console.log(rest); // {b: 2, c: 3}
除此之外, ...
的含义没有定义,因此会导致语法错误。
改为返回数组
function hexToRgb(hex) {
// Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
hex = hex.replace(shorthandRegex, function(m, r, g, b) {
return r + r + g + g + b + b;
});
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
// return rgb values as properties on an object
return result ? [
parseInt(result[1], 16),
parseInt(result[2], 16),
parseInt(result[3], 16)
] : [];
}
rgbValue='rgb=(' + hexToRgb('#000').join(',') + ')';
// rgb=(0,0,0)
首先,这是一个错误,因为扩展运算符仅适用于可迭代对象(例如数组),而不适用于对象(除非您正在创建对象)。
其次,如果您首先通过将对象值转换为数组来解决此问题,例如 ( ...Object.values(myHex)
),这将产生意外结果,因为对象条目是无序的。 即,不能保证r
会在g
之前出现。
IMO,您当前的代码足够清晰。 但是如果你真的想使用扩展运算符,你可以修改你的hexToRgb
以返回一个有序数组result.map(v => parseInt(v, 16))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.