2017-02-16 6 views
0

Я пытаюсь понять, почему метод «keys» не возвращает свойства и методы объекта String. Другими словами, что уникально в этом объекте? Я протестировал эту теорию, создав общий объект, предоставив ему 1 свойство и 1 метод, а затем запустив на нем метод .keys, и он возвратил как свойство, так и метод. Поскольку String является объектом в Javascript, предполагается, что применение метода .keys к нему будет делать то же самое - как минимум, вернуть метод .length в возвращаемом наборе.Почему «.keys» возвращает «undefined» при применении к объекту String в Javascript?

Использование консоли Chrome, я побежал следующие случаи:

typeof String // "function" 
"function" == typeof String // true 
"object" == typeof String // false 

Две ноты в дополнении к моему основному вопросу: В рамках JavaScript:

  1. является функцией не является объектом?
  2. Не объекты большинства вещей вне примитивов и некоторых других особых случаев?
+4

Непонятно, как название вопроса относится к содержанию вопроса. – Pointy

+0

Вы можете утверждать, что любой примитив имеет внешний вид объекта при проверке. Все они обладают неотъемлемыми свойствами и могут рассматриваться как сами объекты. Вопрос довольно академичен, хотя ИМО. –

+0

@Iain, из того, что я читал на MDN, Javacsript автоматически преобразует примитивы строк в объекты String. Но в моем примере я тестировал сам объект String. – brooklynsweb

ответ

0

Некоторых справочной информацией

Эффективно Object.keys возвращает список собственных перечислимых свойств на экземпляре объекта. Это свойства, принадлежащие только этому экземпляру класса Object, исключая любые прототипно унаследованные свойства и/или методы. Это ценности, которые возвращают истинные в следующих примерах:

// Create an Object with own properties 
var obj = { 
    foo: 'bar' 
} 

obj.hasOwnProperty('foo') // => true, brilliant 

Как многие знают, это будет по-прежнему верно, когда свойства добавляются после того, как объект был построен. Как можно видеть в этом примере:

// Create an Object the retroactively add an enumerable property 
var obj = {} 
obj.foo = 'bar' 

obj.hasOwnProperty('foo') // => true, great 

Объекты, функции и массивы ведут себя таким образом; а строки - нет.Вы можете легко убедиться в этом, пытаясь добавить свои свойства в строку, а затем читать их обратно, как это:

var str = 'foo' 
str.bar = 'baz' 

console.log(str) // => undefined, hmm 

// What about "hasOwnProperty"? 
str.hasOwnProperty('bar') // => false... too bad 

Так, чтобы ответить на этот вопрос ...

Собственные ПЕРЕЧИСЛИМЫЕ свойства по своей сути не может существовать на экземплярах типа String и не может быть добавлена ​​ретроспективно либо потому, что собственные свойства не назначаются для строк, периода.

Хотя это объяснение не объясняет решения, принятые во время его реализации, оно, безусловно, дает некоторое общее представление о том, почему String.keys не существует или просто не может существовать; и почему Object.keys всегда возвращает undefined при поставке со строкой.

0

Функции являются объектами. Определенное поведение typeof несколько своеобразно. Значения в JavaScript - это либо объекты, либо примитивы.

Свойство «keys» экземпляров String не определено, потому что оно не определено в прототипе String. Вы можете добавить такое свойство, если хотите, хотя работа с экземплярами String вместо примитивов строк является рецептом для множества странных ошибок.

0
console.log(String) 

>function String() { [native code] }

var a = new String() 
console.log(a) 

>String {length: 0, [[PrimitiveValue]]: ""}

typeof a 

>"object"

он должен быть "класс" вместо "функции", так как и в других языках, но функция в JS являются первоклассным объектом (подробнее здесь What is meant by 'first class object'?)

объекта являются инстансы классы

+0

По моему оригинальному примечанию в содержании вопроса: на основании того, что я читал, я думал, что функция является объектом. – brooklynsweb