[英]Isn't the Array object different from the Object (thought typeof on both returns the same value)?
其中兩個測試失敗。 誰能解釋為什么以及如何解決?
var assert = require('assert').strict
Number.prototype.isNbr = true
Number.prototype.isStr = false
Number.prototype.isObj = false
Number.prototype.isArr = false
String.prototype.isNbr = false
String.prototype.isStr = true
String.prototype.isObj = false
String.prototype.isArr = false
Array.prototype.isNbr = false
Array.prototype.isStr = false
Array.prototype.isObj = false
Array.prototype.isArr = true
Object.prototype.isNbr = false
Object.prototype.isStr = false
Object.prototype.isObj = true
Object.prototype.isArr = false
describe('Number', () => {
var x = 0;
it('Is number', () => { assert.ok(x.isNbr) })
it('Is string', () => { assert.ok(!x.isStr) })
it('Is object', () => { assert.ok(!x.isObj) })
it('Is array', () => { assert.ok(!x.isObj) })
})
describe('String', () => {
var x = '';
it('Is number', () => { assert.ok(!x.isNbr) })
it('Is string', () => { assert.ok(x.isStr) })
it('Is object', () => { assert.ok(!x.isObj) })
it('Is array', () => { assert.ok(!x.isObj) })
})
describe('Object', () => {
var x = {};
it('Is number', () => { assert.ok(!x.isNbr) })
it('Is string', () => { assert.ok(!x.isStr) })
it('Is object', () => { assert.ok(x.isObj) })
it('Is array', () => { assert.ok(!x.isObj) })
})
describe('Array', () => {
var x = [];
it('Is number', () => { assert.ok(!x.isNbr) })
it('Is string', () => { assert.ok(!x.isStr) })
it('Is object', () => { assert.ok(!x.isObj) })
it('Is array', () => { assert.ok(x.isObj) })
})
您可以保存到文件t.js
並按以下方式運行:
$ mocha t.js
編輯我
校正線
var x = [];
@MarkMeyer指出的是錯誤的。 在我的原著中是正確的,但更正不會改變結果
正如@Paulpro巧妙指出的那樣,我的測試很糟糕。 我正在檢查.isObj
,我應該一直在檢查.isArr
如果我修復一切正常
要測試數組,請使用Array.isArray(val)
:
var a = [1,2,3]; var b = {a:1}; console.log(Array.isArray(a)); console.log(Array.isArray(b));
您的代碼失敗的最大原因是因為您沒有調用.isArr
。 回頭看看您的代碼。 您每個都兩次調用.isObj
。
var assert = { ok(val) { if (!val) { console.error(`The value ${val} was not true.`); } else { console.info(' ✓'); } } } function describe(text, fn) { console.log(`Running test for: ${text}`); fn(); } function it(text, fn) { console.log(` -- ${text}`); fn(); } Number.prototype.isNbr = true Number.prototype.isStr = false Number.prototype.isObj = false Number.prototype.isArr = false String.prototype.isNbr = false String.prototype.isStr = true String.prototype.isObj = false String.prototype.isArr = false Array.prototype.isNbr = false Array.prototype.isStr = false Array.prototype.isObj = false Array.prototype.isArr = true Object.prototype.isNbr = false Object.prototype.isStr = false Object.prototype.isObj = true Object.prototype.isArr = false describe('Number', () => { var x = 0; it('Is number', () => { assert.ok(x.isNbr) }) it('Is string', () => { assert.ok(!x.isStr) }) it('Is object', () => { assert.ok(!x.isObj) }) it('Is array', () => { assert.ok(!x.isArr) }) }) describe('String', () => { var x = ''; it('Is number', () => { assert.ok(!x.isNbr) }) it('Is string', () => { assert.ok(x.isStr) }) it('Is object', () => { assert.ok(!x.isObj) }) it('Is array', () => { assert.ok(!x.isArr) }) }) describe('Object', () => { var x = {}; it('Is number', () => { assert.ok(!x.isNbr) }) it('Is string', () => { assert.ok(!x.isStr) }) it('Is object', () => { assert.ok(x.isObj) }) it('Is array', () => { assert.ok(!x.isArr) }) }) describe('Array', () => { var x = []; it('Is number', () => { assert.ok(!x.isNbr) }) it('Is string', () => { assert.ok(!x.isStr) }) it('Is object', () => { assert.ok(!x.isObj) }) it('Is array', () => { assert.ok(x.isArr) }) })
但這不是測試這些類型的最佳方法。 您正在更改內置對象的prototype
。 通常認為這是一種不良做法。
您可以這樣做:
var assert = { ok(val) { if (!val) { console.error(`The value ${val} was not true.`); } else { console.info(' ✓'); } } } function describe(text, fn) { console.log(`Running test for: ${text}`); fn(); } function it(text, fn) { console.log(` -- ${text}`); fn(); } const isNbr = val => Object.prototype.toString.apply(val).slice(8,-1) === 'Number' const isStr = val => Object.prototype.toString.apply(val).slice(8,-1) === 'String'; const isFun = val => Object.prototype.toString.apply(val).slice(8,-1) === 'Function'; const isObj = val => Object.prototype.toString.apply(val).slice(8,-1) === 'Object'; const isArr = val => Array.isArray(val); describe('Number', () => { var x = 0; it('Is number', () => { assert.ok(isNbr(x)) }) it('Is string', () => { assert.ok(!isStr(x)) }) it('Is object', () => { assert.ok(!isObj(x)) }) it('Is function', () => { assert.ok(!isFun(x)) }) it('Is array', () => { assert.ok(!isArr(x)) }) }) describe('Function', () => { var x = () => {}; it('Is number', () => { assert.ok(!isNbr(x)) }) it('Is string', () => { assert.ok(!isStr(x)) }) it('Is object', () => { assert.ok(!isObj(x)) }) it('Is function', () => { assert.ok(isFun(x)) }) it('Is array', () => { assert.ok(!isArr(x)) }) }) describe('String', () => { var x = ''; it('Is number', () => { assert.ok(!isNbr(x)) }) it('Is string', () => { assert.ok(isStr(x)) }) it('Is object', () => { assert.ok(!isObj(x)) }) it('Is function', () => { assert.ok(!isFun(x)) }) it('Is array', () => { assert.ok(!isArr(x)) }) }) describe('Object', () => { var x = {}; it('Is number', () => { assert.ok(!isNbr(x)) }) it('Is string', () => { assert.ok(!isStr(x)) }) it('Is object', () => { assert.ok(isObj(x)) }) it('Is function', () => { assert.ok(!isFun(x)) }) it('Is array', () => { assert.ok(!isArr(x)) }) }) describe('Array', () => { var x = []; it('Is number', () => { assert.ok(!isNbr(x)) }) it('Is string', () => { assert.ok(!isStr(x)) }) it('Is object', () => { assert.ok(!isObj(x)) }) it('Is function', () => { assert.ok(!isFun(x)) }) it('Is array', () => { assert.ok(isArr(x)) }) }) describe('Null', () => { var x = null; it('Is number', () => { assert.ok(!isNbr(x)) }) it('Is string', () => { assert.ok(!isStr(x)) }) it('Is object', () => { assert.ok(!isObj(x)) }) it('Is function', () => { assert.ok(!isFun(x)) }) it('Is array', () => { assert.ok(!isArr(x)) }) })
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.