在JavaScript中,我想知道为什么我可以这样做:
[].slice.apply([1,2,3], [0, 2]) // returns [1, 2]
据我所知,这相当于:
Array.prototype.slice.apply([1,2,3], [0, 2]); // returns [1, 2]
但我不能这样做:
{}.hasOwnProperty.apply(a, ['a']);
允许不输入这条长行:
Object.prototype.hasOwnProperty.apply(a, ['a']); // returns true or false
好吧,当我在这里时,我也看到我实际上可以做所有这些:
''.indexOf.apply('asdasd', ['s']); // returns 1
true.toString.apply(true); // returns // "true" as string
与{}有什么关系? :-)为什么这么特别?
答案 0 :(得分:6)
hasOwnProperty('a')
是拼写错误吗?
{}.hasOwnProperty.apply(a, ['a']);
但由于JavaScript将{}
解释为块分隔符,因此完全不起作用。只需添加括号:
({}).hasOwnProperty.apply(a, ['a']);
检查:
> var a = {'a': 1}
Object
> {}.hasOwnProperty.apply(a, ['a']);
SyntaxError: Unexpected token .
> ({}).hasOwnProperty.apply(a, ['a']);
true
答案 1 :(得分:2)
hasOwnProperty()返回true或false,而不是实际的属性本身。
使用其他示例,您正在处理返回的函数,而不是标量或本机对象,这就是您可以对它们调用apply()的原因。
你试过{} .hasOwnProperty.apply(......)吗?
答案 2 :(得分:2)
支架:
({}).hasOwnProperty.apply({k:9,aa:5}, ['a']); // false
({}).hasOwnProperty.apply({k:9,a:5}, ['a']); // true