数组文字方法调用和对象文字方法调用的区别

时间:2011-06-08 22:38:10

标签: javascript

在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

与{}有什么关系? :-)为什么这么特别?

3 个答案:

答案 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