首页 > 其他分享 >typeof 主要用于检测基本数据类型,对于引用类型不大适用(因为所有引用类型的值都是 Object 的实例),只能知道是对象,而具体是什么类型的对象却无法判断。这时需要 instanceof 来判断

typeof 主要用于检测基本数据类型,对于引用类型不大适用(因为所有引用类型的值都是 Object 的实例),只能知道是对象,而具体是什么类型的对象却无法判断。这时需要 instanceof 来判断

时间:2023-11-16 12:55:05浏览次数:34  
标签:instanceof String 对象 Object typeof 类型

下面哪些语句可以 在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

标签:instanceof,String,对象,Object,typeof,类型
From: https://www.cnblogs.com/longmo666/p/17835981.html

相关文章

  • 首先Function的显示原型prototype和隐式原型__proto__都是同一个 也就是说 构造函数和
    下列说法正确的是()A每个JS对象一定对应一个原型对象,并从原型对象继承属性和方法B对象的__proto__指向自己构造函数的prototypeCObject.prototype.proto===null,说明原型链到Object.prototype终止D表达式Function.prototype.proto.proto===null的运行结果为true正确......
  • Spring5学习随笔-IOC(反转控制)、DI(依赖注入)和创建复杂对象
    学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】第七章、反转控制与依赖注入1.反转(转移)控制(IOCinverseofControl)控制:对于成员变量赋值的控制权反转控制:把对于成员变量赋值的控制权,从代码......
  • Python类对象:属性、继承与多继承
    在Python中,类是创建对象的蓝图。类定义了如何创建对象,并决定了这些对象的属性和行为。本博客将深入探讨Python类对象的属性、继承以及多继承。属性属性是类的特性,它定义了对象的状态。每个对象都有其自己的属性副本。python复制代码classPerson:def__init__(self,name,a......
  • DSP28335数据类型 作结构体定义时要注意
     在28335中,做一个结构体定义,当结构体中成员类型  都是int16U int16S  char 等占用两个字节的内存时,结构体各个成员类型的地址是连续的。做一个结构体定义,当结构体中成员类型  既有int16U int16S  char 等占用两个字节的,又有占用4字节的,比如long类型......
  • 基于ABP的AppUser对象扩展
     在ABP中AppUser表的数据字段是有限的,现在有个场景是和老系统用户对接,需要在AppUser表中添加一个UId和IMId字段。本文以AppUser表扩展UId和IMId字段为例进行介绍。一.在Abp默认解决方案Test.Identity.EntityFrameworkCore更改IdentityEfCoreEntityExtensionMappings类,该操作......
  • 简单例子理解 Qt 中 QObject: Cannot create children for a parent that is in a dif
    c++guiprogrammingwithqt中关于QThread的用法的限制下面这句话的翻译不清QObjectisreentrant,buttherearethreeconstraintstokeepinmind:ChildQObjectsmustbecreatedintheirparent'sthread.Inparticular,thismeansthattheobjectscreatedina......
  • Object的原型没有实现Symbol.iterator所以不算做可迭代对象。
    以下哪些对象是Javascript内置的可迭代对象?AArrayBMapCStringDObject正确答案:ABCES6规定,默认的Iterator接口部署在数据结构的Symbol.iterator属性,或者说,一个数据结构只要具有Symbol.iterator属性,就可以认为是“可遍历的”(iterable)。原生具备Iterator接口的数据结......
  • instanceof 在跨 frame 对象构建的场景下会失效
    如何判断一个js对象是否是Array,arr为要判断的对象,下面最准确的方法是?Atypeof(arr)BarrinstanceofArrayCarr.toString==='[objectArray]';DObject.prototype.toString.call(arr)==='[objectArray]';正确答案:D解析看这里:http://www.nowamagic.net/librarys/veda/de......
  • 当作为一个构造函数(带有运算符 new)调用时,Boolean() 将把它的参数转换成一个布尔值,并且
    使用Boolean(value)方法可以强制转换任意值为boolean类型,除了以下六个值,其他都是自动转为true:undefinednull-0+0NaN‘’(空字符串)Boolean(undefined)//falseBoolean(null)//falseBoolean(0)//falseBoolean(NaN)//falseBoolean('')//false使用场景constarr......
  • symbol对象不能用于数据运算,包括+、-、*、/
    执行以下程序,会抛出语法错误的式子是()vars=Symbol('key');...①console.log(s+'123');...②varobj={[s]:function(){console.log(1);}...③}varb=Reflect.ownKeys(obj);...④A①B②C③D④正确答案:BSymbol是不完整的构造函数,创建symbol对象时不......