JavaScript 标准对象
在JavaScript的世界里,一切都是对象。
但是某些对象还是和其他对象不太一样。为了区分对象的类型,我们用typeof
操作符获取对象的类型,它总是返回一个字符串:
- 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——{}
。
包装对象
number
、boolean
和string
都有包装对象。没错,在JavaScript中,字符串也区分string
类型和它的包装类型。包装对象用new
创建:
- 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
类型!!!
Date
在JavaScript中,Date
对象用来表示日期和时间。
要获取系统当前时间,用:
- 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形式表示的时间戳
注意,当前时间是浏览器从本机操作系统获取的时间,所以不一定准确,因为用户可以把当前时间设定为任何值。
如果要创建一个指定日期和时间的Date
对象,可以用:
- var d = new Date(2015, 5, 19, 20, 15, 30, 123);
你可能观察到了一个非常非常坑爹的地方,就是JavaScript的月份范围用整数表示是0~11,0
表示一月,1
表示二月……,所以要表示6月,我们传入的是5
!这绝对是JavaScript的设计者当时脑抽了一下,但是现在要修复已经不可能了。
第二种创建一个指定日期和时间的方法是解析一个符合ISO 8601格式的字符串:
- var d = Date.parse('2015-06-24T19:49:22.875+08:00');
- d; //
但它返回的不是Date
对象,而是一个时间戳。不过有时间戳就可以很容易地把它转换为一个Date
:
- var d = new Date(1435146562875);
- d; // Wed Jun 24 2015 19:49:22 GMT+0800 (CST)
时区
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小时
那么在JavaScript中如何进行时区转换呢?实际上,只要我们传递的是一个number
类型的时间戳,我们就不用关心时区转换。任何浏览器都可以把一个时间戳正确转换为本地时间。
所以,我们只需要传递时间戳,或者把时间戳从数据库里读出来,再让JavaScript自动转换为当地时间就可以了。
要获取当前时间戳,可以用:
- if (Date.now) {
- alert(Date.now()); // 老版本IE没有now()方法
- } else {
- alert(new Date().getTime());
- }
JSON
在JSON中,一共就这么几种数据类型:
- number:和JavaScript的
number
完全一致; - boolean:就是JavaScript的
true
或false
; - string:就是JavaScript的
string
; - null:就是JavaScript的
null
; - array:就是JavaScript的
Array
表示方式——[]
; - object:就是JavaScript的
{ ... }
表示方式。
以及上面的任意组合。
序列化
让我们先把小明这个对象序列化成JSON格式的字符串:
- var xiaoming = {
- name: '小明',
- age: 14,
- gender: true,
- height: 1.65,
- grade: null,
'middle-school': '\"W3C\" Middle School',- skills: ['JavaScript', 'Java', 'Python', 'Lisp']
- };
使用JSON.stringify()之后:
- JSON.stringify(xiaoming); // '{"name":"小明","age":14,"gender":true,"height":1.65,"grade":null,
"middle-school":"\"W3C\" Middle School","skills":["JavaScript","Java","Python","Lisp"]}'
要输出得好看一些,可以加上参数,按缩进输出:
- JSON.stringify(xiaoming, null, ' ');
结果:
- {
- "name": "小明",
- "age": 14,
- "gender": true,
- "height": 1.65,
- "grade": null,
- "middle-school": "\"W3C\" Middle School",
- "skills": [ "JavaScript", "Java", "Python", "Lisp"
- ]
- }
第二个参数用于控制如何筛选对象的键值,如果我们只想输出指定的属性,可以传入Array
:
- JSON.stringify(xiaoming, ['name', 'skills'], ' ');
结果:
- {
- "name": "小明",
- "skills": [ "JavaScript", "Java", "Python", "Lisp"
- ]
- }
还可以传入一个函数,这样对象的每个键值对都会被函数先处理:
- function convert(key, value) {
- if (typeof value === 'string') {
return value.toUpperCase();- }
return value;- }
- JSON.stringify(xiaoming, convert, ' ');
上面的代码把所有属性值都变成大写:
{
"name": "小明",
"age": 14,
"gender": true,
"height": 1.65,
"grade": null,
"middle-school": "\"W3C\" MIDDLE SCHOOL",
"skills": [ "JAVASCRIPT", "JAVA", "PYTHON", "LISP"
]
}
如果我们还想要精确控制如何序列化小明,可以给xiaoming
定义一个toJSON()
的方法,直接返回JSON应该序列化的数据:
- var xiaoming = {
- name: '小明',
- age: 14,
- gender: true,
- height: 1.65,
- grade: null, 'middle-school': '\"W3C\" Middle School',
- skills: ['JavaScript', 'Java', 'Python', 'Lisp'],
- toJSON: function () {
- return { // 只输出name和age,并且改变了key:
- 'Name': this.name, 'Age': this.age
- };
- }
- };
- JSON.stringify(xiaoming); // '{"Name":"小明","Age":14}'
反序列化
拿到一个JSON格式的字符串,我们直接用JSON.parse()
把它变成一个JavaScript对象:
- JSON.parse('[1,2,3,true]'); // [1, 2, 3, true]
- JSON.parse('{"name":"小明","age":14}'); // Object {name: '小明', age: 14}
- JSON.parse('true'); // true
- JSON.parse('123.45'); // 123.45
JSON.parse()
还可以接收一个函数,用来转换解析出的属性:
- JSON.parse('{"name":"小明","age":14}', function (key, value) {
- // 把number * 2:
- if (key === 'name') {
- return value + '同学';
- }
- return value;
- }); // Object {name: '小明同学', age: 14}
JavaScript 标准对象的更多相关文章
- javascript标准对象与包装对象
javascript标准对象与包装对象 标准对象 在JavaScript的世界里,一切都是对象. 但是某些对象还是和其他对象不太一样.为了区分对象的类型,我们用typeof操作符获取对象的类型,它总是 ...
- JavaScript标准对象
1.Date var now = new Date(); now; // Wed Jun 24 2015 19:49:22 GMT+0800 (CST) now.getFullYear(); // 2 ...
- JavaScript之JSON&AJAX
今天为大家讲解JavaScript中非常流行的数据传输形式JSON和异步技术AJAX技术. 一 JSON JSON的全称是JavaScript Object Notation(js对象表示法),它是一 ...
- HTML5学习笔记(二十):JavaScript中的标准对象
这里提到的标准对象指ECMAScript中定义的对象,无论JavaScript运行那种环境(浏览器.Node.js)下都存在的对象. typeof 在JavaScript的世界里,一切都是对象. 但是 ...
- JavaScript学习04(标准对象)
标准对象 在JavaScript的世界里,一切都是对象. 但是某些对象还是和其他对象不太一样.为了区分对象的类型,我们用 typeof 操作符获取对象的类型,它总是返回一个字符串: typeof 12 ...
- 标准对象 -------JavaScript
本文摘要:http://www.liaoxuefeng.com/ 在JavaScript的世界里,一切都是对象. 但是某些对象还是和其他对象不太一样.为了区分对象的类型,我们用typeof操作符获取对 ...
- javascript学习(五)之标准对象
一.RegExp:正则表达式是一种用来匹配字符串的强有力的武器.它的设计思想是用一种描述性的语言来给字符串定义一个规则, 凡是符合规则的字符串,我们就认为它"匹配"了,否则,该字符 ...
- JavaScript学习笔记(三)——this、原型、javascript面向对象
一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...
- JavaScript学习总结(三)——this、原型、javascript面向对象
一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...
随机推荐
- 前端模块化开发篇之grunt&webpack篇
几个月前写了一篇有关gulp和browserify来做前端构建的博客,因为browserify用来做js的打包时可能有些麻烦(特别是在写React的时候),所以这里再强烈推荐一款js打包工具-webp ...
- 各个平台 如何安装 Ruby 和 RubyGems
原文地址:http://cloudfoundry-doc.csdn.net/frameworks/ruby/installing-ruby.html Last Updated: 2012-11-01 ...
- windows下mysql 控制台操作
windows mysql 控制台操作 1.首先打开cmd进入dos窗口 2.切换至目录: F: cd PHPnow-1.5.6\MySQL-5.0.90\bin 3.进入mysql: mysql - ...
- latin1字符集在navicat下显示乱码(mysql)
用navicat查看一个表的内容时显示如下
- KindEditor编辑器(初始化参数)
width 编辑器的宽度,可以设置px或%,比textarea输入框样式表宽度优先度高. 数据类型: String 默认值: textarea输入框的宽度 示例: K.create('#id', { ...
- 界面编程模仿篇(QQ登录界面逼真篇)
写了好多天的爬虫,偷空前前后后用了两天的时间(排除吃饭睡觉)写完了这个QQ登录界面,看起来还凑和着吧,如果是的大神的,莫见笑,纯属业余作品,废话先不多说,截图如下,其中第二幅图片中的红色方框部份有待完 ...
- easyui在当前tab中直接加载url
var tab = $('#mainTabs').tabs('getSelected'); // get selected panel $('#mainTabs').tabs('update', { ...
- Day 4 @ RSA Conference Asia Pacific & Japan 2016
09.00 – 09.45 hrs Advanced Malware and the Cloud: The New Concept of 'Attack Fan-out' Krishna Naraya ...
- [Node.js] Exporting Modules in Node
In this lesson, you will learn the difference between the exports statement and module.exports. Two ...
- Java中的守护线程 & 非守护线程(简介)
Java中的守护线程 & 非守护线程 守护线程 (Daemon Thread) 非守护线程,又称用户线程(User Thread) 用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守 ...