簡體   English   中英

Array對象與Object是否不相同(兩者的typeof都返回相同的值)?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM