【问题标题】:Detecting template literals in javascript在 javascript 中检测模板文字
【发布时间】:2017-11-13 03:36:04
【问题描述】:

我们有两个潜在的价值:

const value = `Hello World`;

const value = {message: 'Hello World'};

我想要做的是有条件的 where

if(is template literal) {
    // Some code
} else {
    // Some code
}

我尝试过使用

if(String.raw(value)){

} else {

}

但是对象会抛出类型错误。有没有人有一种简单可靠的方法来检测 javascript 中的模板文字?

编辑:以下是对提问者的进一步说明。

const exampleFunc = (value) => {
    // If I pass a string or template literal return as is
    if (String.raw({raw: value})) return value;

    const css = arr(styles).reduce((acc, obj) => {
        // Passing an object handles a more complicated set of operations
    }

}

在我使用之前 if (String.raw(value)) 返回值;

这里发生的事情是它给了我一个类型错误,而不是给我 null。通过将 {raw: value} 传递给 String.raw 解决了这个问题,我现在可以检测它是字符串/模板文字还是对象。

关于我为什么这样做的说明是一个较长的故事,它与 React 和样式化的组件有关。

【问题讨论】:

  • value1 是一个字符串,value2 是一个对象,value2.message 是一个字符串; value1value2.message 在运行时没有区别。
  • @PA。考虑到 JS 不是一种编译语言,我认为这并不完全正确。 @user3591425:如果您将其更改为 String.raw({raw: value}) 它应该可以工作,尽管它会为字符串文字和模板文字返回一个值
  • @user184994 不,这不起作用。顺便说一句,解释引擎和 jit 编译引擎之间没有明确的区别 - javascript 是 just a language
  • @user184994 知道了!有用。谢谢!
  • @user184994 不太清楚你在说什么建议。以什么方式起作用?为什么不直接查看typeof value === "string"

标签: javascript ecmascript-6


【解决方案1】:

使用字符串文字和模板文字没有区别(显然,在源代码级别除外)。

但是你的第一个value是一个字符串,而第二个是一个对象,很容易区分:

if (typeof value == "string") {
    console.log(value)
} else if (typeof value == "object" && typeof value.message == "string") {
    console.log(value.message)
}

【讨论】:

    猜你喜欢
    • 2019-12-13
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 2017-04-12
    • 2019-08-30
    • 1970-01-01
    相关资源
    最近更新 更多