"foo" instanceof String //=> false
"foo" instanceof Object //=> false
true instanceof Boolean //=> false
true instanceof Object //=> false
false instanceof Boolean //=> false
false instanceof Object //=> false
// the tests against Object really don't make sense
Литералы массивов и литералы объектов совпадают ...
[0,1] instanceof Array //=> true
{0:1} instanceof Object //=> true
Почему не все из них? Или, почему не все они не ?
И что они представляют собой тогда?
То же самое в FF3, IE7, Opera и Chrome. Так что, по крайней мере, это соответствует.
Пропустил несколько.
12.21 instanceof Number //=> false
/foo/ instanceof RegExp //=> true
javascript
literals
instanceof
Джонатан Лоновски
источник
источник
(new String()).valueOf();
typeof foo === 'string'
этого недостаточно: см. Ответ Axkibe.typeof new String('')
возвращается"object"
Я использую:
Потому что в JavaScript строки могут быть литералами или объектами.
источник
function isString(s) { return s.constructor === String; }
Работает для литералов и строковых объектов (по крайней мере, в V8)typeof
.В JavaScript все является объектом (или, по крайней мере, может рассматриваться как объект), за исключением примитивов (логические, нулевые, числа, строки и значение
undefined
(и символ в ES6)):Как вы можете видеть объекты, массивы и значения
null
являются рассматриваемыми объектами (null
это ссылка на объект, который не существует). Функции различаются, потому что они представляют собой особый тип вызываемых объектов. Однако они все еще являются объектами.С другой стороны, литералы
true
,0
,""
иundefined
не возражает. Это примитивные значения в JavaScript. Однако Booleans, число и строка также имеют конструкторBoolean
,Number
и ,String
соответственно , которые обернут их соответствующие примитивы для обеспечения функциональных возможностей :Как вы можете видеть, когда примитивные значения обертываются внутри
Boolean
,Number
иString
конструкторы соответственно становятся объектами.instanceof
Оператор работает только для объектов (именно поэтому он возвращаетсяfalse
для примитивных значений):Как вы можете видеть, и того,
typeof
и другогоinstanceof
недостаточно, чтобы проверить, является ли значение логическим, число или строка -typeof
работает только для примитивных логических значений, чисел и строк; иinstanceof
не работает для примитивных логических чисел, чисел и строк.К счастью, есть простое решение этой проблемы. Реализация по умолчанию
toString
(т. Е. Как она изначально определенаObject.prototype.toString
) возвращает внутреннее[[Class]]
свойство как примитивных значений, так и объектов:Внутреннее
[[Class]]
свойство значения гораздо полезнее, чемtypeof
значение. Мы можем использоватьObject.prototype.toString
для создания нашей собственной (более полезной) версииtypeof
оператора следующим образом:Надеюсь, эта статья помогла. Чтобы узнать больше о различиях между примитивами и обернутыми объектами, прочитайте следующее сообщение в блоге: Секретная жизнь примитивов JavaScript
источник
null
это тоже примитивное значение (толькоtypeof
оператор сбивает с толку)Вы можете использовать свойство конструктора:
источник
String
иBoolean
в приведенном выше примере, поэтому, если вы тестируетеconstructor
свойство строковой переменной, созданной в другом окне (например, всплывающее окно или фрейм), оно не будет равно простоString
, оно будет быть равнымthatOtherWindowsName.String
.Object.prototype.toString.call('foo') === '[object String]'
d.constructor == String
? Например, с оператором свободного равенства.Вы можете использовать это, это будет работать для обоих случаев, как
var text="foo";
// typeof будет работатьString text= new String("foo");
// instanceof будет работатьисточник
Это определяется в разделе 7.3.19 спецификации ECMAScript. Шаг 3 :
If Type(O) is not Object, return false.
Другими словами, если объект
Obj
inObj instanceof Callable
не является объектом, онinstanceof
будетfalse
напрямую закорочен.источник
Я считаю, что я нашел жизнеспособное решение:
источник
https://www.npmjs.com/package/typeof
Возвращает строковое представление
instanceof
(имя конструктора)источник
Для меня путаница, вызванная
Так
"str" istanceof String
должно вернуться,true
потому что как istanceof работает, как показано ниже:Результаты выражений № 1 и № 2 противоречат друг другу, поэтому один из них должен быть неправильным.
№ 1 не так
Я выяснил, что это вызвано
__proto__
нестандартным свойством, поэтому используйте стандартное:Object.getPrototypeOf
Теперь нет никакой путаницы между выражением № 2 и № 3
источник
Object("str").__proto__
илиObject("str") instanceof String
.Или вы можете просто сделать свою собственную функцию следующим образом:
использование:
Оба должны вернуть истину.
источник