首页 > 解决方案 > 为什么它不承认我的论点是一个对象?我的 typeof 方法不正确吗?

问题描述

我们将完成一个函数,该函数接受一个参数,可能是一个对象,并返回输入是否为对象。您的函数应该创建几个变量(isObject、isNotAnArray 和 isObjectAndNotAnArray)。将 isObject 分配给 typeof 运算符对输入的应用程序。使用 ! 将 isNotAnArray 分配给对 Array.isArray() 方法的调用 运算符也适用。将 isObjectAndNotAnArray 分配给前面两个与 && 运算符结合的变量,并返回 isObjectAndNotAnArray 变量。下面是运行代码的示例,假设您将完成所描述的功能:isAnObject。

var resultBoolean1 = isAnObject([1, 2, 3]);
console.log('should log false:', resultBoolean1);

var resultBoolean2 = isAnObject({name: 'Tom', friend: 'Jerry'});
console.log('should log true:', resultBoolean2);

我的代码:

function isAnObject(input) {
  var isObject = typeof input === 'object';
  var isNotAnArray = Array.isArray(!input);
  var isObjectAndNotAnArray = isObject && isNotAnArray;
  return isObjectAndNotAnArray;// create an isObject variable
  // assign it to whether the input is an object type
  // create an isNotAnArray variable
  // assign it to whether the input is not an array
  // create an isObjectAndNotAnArray variable
  // assign it to a combination of isObject AND isNotAnArray
  // return the isObjectAndNotAnArray variable
}

它告诉我:当输入参数是一个对象时它返回 true

错误:
预期 false 与 true 相等

标签: javascript

解决方案


你的感叹号放错地方了

  var isNotAnArray = Array.isArray(!input);

  var isNotAnArray = !Array.isArray(input);

因为你想否定布尔值而不是对象本身

只是为了更简洁的代码,我会清理它并缩短它:

function isObject(input) {
  return Object.prototype.toString.call(input) === '[object Object]';
}

这是一种不同的方法,但基本上它将您的值转换为字符串,因此排除了数组,然后检查字符串是否为 [object Object]。我喜欢这个的原因是因为像“null”或“undefined”这样的值表现得很奇怪,并且被你定义它的方式视为对象,所以这个方法打开了你对所有变量类型的使用。


推荐阅读