1.在《JavaScript高级程序设计》第三版的第23页,作者有很明确的描述:
ECMAScript中有5种简单数据类型(Undefined,Null,Boolean,Number,String),一种复杂类型(Object)
2.在JavaScript秘密花园的对象部分,也有很明确的描述:
JavaScript 中所有变量都是对象,除了两个例外 null 和 undefined
所以我的问题是:
1.var bol = true; var num = 1; var str = 'abc'
,其中的bol,num,str
到底是对象还是基本类型?
2.JavaScript中声明了一个基本类型,到底有没有调用相应包装类型的构造器?
下面是我做的测试,大神可忽略:
var num = 1;
var numObj = new Number(1);
console.log(num instanceof Number); // false
console.log(num.constructor); // Number
console.log(numObj instanceof Number); // true
console.log(numObj.constructor); // Number
var bol = true;
var bolObj = new Boolean(true);
console.log(bol instanceof Boolean); // false
console.log(bol.constructor); // Boolean
console.log(bolObj instanceof Boolean); // true
console.log(bolObj.constructor); // Boolean
var str = "abc";
var strObj = new String("abc");
console.log(str instanceof String); // false
console.log(str.constructor); // String
console.log(strObj instanceof String); // true
console.log(strObj.constructor); // String
测试中有很疑惑的地方:基本类型的值,它们虽然不是相应包装类型的实例,但是constructor
却指向相应的包装类型。。
《秘》里说所有变量都是对象这种说法是值得怀疑的
简单基本类型(string,boolean,number,null,undefined)本身并不是对象
num是基本类型number,不是object
从下面你的代码也可以看出
所以第一个问题
但为何
其实num背后默认调用Number构造器构造了一个Number包装类型(这个包装类型其实和Java那一套很像,只不过JS的包装类型是通过调用构造函数Number来完成的),从而让num成为了一个对象,也就有了上面的情况
第二个问题
基本类型
没有,只有在表达式中用作对象时,才会自动包装
他们都是基本类型,却可以使用对应对象类的构造函数原型链中的函数。
这个算是一种语法吧。