Разве объект Array не отличается от Object (думал, что typeof в обоих возвращает одно и то же значение)? - PullRequest
0 голосов
/ 24 апреля 2019

два из этих тестов не пройдены.Может кто-нибудь объяснить, почему и как это исправить?

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

edit I

исправленная строка

var x = [];

, которую @MarkMeyer указал, что это неправильно.в моем оригинале это было правильно, и исправление не меняет результаты

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Как ловко указал @Paulpro, мои тесты плохие.Я проверял .isObj, где я должен был проверять .isArr

, если я исправлю, что все работает

0 голосов
/ 24 апреля 2019

Чтобы проверить массив, используйте 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)) })
})
...