typeof 主要用于检测基本数据类型,对于引用类型不大适用(因为所有引用类型的值都是 Object 的实例),只能知道是对象,而具体是什么类型的对象却无法判断。这时需要 instanceof 来判断到底是什么类型(普通Object类型、Array类型、Function类型、RegExp类型、Date类型,基本包装类型【包括:Boolean、Number、String类型】)的对象

发布时间 2023-11-16 12:50:36作者: 龙陌

下面哪些语句可以 在JS里判断一个对象是否为String类型?

A
oStringObject instanceof String

B
typeof oStringObject == 'string'

C
oStringObject is String

D
以上答案都不正确

正确答案:A

JS 中值的类型分为原始值类型和对象类型。
原始值类型包括 number, string, boolean, null 和 undefined;对象类型即 object。首先原始值类型它就不是对象。
另外,要注意 'hello' 和 new String('hello') 的区别,前者是字符串字面值,属于原始类型,而后者是对象。用 typeof 运算符返回的值也是完全不一样的:

typeof 'hello'; // 'string'
typeof new String('hello'); // 'object'

之所以很多人分不清字符串字面值和 String 对象,归根结底就是 JS 的语法对你们太过纵容了。
当执行 'hello'.length 时,发现可以意料之中的返回 5,你们就觉得 'hello' 就是 String 对象,不然它怎么会有 String 对象的属性。
其实,这是由于 JS 在执行到这条语句的时候,内部将 'hello' 包装成了一个 String 对象,执行完后,再把这个对象丢弃了,这种语法叫做 “装箱”,在其他面向对象语言里也有(如 C#)。
不要认为 JS 帮你装箱了,你就可以在写代码的时候不分箱里箱外了!

  1. oStringObject instanceof String 可以
  2. toString.call(oStringObject )=="[object String]" 可以

var str = new String('haha')
str instanceof String //true
str instanceof Object //true

题意中说的oStringObject是一个对象,所以typeof oStringObject是object

typeof用来检测基本类型, instanceof用来检测复杂类型。 还可以使用object.prototype.toString.call(obj)==[object String]来判断

String也是个对象啊!不是string
注意字符串和字符串对象

typeof 主要用于检测基本数据类型,对于引用类型不大适用(因为所有引用类型的值都是 Object 的实例),只能知道是对象,而具体是什么类型的对象却无法判断。这时需要 instanceof 来判断到底是什么类型(普通Object类型、Array类型、Function类型、RegExp类型、Date类型,基本包装类型【包括:Boolean、Number、String类型】)的对象。

另外值得注意的是:instanceof 操作符是用来检测引用类型的,若用来检测基本类型的值时,则都会返回 false