[英]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.name
或languageStrings.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的答案一樣(不過,我並不是說他錯了)。
另外,請注意,甚至name
和car
都不是枚舉值-不能通過for in
, for of
或Object.keys
訪問它們! 太好了,您的實現細節被隱藏了,不會給使用您代碼的其他開發人員帶來任何煩惱或困惑。
實際上,這種反應模型在當今的MV *前端框架中已得到廣泛使用,例如Vue 。
關於你的第二個問題,我並沒有坦白地說。 只是JSON.parse
那都是普通的JavaScript,不是嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.