Javascript: повторяется через строку, но не может назначить? [dубликат]

После перезагрузки он теперь работает.

Итак, трюк состоял в том, чтобы вручную выполнить create_tables.sql, вы можете просто скопировать все в sql-окно phpMyAdmin и выполнить его. Это создало недостающие таблицы.

195
задан 19 July 2012 в 05:07

8 ответов

из книги rhino:

В JavaScript строки являются неизменяемыми объектами, а это значит, что символы внутри них не могут быть изменены и что любые операции над строками фактически создают новые строки. Строки назначаются по ссылке, а не по значению. В общем случае, когда объект присваивается ссылкой, изменение, сделанное объектом через одну ссылку, будет видимым через все другие ссылки на объект. Однако, поскольку строки не могут быть изменены, вы можете иметь несколько ссылок на строковый объект и не волноваться, что значение строки изменится, не зная его
45
ответ дан 15 August 2018 в 16:15
  • 1
    Ссылка на соответствующий раздел книги rhino: books.google.com/… – baudtack 6 June 2009 в 10:55
  • 2
    Ссылка на книгу Rhino (и, следовательно, такой ответ) здесь неверна . В строках JavaScript используются примитивные типы значений и не объекты (spec) . Фактически, с ES5 они являются одним из 5 типов значений наряду с null undefined number и boolean. Строки присваиваются значением и не по ссылке и передаются как таковые. Таким образом, строки не просто неизменяемы, они являются значением . Изменение строки "hello" на "world" похоже на то, чтобы решить, что теперь число 3 является числом 4 ... это не имеет смысла. – Benjamin Gruenbaum 17 September 2013 в 03:20
  • 3
    Да, как и в моем комментарии, строки являются неизменяемыми, но они не являются ссылочными типами, они не являются объектами - они являются примитивными типами значений. Легкий способ увидеть, что они не должны пытаться добавить свойство в строку, а затем прочитать его: var a = "hello";var b=a;a.x=5;console.log(a.x,b.x); – Benjamin Gruenbaum 17 September 2013 в 21:08
  • 4
    @ VidarS.Ramdal Нет, String объекты, созданные с помощью конструктора строк, являются wrappers вокруг значений строки JavaScript. Вы можете получить доступ к строковому значению вложенного типа с помощью функции .valueOf() - это также верно для объектов Number и значений чисел. Важно отметить, что объекты String, созданные с помощью new String, не являются настоящими строками, но являются wrappers или поля вокруг строк. См. [D3] es5.github.io/#x15.5.2.1 . О том, как вещи преобразуются в объекты, см. [D4] es5.github.io/#x9.9 – Benjamin Gruenbaum 21 February 2014 в 19:43

Что касается вашего вопроса (в вашем комментарии к реакции Эша) о StringBuilder в ASP.NET Ajax, эксперты, похоже, не согласны с этим.

Кристиан Венц говорит в своей книге «Программирование ASP.NET AJAX ( O'Reilly), что «этот подход не оказывает какого-либо измеримого влияния на память (фактически, реализация кажется тика медленнее стандартного подхода)».

С другой стороны, Галло и другие говорят в своей книге . Программирование ASP.NET AJAX (Manning): «Когда число строк для конкатенации больше, построитель строк становится важным объектом, чтобы избежать огромного снижения производительности».

] Я думаю, вам нужно будет сделать свой собственный бенчмаркинг, и результаты могут отличаться и между браузерами. Однако, даже если он не улучшает производительность, он все равно может считаться «полезным» для программистов, которые используются для кодирования с помощью StringBuilders на таких языках, как C # или Java.

1
ответ дан 15 August 2018 в 16:15

Совет по производительности:

Если вам нужно объединить большие строки, поместите части строки в массив и используйте метод Array.Join(), чтобы получить общую строку. Это может быть во много раз быстрее для конкатенации большого количества строк.

В JavaScript нет StringBuilder.

22
ответ дан 15 August 2018 в 16:15
  • 1
    Я знаю, что нет stringBuilder, у msAjax есть один, и я просто размышлял, действительно ли он полезен – DevelopingChris 9 September 2008 в 08:56
  • 2
    Что это связано с тем, что строки неизменяемы или нет? – baudtack 6 June 2009 в 10:56
  • 3
    @docgnome: поскольку строки неизменяемы, для конкатенации строк требуется создание большего количества объектов, чем подход Array.join – Juan Mendes 18 January 2011 в 00:37
  • 4
    Согласно вышеописанному выше примеру Хуана, конкатенация строк на самом деле быстрее работает как в IE, так и в Chrome, но медленнее в Firefox. – Bill Yang 22 February 2012 в 00:36
  • 5
    Подумайте об обновлении своего ответа, возможно, это было правдой давным-давно, но это уже не так. См. [D0] jsperf.com/string-concat-without-sringbuilder/5 – Juan Mendes 20 May 2014 в 21:21

