JS值是否可以是数组和函数?
const isArrayAndFunc = v => {
return Array.isArray(v) && typeof v === 'function';
}
isArrayAndFunc
会为JS中的值返回true吗?
我认为不是,而只是检查。
答案 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中:
- 如果参数是Array外来对象,则返回true。
如果参数是Proxy外来对象,则
a。如果参数的[[ProxyHandler]]内部插槽的值为null,则引发TypeError异常。
b。令target为参数的[[ProxyTarget]]内部插槽的值。
c。返回IsArray(target)。
对于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
所以,是的,可以...但是不太可能?