JavaScript对象

JavaScript 的对象

JavaScript中的所有事物都是对象:字符串、数字、数组、日期,等等。在JavaScript中,对象是拥有属性和方法的数据。

从传统意义上来说,ECMAScript 并不真正具有类。事实上,除了说明不存在类,在 ECMA-262 中根本没有出现“类”这个词。ECMAScript 定义了“对象定义”,逻辑上等价于其他程序设计语言中的类。

var o = new Object();

对象的概念与分类:

• 由ECMAScript定义的本地对象.独立于宿主环境的 ECMAScript 实现提供的对象.(native object)

• ECMAScript 实现提供的、独立于宿主环境的所有对象,在 ECMAScript 程序开始执行时出现.这意味着开发者不必明确实例化内置对象,它已被实例化了。ECMA-262 只定义了两个内置对象,即 Global 和 Math (它们也是本地对象,根据定义,每个内置对象都是本地对象)。(built-in object)

• 所有非本地对象都是宿主对象(host object),即由 ECMAScript 实现的宿主环境提供的对象。所有 BOM 和 DOM 对象都是宿主对象。

object对象:ECMAScript 中的所有对象都由这个对象继承而来;Object 对象中的所有属性和方法都会出现在其他对象中

ToString() :  返回对象的原始字符串表示。
ValueOf()  : 返回最适合该对象的原始值。对于许多对象,该方法返回的值都与 ToString() 的返回值相同。

11种内置对象

包括:  Array ,String , Date, Math, Boolean, Number  Function, Global, Error, RegExp , Object

 

在JavaScript中除了null和undefined以外其他的数据类型都被定义成了对象,也可以用创建对象的方法定义变量,String、Math、Array、Date、RegExp都是JavaScript中重要的内置对象,在JavaScript程序大多数功能都是通过对象实现的

<script language="javascript">

var aa=Number.MAX_VALUE;        //利用数字对象获取可表示最大数

var bb=new String("hello JavaScript");      //创建字符串对象

var cc=new Date();      //创建日期对象

var dd=new Array("星期一","星期二","星期三","星期四");      //数组对象

</script>

1. 自定义对象

类似于(某方面类似)Python中的字典数据类型

var a = {"name": "zhou", "age": 18};
console.log(a.name);
console.log(a["age"]);

遍历对象中的内容

var a = {"name": "zhou", "age": 18};
for (var i in a){
  console.log(i, a[i]);
}

事情并没有那么简单...

创建对象:

var person=new Object();  // 创建一个person对象
person.name="Alex";  // person对象的name属性
person.age=18;  // person对象的age属性

2. Date对象

2.1 创建Date对象

//方法1:不指定参数
var d1 = new Date();                //不指定参数,就是当下时间
console.log(d1.toLocaleString());       // 2016/12/27 下午5:37:27

//方法2:参数为日期字符串
var d2 = new Date("2004/3/20 11:12");
console.log(d2.toLocaleString());               // 2004/3/20 上午11:12:00
var d3 = new Date("04/03/20 11:12");
console.log(d3.toLocaleString());               // 2020/4/3 上午11:12:00

//方法3:参数为毫秒数
var d3 = new Date(1482890018009);                // 注意:python里面的转换是秒,而JavaScript里面的是毫秒
console.log(d3.toLocaleString());               // 2016/12/28 上午9:53:38               北京时间
console.log(d3.toUTCString());                  // Wed, 28 Dec 2016 01:53:38 GMT   国际标准时间 + 8 = 北京时间

//方法4:参数为年月日小时分钟秒毫秒
var d4 = new Date(2004,2,20,11,12,0,300);
console.log(d4.toLocaleString());  //毫秒并不直接显示

2.2 Date对象的方法

var d = new Date(); 
//getDate()                 获取日
//getDay ()                 获取星期    (0-6)
//getMonth ()               获取月(0-11)
//getFullYear ()            获取完整年份
//getYear ()                获取年
//getHours ()               获取小时
//getMinutes ()             获取分钟
//getSeconds ()             获取秒
//getMilliseconds ()        获取毫秒
//getTime ()                返回累计毫秒数(从1970/1/1午夜)

2.3 Date对象的方法—日期和时间的转换

日期和时间的转换:

getTimezoneOffset():8个时区×15度×4分/度=480;      //返回本地时间与GMT的时间差,以分钟为单位
toUTCString()       //返回国际标准时间字符串
toLocalString()     //返回本地格式时间字符串
Date.parse(x)       //返回累计毫秒数(从1970/1/1午夜到本地时间)
Date.UTC(x)     //返回累计毫秒数(从1970/1/1午夜到国际时间)

 

示例:  编写代码,将当前日期按“2016年12月27日 11:11 星期三”格式输出。

