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

Mis*_*lin 0 javascript

在JavaScript中,我想知道为什么我可以这样做:

[].slice.apply([1,2,3], [0, 2]) // returns [1, 2]
Run Code Online (Sandbox Code Playgroud)

据我所知,这相当于:

Array.prototype.slice.apply([1,2,3], [0, 2]); // returns [1, 2]
Run Code Online (Sandbox Code Playgroud)

但我不能这样做:

{}.hasOwnProperty.apply(a, ['a']);
Run Code Online (Sandbox Code Playgroud)

这将允许不输入这个长行:

Object.prototype.hasOwnProperty.apply(a, ['a']); // returns true or false
Run Code Online (Sandbox Code Playgroud)

好吧,当我在它的时候,我也看到我实际上可以做所有这些:

''.indexOf.apply('asdasd', ['s']); // returns 1
true.toString.apply(true); // returns // "true" as string
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*all 6

是hasOwnProperty('a')拼写错误?

{}.hasOwnProperty.apply(a, ['a']);
Run Code Online (Sandbox Code Playgroud)

但由于JavaScript解释为块分隔符,因此不太适用{}.只需添加括号:

({}).hasOwnProperty.apply(a, ['a']);
Run Code Online (Sandbox Code Playgroud)

核实:

> var a = {'a': 1}
  Object
> {}.hasOwnProperty.apply(a, ['a']);
  SyntaxError: Unexpected token .
> ({}).hasOwnProperty.apply(a, ['a']);
  true
Run Code Online (Sandbox Code Playgroud)