變量的所有值所以在我js
代碼我有一個改變其值幾次一些全局變量,例如獲取使用JS
var x = 0;
...
x = 10;
...
x = 5;
是否有可能得到的x
「歷史」,但不保存其其他變量的價值?喜歡,是否有一些功能可以檢測到在某個時間點x
等於10?
變量的所有值所以在我js
代碼我有一個改變其值幾次一些全局變量,例如獲取使用JS
var x = 0;
...
x = 10;
...
x = 5;
是否有可能得到的x
「歷史」,但不保存其其他變量的價值?喜歡,是否有一些功能可以檢測到在某個時間點x
等於10?
不,一旦一個值被分配給一個變量,該變量的前一個值被覆蓋。它不保留在任何地方。 (如果是的話,這對內存管理來說是一場噩夢。)
如果需要,可以使用setter函數使對象屬性保留歷史記錄;粗糙的例子:
var obj = {
_fooValue: undefined,
fooHistory: [],
set foo(value) {
this.fooHistory.push(this._fooValue);
this._fooValue = value;
},
get foo() {
return this._fooValue;
}
};
obj.foo = 0;
obj.foo = 5;
obj.foo = 42;
console.log(obj.fooHistory);
在這個例子中,歷史不包含當前值,僅僅是以前的,它存儲在另一個對象屬性的當前值,這意味着代碼可以繞過二傳手。有很多你可以做的調整。如果你認爲它是重要的,你可以鎖定它更多:
var obj = (function() {
// These two vars are entirely private to the object
var fooHistory = [];
var fooValue;
// The object we'll assign to `obj`
return {
set foo(value) {
fooHistory.push(fooValue);
fooValue = value;
},
get foo() {
return fooValue;
},
get fooHistory() {
// Being really defensive and returning
// a copy
return fooHistory.slice(0);
}
}
})();
obj.foo = 0;
obj.foo = 5;
obj.foo = 42;
console.log(obj.fooHistory);
它如何跳過當前(最後一個)值? –
啊,我明白了,你只是推前一個,而不是當前)) –
@vp_arth:是的。 :-) –
是的,有。在Microsoft Edge瀏覽器中使用時間旅行調試。檢查this了。
我不是JS專家,但作爲共同的理念,爲任何OOP語言,我建議創建x
特殊類(由Integer在你的榜樣繼承),這已經重寫setter和一些歷史數組列表。所以,當你設置一個新的值時,它會存儲在你的歷史記錄中。
您只需要更改變量類型,而不是代碼,該代碼適用於該類型。我也不認爲有任何語言的標準解決方案。可能是一些動態的introspectors,但這些會比我的想法更加複雜。
您可以使用像數組這樣的變量,並將下一個值移到這個數組中。並使用它採取第一個元素:
var x = [];
...
x.unshift(10);
...
x.unshift(5);
var currentX = x[0];
var allValues = x;
你有什麼相關的谷歌? –
沒有使用歷史數組變量我沒有看到這個工作夥伴 - 當然我可能是錯的。 – Terrance00
nope,我試過但沒有成功 – Coffee