繁体   English   中英

将声明的变量分配给数组javascript中的字符串

[英]Assigning a declared variable to a string in array javascript

假设我有以下全局变量:

var name, car;

然后,我声明一些值:

const languageStrings = {
    WELCOME_MESSAGE: 'Welcome #name, you have a #car',
    NAME_USER: "#name",
    CAR_USER: '#car'
};

然后,我需要将其分配给一个函数。 例如:

if (firstTime){
    welcomeMsg = WELCOME_MESSAGE;
}

现在,我有两个问题:

1)我如何在字符串中插入变量,以便在调用值对时动态更新它?

2)如何使用JSON进行相同操作?

您将必须创建一个返回变量值的函数。

在您的情况下:

welcomeMessage = function(){
   return WELCOME_MESSAGE
}

并且您可以通过以下方式引用变量:

welcomeMessage()

因此,您将要分配一个变量作为一个函数,该函数返回另一个变量的当前值。 您可以通过将变量作为函数来获取值。

关于如何在字符串中插入变量的问题的答案是:

WELCOME_MESSAGE: 'Welcome ' + name + ', you have a ' + car,

或在定义之前:

function mesg(name, car){
    return "Welcome" + name + ", you have a " + car;
}
mesg(bob, BMW);

在这种情况下,名称和汽车是在后面定义的。

当某些变量更改时,您不能具有JSON结构或字符串“自动”更新。 但是,还有其他方法可以进行这种模板化。 您可以在需要时创建一个函数来创建欢迎消息:

function getWelcomeMessage(name, car) {
  return "Welcome "+name+", you have a "+car;
}

然后,您将执行诸如welcomeMsg = getWelcomeMessage("Joe", "Camry");

如果您不想为每个模板编写函数(即,如果有很多模板),则可以使用String.replace如下所示:

function applyTemplate(template, params) {
  return template.replace(/#(\w+)/g, (m, name) => params[name]);
}

用法示例:

 function applyTemplate(template, params) { return template.replace(/#(\\w+)/g, (m, name) => params[name]); } const WELCOME_TEMPLATE = "Welcome #name, you have a #car"; var name = "Joe"; var car = "Camry"; var welcomeMessage = applyTemplate(WELCOME_TEMPLATE, {name, car}); console.log(welcomeMessage); 

JavaScript中的字符串是原始类型,它按值传递。 因此,一旦为变量分配了字符串,它就永远不会改变,除非您为它明确分配了另一个值(或对象引用)。

但是,您可以询问对象类型的帮助 ,它可以使你的数据反应性 (或动态,如果你喜欢这个词)在一定条件下更新。

var languageStrings = {
  WELCOME_MESSAGE: '',
  NAME_USER: '',
  CAR_USER: ''
}

Object.defineProperty(languageStrings, 'name', {
  get: function (name) {
    return this.NAME_USER
  },
  set: function (name) {
    this.NAME_USER = name
    this.WELCOME_MESSAGE = `Welcome ${this.name}, you have a ${this.car}.`
  }
})

Object.defineProperty(languageStrings, 'car', {
  get: function (car) {
    return this.CAR_USER
  },
  set: function (car) {
    this.CAR_USER = car
    this.WELCOME_MESSAGE = `Welcome ${this.name}, you have a ${this.car}.`
  }
})

现在,每当更改languageStrings.namelanguageStrings.car ,您想要的所有三个字符串将自动采用您刚刚设置的新值:

languageStrings.name = 'Leo'
languageStrings.car = 'BMW'

for (let key in languageStrings) {
  console.log(`${key}: ${languageStrings[key]}`)
}
// WELCOME_MESSAGE: Welcome Leo, you have a BMW.
// NAME_USER: Leo
// CAR_USER: BMW

您不必一直手动调用applyTemplate ,就像@qxz的答案一样(不过,我并不是说他错了)。

另外,请注意,甚至namecar都不是枚举值-不能通过for infor ofObject.keys访问它们! 太好了,您的实现细节被隐藏了,不会给使用您代码的其他开发人员带来任何烦恼或困惑。

实际上,这种反应模型在当今的MV *前端框架中已得到广泛使用,例如Vue

关于你的第二个问题,我并没有坦白地说。 只是JSON.parse那都是普通的JavaScript,不是吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM