为什么console.log(typeof eleInner); 得到的值是string,
但是console.log(eleInner instanceof String);得到的值却是false
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<p>HelloWorld</p>
<script type="text/javascript">
var eleP = document.querySelector("p");
var eleInner = eleP.innerHTML;
console.log(typeof eleInner); //string
console.log(eleInner instanceof String); //false
</script>
</body>
</html>
在Java中这样得到的值是true:
String str = "HelloWorld";
System.out.println(str instanceof String); //true
楼主应该是学了java的吧,但是在js中,字符串类型是string,和java的是不一样的,java里面String大写首字母是因为它并不是一个基本数据类型
instanceof需要用new String生成的对象才是true,直接字面量赋值是false
var s=new String('aaa');
console.log(typeof s);//object
console.log(typeof s.valueOf());//string
console.log(s instanceof String)//true
instanceof 运算符是检测对象的类型,被检测的只能是对象。
但在js中严格来说正常的数值,字符串,布尔值都不属于对象。用instanceof自然检测不出。
只有当数值或字符串用点(.)调用方法或属性时(如:"abc".toUpperCase() )才临时的把数值或字符串包装成一个对象来访问方法或属性。
在访问完方法或属性之后,这个临时包装成的对象就会立即销毁。这也就是数值、字符串不能保存自定义属性的原因。
只有显示的用new String()创建String对象才是一个真正的对象。才能用instanceof 检测对象的类型,和保存自定义属性。
在JavaScript中,数据类型都是用小写来表明的,比如:
var num = 100;
console.log(typeof num);
得到将是小写的number
var str = "HelloWorld";
console.log(typeof str);
得到的将是小写的string
而string与String是不同的,string是一个数据类型的关键字,而String则是一个函数名,如:
console.log(String);
得到的将是function String(){}
String
的含义
var str=new String('s')
str 是一个String
对象new
创建字符串的时候,String
做为构造函数至于typeof
输出的小写string
,在这里只是一种标识而已,规范里定义了字符串的Type
为小写string
,typeof
输出的是一个字符串,两边是带引号的.
'str' instanceof String
的结果输出为false
,是因为规范定义的instanceof
在计算的时候,有一步会判断GetValue('str')
是不是为Object
,如果不是Object
会返回false
,至于GetValue
是什么鬼,看后面的参考文章,或者去解读规范吧.
参考