如果字符串文字中未定义可选链接变量,则打印空字符串后备的简洁方法
假设我有这个字符串文字用例:
function getClassNames(props){
my_classNames = `class-nameA class-nameB ${props?.one} ${props?.two} class-nameC`;
return my_classNames;
}
console.log(getClassNames({one: 'class-name-one', two: 'class-name-two'}))
// prints: class-nameA class-nameB class-name-one class-name-two class-nameC
console.log(getClassNames({two: 'class-name-two'}))
// prints: class-nameA class-nameB undefined class-name-two class-nameC
console.log(getClassNames())
// prints: class-nameA class-nameB undefined undefined class-nameC
问题是当任何 props 的键未定义时,它会打印 undefined。我希望它打印空字符串。
解决此问题的一种解决方案是使用短路或评估,如下所示:
function getClassNames(props){
my_classNames = `class-nameA class-nameB ${props?.one || ''} ${props?.two || ''} class-nameC`;
return my_classNames;
}
console.log(getClassNames())
// prints: class-nameA class-nameB class-nameC
或者更好的解决方案(以避免额外的空格),使用之前的解决方案和短路与评估像这样:
function getClassNames(props){
my_classNames = `class-nameA class-nameB${props?.one && ' '+props?.one || ''}${props?.two && ' '+props?.two || ''}class-nameC`;
return my_classNames;
}
console.log(getClassNames())
// prints: class-nameA class-nameB class-nameC
为了使其更简洁,我可以将以前的解决方案中的重复项/重复包装到函数中:
function getClassNames(props){
my_classNames = `class-nameA class-nameB${concatWithSpace(props?.one)}${concatWithSpace(props?.two)}class-nameC`;
return my_classNames;
}
function concatWithSpace(str){
return str && ' '+str || '';
}
console.log(getClassNames())
// prints: class-nameA class-nameB class-nameC
是否有更简洁的内置方式(语法)来打印空字符串(而不是未定义
)对于可选链变量而不使用前面的我提到的“不太简洁”的解决方案?
Let's say I have this string literal use case:
function getClassNames(props){
my_classNames = `class-nameA class-nameB ${props?.one} ${props?.two} class-nameC`;
return my_classNames;
}
console.log(getClassNames({one: 'class-name-one', two: 'class-name-two'}))
// prints: class-nameA class-nameB class-name-one class-name-two class-nameC
console.log(getClassNames({two: 'class-name-two'}))
// prints: class-nameA class-nameB undefined class-name-two class-nameC
console.log(getClassNames())
// prints: class-nameA class-nameB undefined undefined class-nameC
The problem is when any of props' keys is undefined, it prints undefined. I want it to print empty string instead.
One solution to this is to use short-circuit OR evaluation like this:
function getClassNames(props){
my_classNames = `class-nameA class-nameB ${props?.one || ''} ${props?.two || ''} class-nameC`;
return my_classNames;
}
console.log(getClassNames())
// prints: class-nameA class-nameB class-nameC
Or a better solution (to avoid extra spaces), to use previous solution with short-circuit AND evaluation like this:
function getClassNames(props){
my_classNames = `class-nameA class-nameB${props?.one && ' '+props?.one || ''}${props?.two && ' '+props?.two || ''}class-nameC`;
return my_classNames;
}
console.log(getClassNames())
// prints: class-nameA class-nameB class-nameC
To make it more concise, I can wrap duplicates/repetitions in previous solution to a function:
function getClassNames(props){
my_classNames = `class-nameA class-nameB${concatWithSpace(props?.one)}${concatWithSpace(props?.two)}class-nameC`;
return my_classNames;
}
function concatWithSpace(str){
return str && ' '+str || '';
}
console.log(getClassNames())
// prints: class-nameA class-nameB class-nameC
Is there a more concise built-in way (syntax) to print empty string (instead of undefined
) for optionally-chained variables without using the previous "not-so concise" solutions I mentioned?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
不要使用模板字符串,而是使用数组并对其进行一些处理:
这也适用于开头或结尾的可选部分或空数组。
Don't use a template string, but an array and do some processing on it:
This also works properly with optional parts at the begin or end, or an empty array.
也许破坏
props
并分配默认值?像这样:(
编辑)
或,您可以为模板文字编写助手函数(标记的模板)
maybe destructuring
props
and assigning default values?like this:
(EDIT)
or, you can write a helper function for template literals (tagged template)