在JavaScript的世界里,一切都是对象
但是某些对象还是和其他对象不太一样。为了区分对象的类型,我们用typeof操作符获取对象的类型,它总是返回一个字符串:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
typeof 123; // 'number' typeof NaN; // 'number' typeof 'str'; // 'string' typeof true; // 'boolean' typeof undefined; // 'undefined' typeof Math.abs; // 'function' typeof null; // 'object' typeof []; // 'object' typeof {}; // 'object' 可见,number、string、boolean、function和undefined有别于其他类型。特别注意null的类型是object,Array的类型也是object,如果我们用typeof将无法区分出null、Array和通常意义上的object——{}。
包装对象
除了这些类型外,JavaScript还提供了包装对象
number、boolean和string都有包装对象。没错,在JavaScript中,字符串也区分string类型和它的包装类型。包装对象用new创建:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
var n = new Number(123); // 123,生成了新的包装类型 var b = new Boolean(true); // true,生成了新的包装类型 var s = new String('str'); // 'str',生成了新的包装类型 虽然包装对象看上去和原来的值一模一样,显示出来也是一模一样,但他们的类型已经变为object了!所以,包装对象和原始值用===比较会返回false: typeof new Number(123); // 'object' new Number(123) === 123; // false typeof new Boolean(true); // 'object' new Boolean(true) === true; // false typeof new String('str'); // 'object' new String('str') === 'str'; // false 所以闲的蛋疼也不要使用包装对象!尤其是针对string类型!!! 如果我们不写new,此时,Number()、Boolean和String()被当做普通函数,把任何类型的数据转换为number、boolean和string类型(注意不是其包装类型): var n = Number('123'); // 123,相当于parseInt()或parseFloat() typeof n; // 'number' var b = Boolean('true'); // true typeof b; // 'boolean' var b2 = Boolean('false'); // true! 'false'字符串转换结果为true!因为它是非空字符串! var b3 = Boolean(''); // false var s = String(123.45); // '123.45' typeof s; // 'string'
总结一下,有这么几条规则需要遵守:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
总结一下,有这么几条规则需要遵守: 不要使用new Number()、new Boolean()、new String()创建包装对象; 用parseInt()或parseFloat()来转换任意类型到number; 用String()来转换任意类型到string,或者直接调用某个对象的toString()方法; 通常不必把任意类型转换为boolean再判断,因为可以直接写if (myVar) {...}; typeof操作符可以判断出number、boolean、string、function和undefined; 判断Array要使用Array.isArray(arr); 判断null请使用myVar === null; 判断某个全局变量是否存在用typeof window.myVar === 'undefined'; 函数内部判断某个变量是否存在用typeof myVar === 'undefined'。 最后有细心的同学指出,任何对象都有toString()方法吗?null和undefined就没有!确实如此,这两个特殊值要除外,虽然null还伪装成了object类型。 更细心的同学指出,number对象调用toString()报SyntaxError: 123.toString(); // SyntaxError 遇到这种情况,要特殊处理一下: 123..toString(); // '123', 注意是两个点! (123).toString(); // '123'
在JavaScript中,Date对象用来表示日期和时间。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
var now = new Date(); now; // Wed Jun 24 2015 19:49:22 GMT+0800 (CST) now.getFullYear(); // 2015, 年份 now.getMonth(); // 5, 月份,注意月份范围是0~11,5表示六月 now.getDate(); // 24, 表示24号 now.getDay(); // 3, 表示星期三 now.getHours(); // 19, 24小时制 now.getMinutes(); // 49, 分钟 now.getSeconds(); // 22, 秒 now.getMilliseconds(); // 875, 毫秒数 now.getTime(); // 1435146562875, 以number形式表示的时间戳 注意,当前时间是浏览器从本机操作系统获取的时间,所以不一定准确,因为用户可以把当前时间设定为任何值。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
创建一个指定日期和时间的Date对象,可以用: var d = new Date(2015, 5, 19, 20, 15, 30, 123); d; // Fri Jun 19 2015 20:15:30 GMT+0800 (CST) JavaScript的Date对象月份值从0开始,牢记0=1月,1=2月,2=3月,……,11=12月。 第二种创建一个指定日期和时间的方法是解析一个符合ISO 8601格式的字符串: var d = Date.parse('2015-06-24T19:49:22.875+08:00'); d; // 1435146562875 但它返回的不是Date对象,而是一个时间戳。不过有时间戳就可以很容易地把它转换为一个Date: var d = new Date(1435146562875); d; // Wed Jun 24 2015 19:49:22 GMT+0800 (CST) d.getMonth(); // 5 使用Date.parse()时传入的字符串使用实际月份01~12,转换为Date对象后getMonth()获取的月份值为0~11。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Date对象表示的时间总是按浏览器所在时区显示的,不过我们既可以显示本地时间,也可以显示调整后的UTC时间: var d = new Date(1435146562875); d.toLocaleString(); // '2015/6/24 下午7:49:22',本地时间(北京时区+8:00),显示的字符串与操作系统设定的格式有关 d.toUTCString(); // 'Wed, 24 Jun 2015 11:49:22 GMT',UTC时间,与本地时间相差8小时 获取当前时间戳: if (Date.now) { console.log(Date.now()); // 老版本IE没有now()方法 } else { console.log(new Date().getTime()); }