innerHTML属性的返回值类型是String类型吗?

为什么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是什么鬼,看后面的参考文章,或者去解读规范吧.


参考