Почему существует два вида строк JavaScript?

Этот меня сильно ударил. Я не знаю, относится ли это ко всем браузерам (у меня нет другого подходящего браузера для тестирования), но, по крайней мере, Firefox имеет два типа строковых объектов.

Откройте консоль Firebugs и попробуйте следующее :

>>> "a"
"a"
>>> new String("a")
String { 0="a"}

Как вы можете визуально заметить, Firefox по-разному обрабатывает новую строку («a») и «a» . Однако в остальном оба типа строк ведут себя одинаково. Например, есть свидетельства того, что оба используют один и тот же объект-прототип:

>>> String.prototype.log = function() { console.log("Logged string: " + this); }
function()
>>> "hello world".log()
Logged string: hello world
>>> new String("hello world").log()
Logged string: hello world

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

>>> typeof("a")
"string"
>>> typeof(new String("a"))
"object"

Мы также можем заметить, что когда this является строкой, это всегда форма объекта:

>>> var identity = function() { return this }
>>> identity.call("a")
String { 0="a"}
>>> identity.call(new String("a"))
String { 0="a"}

Пройдя немного дальше, мы можем увидеть, что не Строковое представление объекта не поддерживает никаких дополнительных свойств, но строка объекта поддерживает:

>>> var a = "a"
>>> var b = new String("b")
>>> a.bar = 4
4
>>> b.bar = 4
4
>>> a.bar
undefined
>>> b.bar
4

Кроме того, забавный факт! Вы можете превратить строковый объект в строку, не являющуюся объектом, с помощью функции toString () :

>>> new String("foo").toString()
"foo"

Никогда не думал, что может быть полезно вызвать String.toString () ! В любом случае.

Итак, все эти эксперименты вызывают вопрос: почему в JavaScript есть два типа строк?


Комментарии показывают, что это также относится к каждому примитивному типу JavaScript (включая числа и логические символы). различия в реализации и изменение расписания (различается ли оно?) Я запускал strace в двух похожих программах, в одной ...

В чем основное различие между pthread и fork по отношению к linux с точки зрения различия в реализации и изменение расписания (различается ли оно?)

Я запускал strace в двух похожих программах, одна с использованием pthreads, а другая с использованием fork, оба в конце делают системный вызов clone () с разными аргументами, поэтому я предполагаю эти два по существу одинаковы в системе Linux, но с pthreads проще для обработки в коде.

Может кто-нибудь дать подробное объяснение?

РЕДАКТИРОВАТЬ: см. также связанный вопрос

33
задан Community 23 May 2017 в 11:54
поделиться