Зачем использовать toString () для проверки типов аргументов, которые можно проверить с помощью typeof? - PullRequest
9 голосов
/ 01 марта 2012

Я понимаю, почему вам нужно использовать Object.prototype.toString() или String() для массивов проверки типов, но не достаточно typeof для функций проверки типов и строк?Например, полифил в MDN для Array.isArray использует:

Object.prototype.toString.call(arg) == '[object Array]';

Это довольно ясно в случае массивов, потому что вы не можете использовать typeof для проверки массивов. Валентина использует для этого instanceof :

ar instanceof Array

Но для строк / функций / логических значений / чисел, почему бы не использовать typeof?

jQuery и Underscore оба используют что-то подобное для проверки функций:

Object.prototype.toString.call(obj) == '[object Function]';

Разве это не эквивалентно выполнению этого?

typeof obj === 'function'

или даже это?

obj instanceof Function

Ответы [ 2 ]

16 голосов
/ 18 мая 2012

Хорошо, я понял, почему вы видите использование toString.Учтите это:

var toString = Object.prototype.toString;
var strLit = 'example';
var strStr = String('example')​;
var strObj = new String('example');

console.log(typeof strLit); // string    
console.log(typeof strStr); // string
console.log(typeof strObj); // object

console.log(strLit instanceof String); // false
console.log(strStr instanceof String); // false
console.log(strObj instanceof String); // true

console.log(toString.call(strLit)); // [object String]
console.log(toString.call(strStr)); // [object String]
console.log(toString.call(strObj)); // [object String]

1 голос
/ 01 марта 2012

Первая причина, которую я могу придумать, заключается в том, что typeof null возвращает object, что обычно не то, что вам нужно (поскольку null - это не объект, а отдельный тип).

Однако Object.prototype.toString.call(null) возвращает [object Null].

Но, как вы предполагаете, если вы ожидаете, что что-то будет строкой или другим типом, который хорошо работает с typeof, я не вижу причин, почему вы можетене используйте typeof (и я регулярно использую typeof в этом случае).

Еще одна причина, по которой библиотеки, подобные тем, которые вы упоминаете, использует выбранный метод, может быть просто для согласованности.Вы можете использовать typeof для проверки Array, поэтому используйте другой метод и придерживайтесь его повсюду.

Для получения дополнительной информации Angus Croll имеет отличную статью об операторе typeof.

...