2015-03-28 4 views
1

Из JavaScript: The Definitive Guide Дэвид ФлэнаганТак строковый тип объекта или примитивный тип?

JavaScript типы можно разделить на две категории: примитивные типы и типы объектов. К примитивным типам JavaScript относятся числа, строки текста (известные как строки) и значения логической истины (известные как booleans).

В нем указывается, что string является примитивным типом. Но позже был приведен пример кода

var s = "hello, world" // Start with some text. 
s.charAt(0) // => "h": the first character. 
s.charAt(s.length-1) // => "d": the last character. 
s.substring(1,4) // => "ell": the 2nd, 3rd and 4th characters. 
s.slice(1,4) // => "ell": same thing 
s.slice(-3) // => "rld": last 3 characters 
s.indexOf("l") // => 2: position of first letter l. 
s.lastIndexOf("l") // => 10: position of last letter l. 
s.indexOf("l", 3) // => 3: position of first "l" at or after 3 

Так выглядит строковый объект или примитив? как примитивный тип может иметь методы? Разве это свойство типа объекта? Если это какой-то гибрид обоих, то когда он примитивен и когда он является объектом?

+3

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

+1

Предлагаемое чтение: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String – nicael

+0

Типы примитивов также могут иметь методы типа объектов. Но вы не можете назначать новые методы/свойства литералам примитивным типам, но вы можете назначать новые методы/свойства для литералов. Это одно отличие между примитивами и объектами. – Blauharley

ответ

1

Строки примитивные значения:

4.3.2 primitive value

член одного из типов Undefined, Null, Boolean, Number, или Строка

Но есть и строковые объекты, которые являются объектами, а не примитивами:

4.3.18 String object

элемент типа Object, который является экземпляром стандартного встроенного String конструктора

Это может показаться примитивным струны имеют свойства, но нет.

При использовании, например, string.charAt(0), строковый объект создается с тем же значением, что и ваша примитивная строка. Этот объект наследуется от String.prototype. Вызывается метод этого строкового объекта charAt, а возвращаемое значение возвращается в string.charAt(0). Затем объект строки удаляется.

Когда вы присваиваете свойство примитивной строке, происходит нечто подобное: свойство присваивается новому строковому объекту, а не примитиву.

Некоторые примеры:

var primitiveStr = 'foo', 
    objectStr = new String('foo'); 
typeof primitiveStr; // 'string' 
typeof objectStr; // 'object' 
typeof primitiveStr.charAt; // 'function' 
typeof objectStr.charAt; // 'function' 
primitiveStr.foo = objectStr.foo = 123; 
typeof primitiveStr.foo; // 'undefined' 
typeof objectStr.foo; // 'number' 
Смежные вопросы