Мне кажется вы не правы.
«Строгая типизация подразумевает выполнение следующих обязательных условий:
1. Любой объект данных (переменная, константа, выражение) в языке всегда имеет строго определённый тип, который фиксируется на момент компиляции программы (статическая типизация) или определяется во время выполнения (динамическая типизация).
2. Допускается присваивание переменной только значения, имеющего строго тот же тип данных, что и переменная, те же ограничения действуют в отношении передачи параметров и возврата результатов функций.
3. Каждая операция требует параметров строго определённых типов.
4. Неявное преобразование типов не допускается (то есть транслятор воспринимает любую попытку использовать значение не того типа, который был описан для переменной, параметра, функции или операции, как синтаксическую ошибку).»
Следовательно для нестрогой типизации(о которой я говорю в статье) действуют обратные принципы(которые я и описал в статье). В чем моя ошибка или не точность? Я не понимаю.
Нет, я хотел эти сказать, что моя формулировка о которой вы написали в первом своем комментарии верна. Или вы не утверждали что она ошибочна и я вас не так понял?!
Динами́ческая типиза́ция — приём, широко используемый в языках программирования и языках спецификации, при котором переменная связывается с типом в момент присваивания значения, а не в момент объявления переменной. Таким образом, в различных участках программы одна и та же переменная может принимать значения разных типов. Примеры языков, где есть динамическая типизация — Smalltalk, Python, Objective-C, C#, Ruby, PHP, Perl, JavaScript, Lisp, xBase. ru.wikipedia.org/wiki/%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%82%D0%B8%D0%BF%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F
> Object(Number(<примитив>))
Это что за шутки? Вы бы сперва с излагаемым материалом разобрались, в то вы мне напоминаете некоторых преподавателей из моего университета.
new Number наследует свойства Object только потому, что второй существует в цепочке родителей первого:
Отлично — я с вами согласен. Нельзя ли следуя из вашего замечания говорить, что условно получается такая вот «матрёшка» как я сказал?!? Постарайтесь понять, что я писал эту статью не только для таких молодцов как вы, знающих уже все нюансы, но и для тех кто только начал. Я не хотел перегружать информацией первую статью(а это будет цикл) и в некоторых моментах просто абстрагировался для более простого понимания. В дальнейших статьях я конечно расскажу и про наследования и про прототипы и про конструкторы.
И что вас собственно смутило в словосочетании «типы данных» в JS?!?
> Значением может быть любой из типов данных — тогда это будет свойство объекта, или даже функция — тогда это будет метод объекта.
Не функция, а ссылка на функцию. С объектами то же самое.
Вопрос собственно тот же: «Зачем пока на данном этапе это, если далее я более подробно опишу как устроен объект и конструкторы их создающие?»
«instanceof проверяет, есть ли в цепочке родителей соответствующий конструктор»
как вы думаете, если бы я так объяснил в первой статье, не появилось бы у новичка больше вопросов чем ответов??? И почему вы не прочитали следующую за этой фразу «Как он это делает, я расскажу в следующей статье»?
По поводу фразы:«Они есть для всех примитивов (Number(), Boolean(), String(), Object())» — я действительно увлекся. Есть много конструкторов среди которых и выше перечисленные, но Object(), конечно же не имеет никакого отношения к конструкторам примитивов — он действительно вернет объект.Исправлю.
Да как угодно. Это не суть важно. Кому как проще для понимания. Вы кстати заметили — уже начинается философия вокруг этих двух понятий )). Это же не принципиально, к чему такие комментарии?
— 12. toString(); //число не станет переменной но его уже можно использовать как объект
Тут ошибка!
А в чем если не секрет?
— v4 = String(2); //строковая глобальная переменная вызванная через конструктор. Создаст переменную window.v4
Не глобальная переменная, а свойство глобального объекта (window как частный случай глобального объекта).
Я пока не старался настолько влезать в тонкости, хотя вы и правы. Но в простонародье на данном уровне статьи, формально можно сказать что это глобальная переменная
— На самом деле, забегая наперёд, во время оборачивания примитива в объект, выстраивается целая цепочка наследования (как это организовано мы поговорим позже), но по сути получается такая вот «матрёшка»:
Object(Number(<примитив>)).
Не будет такой матрешки не вводите в заблуждение! Посмотрите в спецификации.
Number(param) — возвращает числовое примитивное значение соответствующее переданному значению.
Object(param) — возвращает объектное представление соответствующее переданному параметру (Встроенная фабрика), если передан объект то он просто возвращается.
Матрёшка будет, поскольку «оборачивание» происходит с помощью вызова конструктора через new и это приведет к созданию объекта, который в свою очередь будут унаследованы от Object. А вот то что вы говорите произойдет если вызов будет без new — тогда и вправду вернется примитив.
Да, согласен. Хороший совет. Действительно, если планируется частый вызов методов, то не стоит постоянно нагружать интерпретатор созданием обёртки. И наоборот, если нужно хранить только строку или число, которое потом просто будет выводится на экран, то стоит сделать это исключительно примитивом. Спасибо!
«Строгая типизация подразумевает выполнение следующих обязательных условий:
1. Любой объект данных (переменная, константа, выражение) в языке всегда имеет строго определённый тип, который фиксируется на момент компиляции программы (статическая типизация) или определяется во время выполнения (динамическая типизация).
2. Допускается присваивание переменной только значения, имеющего строго тот же тип данных, что и переменная, те же ограничения действуют в отношении передачи параметров и возврата результатов функций.
3. Каждая операция требует параметров строго определённых типов.
4. Неявное преобразование типов не допускается (то есть транслятор воспринимает любую попытку использовать значение не того типа, который был описан для переменной, параметра, функции или операции, как синтаксическую ошибку).»
Следовательно для нестрогой типизации(о которой я говорю в статье) действуют обратные принципы(которые я и описал в статье). В чем моя ошибка или не точность? Я не понимаю.
ru.wikipedia.org/wiki/%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%82%D0%B8%D0%BF%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F
Это что за шутки? Вы бы сперва с излагаемым материалом разобрались, в то вы мне напоминаете некоторых преподавателей из моего университета.
new Number наследует свойства Object только потому, что второй существует в цепочке родителей первого:
Отлично — я с вами согласен. Нельзя ли следуя из вашего замечания говорить, что условно получается такая вот «матрёшка» как я сказал?!? Постарайтесь понять, что я писал эту статью не только для таких молодцов как вы, знающих уже все нюансы, но и для тех кто только начал. Я не хотел перегружать информацией первую статью(а это будет цикл) и в некоторых моментах просто абстрагировался для более простого понимания. В дальнейших статьях я конечно расскажу и про наследования и про прототипы и про конструкторы.
И что вас собственно смутило в словосочетании «типы данных» в JS?!?
> Значением может быть любой из типов данных — тогда это будет свойство объекта, или даже функция — тогда это будет метод объекта.
Не функция, а ссылка на функцию. С объектами то же самое.
Вопрос собственно тот же: «Зачем пока на данном этапе это, если далее я более подробно опишу как устроен объект и конструкторы их создающие?»
«instanceof проверяет, есть ли в цепочке родителей соответствующий конструктор»
как вы думаете, если бы я так объяснил в первой статье, не появилось бы у новичка больше вопросов чем ответов??? И почему вы не прочитали следующую за этой фразу «Как он это делает, я расскажу в следующей статье»?
Тут ошибка!
А в чем если не секрет?
— v4 = String(2); //строковая глобальная переменная вызванная через конструктор. Создаст переменную window.v4
Не глобальная переменная, а свойство глобального объекта (window как частный случай глобального объекта).
Я пока не старался настолько влезать в тонкости, хотя вы и правы. Но в простонародье на данном уровне статьи, формально можно сказать что это глобальная переменная
— На самом деле, забегая наперёд, во время оборачивания примитива в объект, выстраивается целая цепочка наследования (как это организовано мы поговорим позже), но по сути получается такая вот «матрёшка»:
Object(Number(<примитив>)).
Не будет такой матрешки не вводите в заблуждение! Посмотрите в спецификации.
Number(param) — возвращает числовое примитивное значение соответствующее переданному значению.
Object(param) — возвращает объектное представление соответствующее переданному параметру (Встроенная фабрика), если передан объект то он просто возвращается.
Матрёшка будет, поскольку «оборачивание» происходит с помощью вызова конструктора через new и это приведет к созданию объекта, который в свою очередь будут унаследованы от Object. А вот то что вы говорите произойдет если вызов будет без new — тогда и вправду вернется примитив.