我在网上阅读随机主题时遇到了鸭子打字这个术语,并没有完全理解它.
什么是"鸭子打字"?
为了使我的一个函数的语法更好,我需要能够判断一个特定的参数是一个数组还是"哈希"(我知道它只是对象).
Typeof不起作用,因为它们都返回相同的东西
typeof {foo:"bar"} // Object
typeof ["foo","bar"] // Object
那么我如何区分这两者呢?
我知道这有效,但我希望有更好的方法
({foo:"bar"}).constructor // Object()
(["foo","bar"]).constructor // [ undefined ]
编辑 啊,似乎[firebug中的[undefined]与Array是一样的.有点奇怪.
是否有任何重要的使用理由
typeof variable === 'function'
Run Code Online (Sandbox Code Playgroud)
与
!!variable.call
Run Code Online (Sandbox Code Playgroud)
用于检测变量是否是函数?
除了显而易见的人之外可能会创建一个对象:
{ call: 1 }
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是
typeof /regex/ === 'function'
Run Code Online (Sandbox Code Playgroud)
返回true,但是
!!/regex/.call
Run Code Online (Sandbox Code Playgroud)
返回false
可配置属性似乎是可删除的:
var o = {};
Object.defineProperty(o, 'prop', {
configurable: true,
value: 'val'
});
delete o.prop; // true
o.prop; // undefined
Run Code Online (Sandbox Code Playgroud)
但它在以下情况下不起作用,至少在Firefox和Chrome上是这样的:
var form = document.createElement('form'),
input = document.createElement('input');
form.appendChild(input);
var elems = form.elements;
Object.getOwnPropertyDescriptor(form, 0)
.configurable; // true <?????????????????????? !!!
delete elems[0]; // false ?
elems[0]; // input ?
(function(){ 'use strict'; // V
delete elems[0]; // TypeError: property 0 is non-configurable
})(); // and can't be deleted
Run Code Online (Sandbox Code Playgroud)
但这似乎与规范相矛盾.
该delete运营商的定义是这样的:
生产UnaryExpression:
deleteUnaryExpression …
我们在这里有一些问题以更抽象的方式讨论删除,但我正在寻找delete可以使用何时使用的实际示例,而不是做一些事情,例如将属性设置为null或undefined.
遇到某种挑战的情况是什么,这delete是最好的解决方案,与其他方面相比?
可能重复:
RegExp的typeof
我有一个例程,正在测试一个对象是否符合给定的条件.
testForMatch(objectToTest, matchCriteria) {
// all my testing logic here.
}
Run Code Online (Sandbox Code Playgroud)
该参数matchCriteria是一个可能如下所示的对象,例如:
{
'size' : "large",
'color' : /(blue|red)/
}
Run Code Online (Sandbox Code Playgroud)
这matchCriteria在上面的例子将用来测试是否objectToTest有一个属性size与值"large"和属性color与任一值"blue"或"red".
因此matchCriteria,objectToTest为了匹配属性的值,将寻找属性/属性名称.或者,如果给出正则表达式作为值(color如上所述),则属性objectToTest将RegExp.test()与给定的正则表达式相对应.
但是为了matchCriteria正确处理testForMatch(),我需要能够判断属性的值matchCriteria是字符串还是RegExp对象.
我的问题是,如何检测属性的值是否为RegExp对象?