js instanceof

 var a = "hello"
 a instanceof String ===> false

 var a = new String("hello")
 a instanceof String ====> true

 var b = [1,2]
 b instanceof Array ===>  true

 var b = new Array(1,2)
 b instanceof Array ===> true

为什么String 的两次结果是不一样的,而Array是一样的

阅读 2.2k
2 个回答

"hello"是基本类型,new String("hello")是对象。

  • typeof操作符可以判断出number、boolean、string、function和undefined;( typeof 是一个操作符,主要的目的是检测一个变量是不是基本数据类型的变量,同时也可以说是确定一个变量是字符串,数值,布尔值,还是undefined的最佳工具。但 typeof null == 'object')

  • instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。(基本类型不在链上,所以不适合检测基本类型(都是false))

  • 其实typeof和instanceof的目的都是检测变量的类型,两个的区别在于typeof一般是检测的是基本数据类型,instanceof主要检测的是引用类型!

> toString.call(a)
'[object Number]'
> toString.call(1)
'[object Number]'

> var a= 1
> a.__proto__
[Number: 0]
> var b = new Number(1)

> typeof a
'number'
> typeof b
'object'
> a instanceof Number
false
> b instanceof Number
true
> a.__proto__ === b.__proto__
true
  1. instanceof String
    第一种没有原型链,undefined,所以是false。通过 new String()创造的是一个对象。

  2. instanceof Array
    两个都是数组对象。

  3. 关于基本数据类型的属性读取
    在《JavaScript高级程序设计》中基本包装类型部分有详细的介绍,并且也对下面这两种不同方式有介绍。

var value = "25";
var obj = new Number(25);

针对在评论中的内容,摘录此部分:

而在读取模式中访问字符串时,后台都会自动完成下列处理。
(1) 创建 String 类型的一个实例;
(2) 在实例上调用指定的方法;
(3) 销毁这个实例。
可以将以上三个步骤想象成是执行了下列 ECMAScript 代码。
var s1 = new String("hello");
var constructor = s1.constructor;
s1 = null;
经过此番处理,基本的字符串值就变得跟对象一样了。而且,上面这三个步骤也分别适用于 Boolean和 Number 类型对应的布尔值和数字值。

instanceof
这个链接里例子部分有string的例子。
string创建
这个链接里有别人回答的字符串创建的方式。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题