Вопрос об исключении TypeError в JavaScript - PullRequest
3 голосов
/ 01 февраля 2011

У меня 3 вопроса. Спасибо!

Первый вопрос:

Когда коды JavaScript вызовут исключение «TypeError»?

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

У меня есть коды ниже:

<!DOCTYPE html>
<meta charset="utf-8">
<title>An HTML5 document</title>
<script>
    var str = 'abc'; // str's type is string, not object

    // Syntax: Object.getPrototypeOf(object)
    alert(Object.getPrototypeOf(str)); // Uncaught TypeError: Object.getPrototypeOf called on non-object

    // Syntax: prototype.isPrototypeOf(object)
    if (Object.prototype.isPrototypeOf(str)) { // false
        alert('true');
    } else {
        alert('false');
    }
</script>

Метод getPrototypeOf() и isPrototypeOf() оба нуждаются в параметре, тип которого должен быть объектом. И тип str является строкой.

Почему метод getPrototypeOf вызывает исключение TypeError, а метод isPrototypeOf не выдает никаких ошибок?

Если тип str является объектом (var str = new String('abc')), результат Object.prototype.isPrototypeOf(str) будет true. Но результат кодов выше false. Почему str не преобразуется из строки в объект автоматически, если он используется в качестве параметра isPrototypeOf метода?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 февраля 2011
  1. Взгляните на первый удар для "TypeError mdc" . Когда он выдает ошибку типа, зависит от спецификации и от пользователя.

Другой отвечает на конкретный вопрос.

0 голосов
/ 01 февраля 2011

Моя теория состоит в том, что isPrototypeOf вроде как брат оператора instanceof, поэтому они действительно должны иметь одинаковую базовую семантику.Также новые функции в ECMAScript 5 имеют тенденцию быть немного более строгими по сравнению с функциями в более старых выпусках.Вот используемые алгоритмы.

<strong>15.2.3.2  Object.getPrototypeOf ( O )</strong> 

When the getPrototypeOf function is called with argument O, 
the following steps are taken: 

1.  If Type(O) is not Object throw a TypeError exception. 
2.  Return the value of the [[Prototype]] internal property of O. 

<strong>15.2.4.6  Object.prototype.isPrototypeOf (V)</strong> 

When the isPrototypeOf method is called with argument V, 
the following steps are taken: 

1.  If V is not an object, return false. 
2.  Let O be the result of calling ToObject passing the this value as 
    the argument.  
3.  Repeat 
  a.  Let V be the value of the [[Prototype]] internal property of V. 
  b.  if V is null, return false 
  c.  If O and V refer to the same object, return true. 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...