首页 > 关于javascript中基本数据类型的问题

关于javascript中基本数据类型的问题

var str = "啊啊啊啊";
console.log(str instanceof String); //fasle

str不是一个string对象吗? 因为它也可以调用属性和方法.


https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/instanceof

var str =new String("啊啊啊啊");
这才是一个String对象


这个问题真没有留意,于是查了些资料,后面两篇关于primitive的文章可以好好看看,有帮助

官网instanceof
The Secret Life of JavaScript Primitives
JavaScript values: not everything is an object

这里的结论是:

  1. str是字符串字面量(primitive中的string),它不是对象(object)

  2. instanceof的测试目标是对象(object)

  3. str可以调用String的实例属性或者方法,是因为javascript中在对primitive类型变量访问处理时,会及时的转成对应的包装类(Wrappers)

其他信息:
5中primitives:undefined, null, string, number, boolean (typeof null => 'object'是一个已知的大bug)
其中三种有对应的wrappers: String, Number, Boolean


String的原型是Object,Object比较特殊


上面几位的回答,已经非常清楚的解释了这个问题,另外我推荐你看下,js包装对象:http://www.w3cfuns.com/notes/23931/908d7f91530ac100b3a04a8e1ebabb3c.html。


虽然显示问题已经解决了,但是看了楼上的几个答案, 包括已经被采纳了的那位. 都没有说到重点上.
JavaScript中,数据类型大概分为基本数据类型引用类型, 而引用类型里边又有一种"基本包装类型".大致意思就是,把基本数据类型构造成一个对象. 也就是用Number String Boolean构造函数来创建基本数据类型.或许这么说并不恰当, 还是来看个例子:

var num = new Number();
        num = 5;
        console.log(num.toString());//5

以上例子创建了一个Number基本包装类型, 此时的num已经是一个对象实例,所以才有了诸如toString这些方法和属性. 那么反过来看, 众所周知, 这里即使我不是用new操作符创建对象,而是直接赋值, 那么这个num照样可以调用toString方法.

var num = 5;
        console.log(num.toString());//5

之所以直接赋值能调用toString方法, 是因为解析器在执行到第二行时, 自动地做了一个转换, 将基本数据类型num转换成了一个基本包装类型.也就是说,此时的num是一个对象,而不再是基本数据类型. 而这样的转换, 生存周期只存在于一行代码中, 到了下一行代码, 它又会自动转换成基本数据类型. 再看一个例子:

        var num = 5;
        num.name = "tinycolder";
        console.log(num.name);//undefined
        console.log(num.name = "tinycolder");//tinycolder
        console.log(num.name);//undefined

第一行代码声明了一个基本数据类型变量num.
第二行为num添加了一个name属性. 那么这个属性有没有被添加到num呢? 答案是已经添加进去了!
第三行输出这个属性时显示undefined. 如上所说, 在将基本数据类型转换为基本包装类型时, 只有一行代码的生存 期.
第四行让输出和赋值在一行代码中进行, 此时正确输出num的name属性.
第五行再输出, 又是undefined. 代码生存期只有一行.
以上的实验说明:
基本数据类型能调用方法和属性, 不是因为他们本身是对象, 而是在调用方法和属性的时候自身被自动隐式转换成了一个基本包装类型, 即一个对象.
现在, 理解你题中出现的问题,就很简单啦.


你弄错了,并不是只有引用类型可以调用属性和方法的。5种基本数据类型:Undefined、Null、Boolean、Number 和String,还有1种复杂数据类型Object;通常,我们并不是想知道某个值是对象,而是想知道它是什么类型的对象就用instanceof 操作符,如:colors instanceof Array,引用类型除了Object还有Array、Date、RegExp、Function,这几个可以用instanceof 。

【热门文章】
【热门文章】