03标准对象-01-Date和JSON

0、写在前面的话

在JS世界中,一切都是对象,区别对象类型使用tyepof,返回一个字符串,如:

  1. typeof 123; // ‘number‘
  2. typeof NaN; // ‘number‘
  3. typeof ‘str‘; // ‘string‘
  4. typeof true; // ‘boolean‘
  5. typeof undefined; // ‘undefined‘
  6. typeof Math.abs; // ‘function‘
  7. typeof null; // ‘object‘
  8. typeof []; // ‘object‘
  9. typeof {}; // ‘object‘

和Java类似,JS中也提供了包装对象,使用new创建,变成Object后同Java中类似,直接使用===对比会返回false:

  1. var n = new Number(123); // 123,生成了新的包装类型
  2. var b = new Boolean(true); // true,生成了新的包装类型
  3. var s = new String(‘str‘); // ‘str‘,生成了新的包装类型

不写new,直接使用 Number() 诸如此类,是强转类型的函数:

  1. var n = Number(‘123‘); // 123,相当于parseInt()或parseFloat()
  2. typeof n; // ‘number‘
  3. var b = Boolean(‘true‘); // true
  4. typeof b; // ‘boolean‘
  5. var b2 = Boolean(‘false‘); // true! ‘false‘字符串转换结果为true!因为它是非空字符串!
  6. var b3 = Boolean(‘‘); // false
  7. var s = String(123.45); // ‘123.45‘
  8. typeof s; // ‘string‘

总结一下规则:

  • 不要使用new Number()、new Boolean()、new String()创建包装对象
    • 包装对象创建/实例化出来的,是对象类型,而不是Number/Boolean/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‘
  • 其他
    • null 和 undefined 没有toString()方法
    • number对象调用toString()会报错,需要处理一下: 123.toString() //SyntaxError   (123).toString(); // ‘123‘

1、Date

多说无意,看代码:

  1. var now = new Date();
  2. now; // Wed Jun 24 2015 19:49:22 GMT+0800 (CST)
  3. now.getFullYear(); // 2015, 年份
  4. now.getMonth(); // 5, 月份,注意月份范围是0~11,5表示六月
  5. now.getDate(); // 24, 表示24号
  6. now.getDay(); // 3, 表示星期三
  7. now.getHours(); // 19, 24小时制
  8. now.getMinutes(); // 49, 分钟
  9. now.getSeconds(); // 22, 秒
  10. now.getMilliseconds(); // 875, 毫秒数
  11. now.getTime(); // 1435146562875, 以number形式表示的时间戳

注意:该时间是从本机操作系统获取的时间,如果用户将当前时间设定为其他的值,那么获取的时间也是不同的。

Date对象表示的时间总是按浏览器所在的时区显示的,可以通过方法显示本地时间,或调整后的UTC时间:

  1. var d = new Date(1435146562875);
  2. d.toLocaleString(); // ‘2015/6/24 下午7:49:22‘,本地时间(北京时区+8:00),显示的字符串与操作系统设定的格式有关
  3. d.toUTCString(); // ‘Wed, 24 Jun 2015 11:49:22 GMT‘,UTC时间,与本地时间相差8小时

这里传递的参数实际上是一个number类型的时间戳,之前我们的示例代码中提到过,一个Date对象使用getTime方法可以得到number形式的时间戳。

*时间戳:从1970年1月1日零时整的GMT时区开始,到现在此刻的毫秒数,是一个自增的整数。

2、JSON

其实把JSON和之前的Date放在同一个博文里似乎有些不合适,Date确实是一个对象,但是JSON实际上说来是一种数据格式。不过,先这样吧,谁让我懒呢。

另,之前关于JSON专门写过一篇入门小博文,可以戳下再了解下:《JSON的基本结构和数据交换原理

简单说来,JSON就是一种轻量级的数据交换格式,比XML轻量很多,发明这个格式的人钟情于JavaScript,所以设计的JSON实际上就是JavaScript的子集,所以JS中可以直接使用JSON,因为JS中内置了JSON的解析。

也因如此,JSON作为一种数据交换格式,其定义的数据类型也就跟JS基本一样:

  • number
  • boolean
  • string
  • array
  • object
  • null

JSON还定死了字符集必须是UTF-8。为统一解析,JSON的字符串规定必须用双引号"",Object的键也必须用双引号""。