Строки неизменяемы - они не могут измениться, мы можем только создавать новые строки.

Пример:

var str= "Immutable value"; // it is immutable

var other= statement.slice(2, 10); // new string
1
ответ дан 15 August 2018 в 16:15

Строки в Javascript неизменяемы

1
ответ дан 15 August 2018 в 16:15

Строки JavaScript действительно неизменяемы.

3
ответ дан 15 August 2018 в 16:15

Это поздняя публикация, но я не нашел хорошую цитату из книги.

Вот определенная, за исключением надежной книги:

Строки неизменяемы в ECMAScript , что означает, что после их создания их значения не могут измениться. Чтобы изменить строку, содержащуюся в переменной, исходная строка должна быть уничтожена, а переменная заполнена другой строкой, содержащей новое значение ... - Профессиональный JavaScript для веб-разработчиков, 3-е изд., Стр.43

Теперь ответ, который цитирует выдержку из книги Rhino, справедлив в отношении неизменности строки, но неправильно говорит: «Строки назначаются по ссылке, а не по значению». (возможно, они изначально предполагали, что слова будут противоположными).

Заблуждение «ссылка / значение» поясняется в разделе «Профессиональный JavaScript», озаглавленном «Примитивные и опорные значения»:

Строки неизменны в ECMAScript, а это означает, что после их создания их значения не могут измениться. Чтобы изменить строку, содержащуюся в переменной, исходная строка должна быть уничтожена, а переменная заполнена другой строкой, содержащей новое значение ... - Профессиональный JavaScript для веб-разработчиков, 3-е изд., Стр.43

Пять примитивных типов ... [are]: Undefined, Null, Boolean, Number и String. Говорят, что эти переменные имеют доступ к значению, поскольку вы управляете фактическим значением, хранящимся в переменной. -Professional JavaScript для веб-разработчиков, 3-е изд., С.85

Когда вы манипулируете объектом, вы действительно работаете над ссылкой на этот объект, а не с самим объектом. По этой причине такие значения, как говорят, доступны по ссылке. [D4] -Профессиональный JavaScript для веб-разработчиков, 3-е изд., Стр.43
0
ответ дан 15 August 2018 в 16:15

Значение типа строки является неизменным, но объект String, созданный с помощью конструктора String (), является изменяемым, потому что это объект, и вы можете добавить к нему новые свойства.

> var str = new String("test")
undefined
> str
[String: 'test']
> str.newProp = "some value"
'some value'
> str
{ [String: 'test'] newProp: 'some value' }

Тем не менее, хотя вы можете добавлять новые свойства, вы не можете изменить уже существующие свойства

Снимок экрана теста в консоли Chrome

В заключение, 1. вся строка значение типа (примитивный тип) является неизменным. 2. Объект String является изменяемым, но значение типа строки (примитивный тип), которое оно содержит, является неизменным.

2
ответ дан 15 August 2018 в 16:15
  • 1
    Объекты Javascript String неизменяемы developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures – prasun 14 October 2015 в 17:28
  • 2
    @prasun, но на этой странице он говорит: «Все типы, кроме объектов, определяют неизменяемые значения (значения, которые не могут быть изменены). & Quot; Объекты String являются объектами. И как она неизменна, если вы можете добавить к ней новые свойства? – zhanziyang 15 October 2015 в 07:18
  • 3
    прочитайте раздел «Тип строки». Ссылка String Javascript указывает как на примитив, так и на Object, а затем говорит, что строки JavaScript неизменяемы. Похоже, что документ не ясен по этой теме, поскольку он конфликтует с двумя разными нотами – prasun 15 October 2015 в 07:29
  • 4
    new String генерирует изменчивую оболочку вокруг неизменяемой строки – tomdemuyt 2 December 2015 в 18:29
  • 5
    Это очень легко проверить, выполнив приведенный выше код @ zhanziyang. Вы можете полностью добавить новые свойства к объекту String (обертке), то есть not immutable (по умолчанию, как и любой другой объект, который вы можете называть Object.freeze на нем, чтобы сделать его неизменным). Но тип примитивного строкового значения, содержащийся в обертке объекта String или нет, всегда неизменен. – Mark Reed 30 January 2018 в 20:29

Другие вопросы по тегам:

Похожие вопросы: