Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Добавляет ответ на Вопрос для собеседования: Значение какого типа возвращает оператор typeof и почему? #5134

Merged

Conversation

alexafcode
Copy link
Contributor

Добавляет ответ на Вопрос для собеседования: Значение какого типа возвращает оператор typeof и почему?

Описание

Closes #5065

Чек-лист

  • Текст оформлен согласно руководству по стилю
  • Ссылки на внутренние материалы начинаются со слеша и заканчиваются слэшем либо якорем на заголовок (/css/color/, /tools/json/, /tools/gulp/#kak-ponyat)
  • Ссылки на картинки, видео и демки относительные (images/example.png, demos/example/, ../demos/example/)

Copy link
Member

@HellSquirrel HellSquirrel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Отлично, спасибо :)

@vitya-ne
Copy link
Contributor

vitya-ne commented Jan 27, 2024

Привет,
мне кажется в постановке вопроса Значение какого типа возвращает оператор typeof и почему? скрывается западня:
буквальным правильным ответом является только:
string, потому что так работу оператора typeof определяет спецификация.

Возможно более коректным был бы вопрос: Что возвращает оператор typeof?

@solarrust solarrust added the собеседование Контент для На собеседовании label Jan 29, 2024
@alexafcode
Copy link
Contributor Author

Я думаю, что нормальная постановка, т.к. в начале сказано, что возвращает строку, а далее идет уточнение.

@skorobaeus
Copy link
Member

@HellSquirrel что думаешь? Мерджим?

@gvozdenkov
Copy link
Contributor

@vitya-ne Да, совершенно верно - вопрос с западнёй. Потому что многие думают, что typeof возвращает тип, а это даже близко не так. Это отсылка к более глубокому пониманию, как js работает внутри

@vitya-ne
Copy link
Contributor

vitya-ne commented Feb 2, 2024

Потому что многие думают, что typeof возвращает тип, а это даже близко не так. Это отсылка к более глубокому пониманию, как js работает внутри

Я бы ещё добавил описание для не очень очевидного поведения при использовании new:
MDN

const str1 = new String('я строка')
const str2 = String('я тоже строка')

console.log(typeof str1)
// object
console.log(typeof str2)
// string

@alexafcode, @gvozdenkov, @HellSquirrel, @skorobaeus что думаете ?

@alexafcode
Copy link
Contributor Author

Добавил важный момент с работой через new

Copy link

github-actions bot commented Feb 5, 2024

Превью контента из a63e2a8 опубликовано.

@gvozdenkov
Copy link
Contributor

gvozdenkov commented Feb 12, 2024

Потому что многие думают, что typeof возвращает тип, а это даже близко не так. Это отсылка к более глубокому пониманию, как js работает внутри

Я бы ещё добавил описание для не очень очевидного поведения при использовании new: MDN

const str1 = new String('я строка')
const str2 = String('я тоже строка')

console.log(typeof str1)
// object
console.log(typeof str2)
// string

@alexafcode, @gvozdenkov, @HellSquirrel, @skorobaeus что думаете ?

Кажется, что это слишком экзотический и не жизненный пример... Никто строку не создаёт ни одним из этих способов. Пример забавный, но уж слишком теоретический. По мне, важнее дать отсылку на спецификацию, и то, что typeof возвращает строку тупо по таблице соответствия. Чтобы не наводить новичков на мысли, что js очень нелогичный и мистический язык%}

Я бы лучше предложил раскрыть тему про https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor

Это, на мой взгляд, куда более крутая альтернатива, чем typeof.

  1. Он покажет точное различие, где массив, а где объект
  2. Он быстрее по производительности

@vitya-ne
Copy link
Contributor

@gvozdenkov

Я бы лучше предложил раскрыть тему про https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor

Это, на мой взгляд, куда более крутая альтернатива, чем typeof.

Это вообще не альтернатива. А метод Object.
Для значений null и undefined - приведёт к ошибке.
Для примитивных значений (напрмер: 25, 'строка', true) приведёт к неверному сравнению.
(см. примеры: #5134 (comment))

Если необходимо сравненивать типы, то можно использовать instanseof

@gvozdenkov
Copy link
Contributor

gvozdenkov commented Feb 16, 2024

@gvozdenkov

Я бы лучше предложил раскрыть тему про https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor
Это, на мой взгляд, куда более крутая альтернатива, чем typeof.

Это вообще не альтернатива. А метод Object. Для значений null и undefined - приведёт к ошибке. Для примитивных значений (напрмер: 25, 'строка', true) приведёт к неверному сравнению. (см. примеры: #5134 (comment))

Если необходимо сравненивать типы, то можно использовать instanseof

Да нет, всё отлично показывает что есть что:

var x = 25;
x.constructor // Number

var str = 'hello'
str.constuctor // String

var bool = true;
bool.constructor // Boolean

Для значений null и undefined - приведёт к ошибке.

Потому что не надо смешивать понятия. Мы проверяем тип (какой конструктор создал объект) или вообще факт существования значения?

var x;

if (x && x.constructor === Number) {
   console.log(x); // ничего не выведено
}

x = 25;

if (x && x.constructor === Number) {
   console.log(x); // 25
}

@vitya-ne
Copy link
Contributor

var x = 25;
x.constructor // Number

Повторюсь ещё раз.
x.constructor сначала оборачивает примитивное значение обёрткой. для чисел этой обёрткой будет Number.
Этот механизм называется Auto-boxing.
А уж потом присходит обращение к свойству объекта Number.
А у самого примитивного значения x нет никаких методов.

@gvozdenkov
Copy link
Contributor

var x = 25;
x.constructor // Number

Повторюсь ещё раз. x.constructor сначала оборачивает примитивное значение обёрткой. для чисел этой обёрткой будет Number. Этот механизм называется Auto-boxing. А уж потом присходит обращение к свойству объекта Number. А у самого примитивного значения x нет никаких методов.

Хорошо, вопрос - как у "примитивного" значения могут быть методы?

var str = 'hello';
str.slice(1); // "ello"

Этот механизм называется Auto-boxing

Можешь ссылку на этот механизм дать? В спеке и в материалах про V8 я ничего про это не нашёл

@vitya-ne
Copy link
Contributor

vitya-ne commented Feb 16, 2024

Хорошо, вопрос - как у "примитивного" значения могут быть методы?

Никак.
Нет у примитивных значений методов и свойств. Потому что они примитивные значения, а не объекты

var str = 'hello';
str.slice(1); // "ello"
Можешь ссылку на этот механизм дать? В спеке и в материалах про V8 я ничего про это не нашёл

MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object#object_coercion
спека: https://tc39.es/ecma262/multipage/abstract-operations.html#sec-toobject

@HellSquirrel
Copy link
Member

Очень интересная дискуссия. Вы молодцы :) PRчик сейчас помержим
По поводу примеров с new String и String: мне кажется самое простое это посмотреть на типы
Первый будет : JS_PRIMITIVE_WRAPPER_TYPE
Второй: INTERNALIZED_STRING_TYPE
Почекать так: node --allow-native-syntax и дальше %DebugPrint каждому

@HellSquirrel HellSquirrel merged commit 72408be into doka-guide:main Mar 7, 2024
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
собеседование Контент для На собеседовании
Projects
None yet
6 participants