最后:

  • JS对象变成JSON,就是把这个对象序列化成JSON格式的字符串,就能够通过网络传递到其他计算机
  • 收到JSON格式字符串,只需要反序列化成为JS对象,就可以在JavaScript中直接使用这个对象了

2.1 序列化 JSON.stringify()

假如有一个小明对象,我们要将这个对象序列化成JSON格式的字符串:

  1. var xiaoming = {
  2. name: ‘小明‘,
  3. age: 14,
  4. gender: true,
  5. height: 1.65,
  6. grade: null,
  7. ‘middle-school‘: ‘\"W3C\" Middle School‘,
  8. skills: [‘JavaScript‘, ‘Java‘, ‘Python‘, ‘Lisp‘]
  9. };
  10. JSON.stringify(xiaoming); 
  11. //‘{"name":"小明","age":14,"gender":true,"height":1.65,"grade":null,"middle-school":"\"W3C\" Middle School","skills":["JavaScript","Java","Python","Lisp"]}‘

为了输出好看些,可以加上参数,按缩进输出:

  1. JSON.stringify(xiaoming, null, ‘ ‘);
  2. //结果
  3. {
  4. "name": "小明",
  5. "age": 14,
  6. "gender": true,
  7. "height": 1.65,
  8. "grade": null,
  9. "middle-school": "\"W3C\" Middle School",
  10. "skills": [
  11. "JavaScript",
  12. "Java",
  13. "Python",
  14. "Lisp"
  15. ]
  16. }

第二个参数用于控制如何筛选对象的键值,如果只想输出指定的属性,可以传入Array:

  1. JSON.stringify(xiaoming, [‘name‘, ‘skills‘], ‘ ‘);
  2. //结果
  3. {
  4. "name": "小明",
  5. "skills": [
  6. "JavaScript",
  7. "Java",
  8. "Python",
  9. "Lisp"
  10. ]
  11. }

第二个参数还可以传入函数,这样每个键值对都会被函数先处理:

  1. function convert(key, value) {
  2. if (typeof value === ‘string‘) {
  3. return value.toUpperCase();
  4. }
  5. return value;
  6. }
  7. JSON.stringify(xiaoming, convert, ‘ ‘);
  8. //结果:把所有属性值变成大写
  9. {
  10. "name": "小明",
  11. "age": 14,
  12. "gender": true,
  13. "height": 1.65,
  14. "grade": null,
  15. "middle-school": "\"W3C\" MIDDLE SCHOOL",
  16. "skills": [
  17. "JAVASCRIPT",
  18. "JAVA",
  19. "PYTHON",
  20. "LISP"
  21. ]
  22. }

如果我们还想要精确控制如何序列化小明,可以给xiaoming定义一个toJSON()的方法,直接返回JSON应该序列化的数据:

  1. var xiaoming = {
  2. name: ‘小明‘,
  3. age: 14,
  4. gender: true,
  5. height: 1.65,
  6. grade: null,
  7. ‘middle-school‘: ‘\"W3C\" Middle School‘,
  8. skills: [‘JavaScript‘, ‘Java‘, ‘Python‘, ‘Lisp‘],
  9. toJSON: function () {
  10. return { // 只输出name和age,并且改变了key:
  11. ‘Name‘: this.name,
  12. ‘Age‘: this.age
  13. };
  14. }
  15. };
  16. JSON.stringify(xiaoming); // ‘{"Name":"小明","Age":14}‘

2.2 反序列化

拿到一个JSON格式的字符串,我们直接用JSON.parse()把它变成一个JavaScript对象:

  1. JSON.parse(‘[1,2,3,true]‘); // [1, 2, 3, true]
  2. JSON.parse(‘{"name":"小明","age":14}‘); // Object {name: ‘小明‘, age: 14}
  3. JSON.parse(‘true‘); // true
  4. JSON.parse(‘123.45‘); // 123.45

序列化中我们可以对方法增加函数,进行预处理,同理,在反序列化中,我们也可以让JSON.parse()接收一个函数,用来转换解析出的属性:

  1. JSON.parse(‘{"name":"小明","age":14}‘, function (key, value) {
  2. // 把number * 2:
  3. if (key === ‘name‘) {
  4. return value + ‘同学‘;
  5. }
  6. return value;
  7. }); // Object {name: ‘小明同学‘, age: 14}

实际上,还有第二种方式可以将JSON格式的字符串转换为JS对象,使用eval函数:

  1. eval(string);
  2. //eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码

