JS值是否可以是数组和函数? Array.isArray(v)+ typeof v ==='函数'

时间:2019-07-14 22:59:06

标签: javascript node.js

JS值是否可以是数组和函数?

const isArrayAndFunc = v => {
  return Array.isArray(v) && typeof v === 'function';
}

isArrayAndFunc会为JS中的值返回true吗?

我认为不是,而只是检查。

2 个答案:

答案 0 :(得分:2)

可能被视为作弊,但有可能覆盖Array.isArray来实现您自己的逻辑:

Array.isArray = () => true;
const isArrayAndFunc = v => {
  return Array.isArray(v) && typeof v === 'function';
};

console.log(isArrayAndFunc(() => 'foo'));

在内部,Array.isArray在ES5中,checks

  

如果arg的[[Class]]内部属性的值为“ Array”,则返回true。

这是一个内部属性,无法修改:

  

该规范未定义任何ECMAScript语言运算符或内置函数,这些运算符或内置函数不允许程序修改对象的 [[Class]] 或[[Prototype]]内部属性或更改[ [可扩展]从假变为真。修改[[Class]],[[Prototype]]或[[Extensible]]的特定于实现的扩展不得违反上一段中定义的不变式。

ES6中:

  
      
  1. 如果参数是Array外来对象,则返回true。
  2.   
  3. 如果参数是Proxy外来对象,则

         

    a。如果参数的[[ProxyHandler]]内部插槽的值为null,则引发TypeError异常。

         

    b。令target为参数的[[ProxyTarget]]内部插槽的值。

         

    c。返回IsArray(target)。

  4.   

对于2.,可以使用doesn't look将任何对象(或函数)转换为“数组奇异对象”。 setPrototypeOf可用于设置函数的内部原型,但实际上 仍不会成为“数组奇异对象”。

'use strict';
const fn = () => 'foo';
Object.setPrototypeOf(fn, Array);

const isArrayAndFunc = v => {
  return Array.isArray(v) && typeof v === 'function';
};
console.log(isArrayAndFunc(fn));

对于3,如果所检查的对象是代理,则其typeof将是object,而不是函数。

因此,除非您覆盖Array.isArray(或者覆盖/阴影Array本身),否则我认为isArrayAndFunc不会返回true

答案 1 :(得分:-1)

技术上,是的……但是只有当有人要重写内置的Array.isArray()方法时才可以。例如:

Array.isArray = () => true;
console.log( Array.isArray( 'foo' ) );  // true
console.log( Array.isArray( []    ) );  // true
console.log( Array.isArray( ()=>1 ) );  // true

const isArrayAndFunc = v => {
  return Array.isArray(v) && typeof v === 'function';
}
console.log( isArrayAndFunc( ()=>1 ) );  // true

所以,是的,可以...但是不太可能?