function getNow() {
    var d = new Date();
    var y = d.getFullYear();
    var m = d.getMonth() + 1;
    var dy = d.getDate();
    var h = d.getHours();
    var min = d.getMinutes();
    var w = d.getDay();

    var month = m<10 ? '0'+m:m;     // 1~9的数字前面补一个0
    l = ['星期天','星期一','星期二','星期三','星期四','星期五','星期六'];
    var week = l[w];        // 把0~6转换成 星期
    return console.log(y+'年'+month+'月'+dy+'日 '+h+':'+min+' '+week)
}

var ss=getNow();
console.log(ss);        // 2017-11-17 15:27 星期五

3.JSON对象

var str1 = '{"name": "Alex", "age": 18}';
var obj1 = {"name": "Alex", "age": 18};

var obj = JSON.parse(str1);         // JSON字符串转换成对象

var str = JSON.stringify(obj1);         // 对象转换成JSON字符串

4. RegExp 对象

创建RegExp的两种方式:

var p = new RegExp('正则表达式', '匹配模式');     //匹配模式:g global / i 忽略大小写. //参数2一般填写g就可以,也有“gi”.

var p = /正则表达式/匹配模式;            // 简写

示例:

// 用户名只能是英文字母、数字和_,并且首字母必须是英文字母。长度最短不能少于6位 最长不能超过12位。

// 创建RegExp对象方式
var reg1 = new RegExp("^[a-zA-Z][a-zA-Z0-9_]{5,11}$", "g");         // 正则表达式里不能加空格

// 匹配响应的字符串
var s1 = "bc123";

//RegExp对象的test方法,测试一个字符串是否符合对应的正则规则,返回值是true或false。
reg1.test(s1);  // true

// 创建方式2
// /填写正则表达式/匹配模式
var reg2 = /^[a-zA-Z][a-zA-Z0-9_]{5,11}$/g;

reg2.test(s1);  // true
/正则表达式/.test(字符串)

String对象与正则结合的4个方法

var s2 = "hello world";

s2.match(/o/g);         // ["o", "o"]             查找字符串中 符合正则 的内容
s2.search(/h/g);        // 0                      查找字符串中符合正则表达式的内容位置
s2.split(/o/g);         // ["hell", " w", "rld"]  按照正则表达式对字符串进行切割
s2.replace(/o/g, "s");  // "hells wsrld"          对字符串按照正则进行替换

关于匹配模式:g和i的简单示例

var s = "tree trEE";

s.replace(/e/, "*");      // "tr*e trEE"       只匹配第一个
s.replace(/e/g, "*");     // "tr** trEE"      全局匹配
s.replace(/e/gi, "*");    // "tr** tr**"  不区分大小写

 

RegExp扩展:

// 如果regExpObject带有全局标志g,test()函数不是从字符串的开头开始查找,而是从属性regExpObject.lastIndex所指定的索引处开始查找。
// 该属性值默认为0,所以第一次仍然是从字符串的开头查找。
// 当找到一个匹配时,test()函数会将regExpObject.lastIndex的值改为字符串中本次匹配内容的最后一个字符的下一个索引位置。
// 当再次执行test()函数时,将会从该索引位置处开始查找,从而找到下一个匹配。

// 因此,当我们使用test()函数执行了一次匹配之后,如果想要重新使用test()函数从头开始查找,则需要手动将regExpObject.lastIndex的值重置为 0。
// 如果test()函数再也找不到可以匹配的文本时,该函数会自动把regExpObject.lastIndex属性重置为 0

// 所以我们在使用test()方法校验一个字符串是否完全匹配时,不推荐添加全局匹配模式g。

// 注意事项2(说出来你可能不信系列):
// 当我们不加参数调用RegExpObj.test()方法时, 相当于执行RegExpObj.test("undefined"), 并且/undefined/.test()默认返回true。

var reg4 = /^undefined$/;
reg4.test(); // 返回true
reg4.test(undefined); // 返回true
reg4.test("undefined"); // 返回true

5. Math对象

abs(x)      返回数的绝对值。
exp(x)      返回 e 的指数。
floor(x)    对数进行下舍入。
log(x)      返回数的自然对数(底为e)。
max(x,y)    返回 x 和 y 中的最高值。
min(x,y)    返回 x 和 y 中的最低值。
pow(x,y)    返回 x 的 y 次幂。
random()    返回 0 ~ 1 之间的随机数。
round(x)    把数四舍五入为最接近的整数。
sin(x)      返回数的正弦。
sqrt(x)     返回数的平方根。
tan(x)      返回角的正切。

示例:求两个数之间的随机数公式:

(max - min) + Math.random() * min

 

posted @ 2017-11-19 23:34  静静别跑  阅读(111)  评论(0编辑  收藏  举报