可能有人要疑惑,为什么JSON格式的字符串,可以计算执行成为一个JS对象呢?因为JSON格式的字符串其实可以说是一种 “对象字面量”,执行这个字符串自然也就对应生成了对象。值得注意的是,为了避免JSON中花括号被当成语句块处理,我们在使用eval方法时,要对JSON格式的字符串加上括号。

所以,JSON.parse(jsonStr)的方式,也可以写成下面格式:

  1. var xiaoming = ‘{"name":"小明", "age":14}‘;
  2. var jsObj = eval("(" + xiaoming + ")");

*字面量:由语法表达式定义的常量,或你可以理解为,是通过由一定字词组成的语词表达式定义的常量

时间: 2024-08-03 07:29:00

03标准对象-01-Date和JSON的相关文章

Bentley (ex. Microstran) Limcon 03.63.01.16 1CD钢结构设计分析软件

Bentley (ex. Microstran) Limcon 03.63.01.16 1CD钢结构设计分析软件Bentley AXSYS.Integrity V8i 08.11.09.52 1CDBentley AXSYS.Engine V8i 08.11.11.22 1CDBentley AXSYS Process V8i v08.11.11.32 1CD前端工程设计 (FEED) 系统Bentley (原. Microstran) Limcon 03.63.01.16 build 27/0

Math, Date,JSON对象

Math 对象 Math是 JavaScript 的原生对象,提供各种数学功能.该对象不是构造函数,不能生成实例,所有的属性和方法都必须在Math对象上调用. 静态属性 Math对象的静态属性,提供以下一些数学常数. Math.E:常数e. Math.LN2:2 的自然对数. Math.LN10:10 的自然对数. Math.LOG2E:以 2 为底的e的对数. Math.LOG10E:以 10 为底的e的对数. Math.PI:常数π. Math.SQRT1_2:0.5 的平方根. Math.

JS的六大对象:Global、Math、Number、Date、JSON、console,运行在服务器上方的支持情况分析

在ASP中使用runat="server"来调用JS的相关函数,代码如下: <script runat="server" language="javascript"> // 代码部份 </script> 下表列举JS六大对象在runat="server"中的支持情况: 对象 是否支持 Global 支持 Math 支持 Number 支持 Date 不支持 JSON 不支持 console 不支持 原文

在ASP.NET MVC中使用Knockout实践01,绑定Json对象

本篇体验在ASP.NET MVC下使用Knockout,将使用EF Code First创建数据库.最后让Knockout绑定一个Json对象. 创建一个领域模型. namespace MvcApplication3.Models { public class Product { public int Id { get; set; } public string Name { get; set; } public string Category { get; set; } public deci

js - 03课-01 隔行变色, 鼠标移入移出变色

1. 效果图 2. 源码 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> li { height:24px; margin-bottom:3px; list-style:none; } </style> </head> <body

J2EE 第四周(03.26-04.01)

1.分析hello.java /** * Copyright (c) 2014 Oracle and/or its affiliates. All rights reserved. * * You may not modify, use, reproduce, or distribute this software except in * compliance with the terms of the License at: * https://github.com/javaee/tutori

Java知识系统回顾整理01基础03变量01变量定义

定义: 变量:用来命名一个数据的标识符 ? ? 一.什么是变量? 用具体实例定义变量 变量的定义是: 用来命名一个数据的标识符 1949 这是一个数字,代表某年 如果要命名这个数字,在java里就会写成: int year = 1949; ? ? int?是数据类型,表示是整数 year?是一个标识符 =?是赋值操作符 1949?是一个数字类型的值 ;?表示该行结束 ? ? year 这个标识符就是一个变量,它代表1949这个值 public class HelloWorld { ????pub

Js Json 互转

推荐: //js对象转换为 JSON 文本 var text = '[{"id":1,"name":"C","size":"","date":"02/19/2010","children":[{"id":2,"name":"Program Files","size":&

PHP JSON

PHP JSON 本章节我们将为大家介绍如何使用 PHP 语言来编码和解码 JSON 对象. 环境配置 在 php5.2.0 及以上版本已经内置 JSON 扩展. JSON 函数 函数 描述 json_encode 对变量进行 JSON 编码 json_decode 对 JSON 格式的字符串进行解码,转换为 PHP 变量 json_last_error 返回最后发生的错误 json_encode PHP json_encode() 用于对变量进行 JSON 编码,该函数如果执行成功返回 JSO