Может кто-нибудь объяснить мне, почему этот код возвращает 1 - PullRequest
0 голосов
/ 24 сентября 2018

Почему этот код возвращает 1, метод toString даже нигде не вызывается, оператор + должен превратить свой операнд в число, но я попробовал это и возвратил NaN

+{} // NaN
+{a: 2} //NaN

, так почему этот код возвращает 1 ????

+({x:+null , y : +'001' , toString : function(){return this.x+this.y;}})

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Когда выражение использует нечисловое значение таким образом, чтобы оно было числом, оно сначала преобразуется в эквивалент примитивного значения.Затем примитивное значение приводится к числу.

Шаги, выполняемые интерпретатором JavaScript, следующие:

  1. Вызовите valueOf и, если возможно, преобразуйте его в число..
  2. Вызовите toString, и если возвращаемое значение является примитивным, преобразуйте его в число, если это возможно.
  3. Бросок TypeError.

Inв вашем случае, поскольку вы используете унарный оператор + с нечисловым объектом, а унарный оператор + определен только для чисел, эти шаги предпринимаются.У вашего объекта нет valueOf, но у него есть метод toString, поэтому возвращаемое значение toString, приведенное к числу, используется для оценки выражения.

Отлично у Кайла Симпсона Вы не знаете, JS: Типы и грамматика содержит больше информации о принуждении типов, если вы хотите продолжить изучение.

0 голосов
/ 24 сентября 2018

+ ({x: + null, y: + '001', toString: function () {return this.x + this.y;}})

Выперегрузка toString, какая функция возвращает (+null+'001')

+ null приводит к нулю 0;

+ '001' приводит строку к 1

, вы возвращаете 1 из toString.

В предыдущих случаях результатом не перегруженного метода toString литерала объекта является "[object Object]", который приводит к числу, дает NaN.

Единственное, что здесь имеет значение, это то, чтоtoString, перегруженный или нет, возвращает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...