2016-09-12 45 views
0

在節點6.x中,querystring模塊將值分析爲一個對象,該對象沒有從Object.prototype擴展(儘管我不知道爲什麼會進行此更改) 。如何檢查JavaScript中Object對象是否繼承Object.prototype

鑑於此,檢查不包含值的查詢參數的預期方法是什麼,即有人通過localhost:8080/some/path?keyonly調用了express或koa,並且我想檢查是否存在this.query.keyonly?我預計我可以做this.query.hasOwnProperty('keyonly')這顯然不起作用。有什麼選擇?

回答

1

有關更改的背景信息,請參閱原始PR here

一般情況下,你不應該依賴foo.hasOwnProperty()因爲hasOwnProperty可以很容易地重新分配給其他的東西(故名爲querystring變化的原因 - 想象有人像http://example.org/foo?hasOwnProperty=hahacrashed調用Web服務)。

至於替代品,你可以只檢查屬性定義,例如:

var qs = querystring.parse('foo=bar'); 
if (qs.foo !== undefined) { 
    // ... 
} 

你也可以這樣做:

var qs = querystring.parse('foo=bar'); 
if (Object.hasOwnProperty.call(qs, 'foo')) { 
    // ... 
} 

,但不是很有效,因爲hasOwnProperty()執行額外的(並且在現在爲querystring的情況下不需要)檢查並使用效率較低的.call()

+0

附帶地我也可以做'Object.keys(this.query).includes('somekey')',它是可讀的,但可能效率最低。 – Kevin

+0

是的,我敢打賭,使用Object.keys()會效率更低(如果沒有其他理由,它會使GC工作更加困難)。 – mscdex

1

看起來你可以使用Object.hasOwnProperty.call(this.query, "keyonly")。我成立了一個有點做作的測試案例,它似乎工作:

const querystring = require("querystring"); 

const qs = "keyonly&keyvalue=valuekey"; 
const result = querystring.decode(url); 

console.log(Object.hasOwnProperty.call(result, "keyonly")); // true 

&keyvalue=valuekey部分是沒有必要爲它工作,我只是想確認,它不會干擾莫名其妙。