45-1 JavaScript的对象-native object
在 ECMA-262 中没有出现“类”这个词。ECMAScript 定义了“对象定义”,逻辑上等价于其他程序设计语言中的类。
var obj = new Object();
- 本地对象(native object)。包括普通本地对象和“内置对象”。“内置对象”,程序开始执行时它已被自动实例化了。
- 宿主对象(host object),即由 ECMAScript 实现的宿主环境提供的对象。所有 BOM 和 DOM 对象都是宿主对象。
ECMAScript 中的所有对象都由Object这个对象继承而来;Object 对象中的所有属性和方法都会出现在其他对象中。
ToString() : 返回对象的原始字符串表示。 ValueOf() : 返回最适合该对象的原始值。对于许多对象,该方法返回的值都与 ToString() 的返回值相同。
11种内置对象,包括:Array ,String , Date, Math, Boolean, Number Function, Global, Error, RegExp , Object

Function对象
一、函数的定义
1、正常方法创建函数
推荐用这种方法。
function 函数名(参数){
函数体;
}
2、用Function() 构造函数创建函数
这种方法并不常用,可用来理解“函数是对象”这件事。注意Function首字母为大写。
var func = new Function("参数1", "参数2", ... ,"函数体")
var func = new Function("a", "b", "alert(a+b)"); func(2, 3);
3、用匿名函数创建函数
function()是个匿名的函数,将它赋给变量func(函数名)。
var func=function(){
函数体;
}
4、自执行函数(匿名函数)
(function(arg){
console.log(arg);
})('123')
// 作用等价于:
f=(function(arg){
console.log(arg);
})
f('123')
括号内是一个匿名函数代码块,用括号标识其边界。这种函数的好处是执行完就了事,没有函数名去占用内存空间。
二、函数的调用
1、js的函数加载执行与python不同,它是整体加载完才会执行,所以函数调用放在上面或下面都可以。
2、实参的传入
(1)容错性强
传入实参的个数与形参不符时,不报错。容错性强,甚至可以说有点太随便了。
var ret=0;
function func(a,b){
ret =a+b;
};
func(); // NaN
func(1); // NaN
func(1, 2); // 3
func(1, 2, 3); // 3 这里函数只取前两个实参用
func(1, 2, 3, 4) // 3
(2)函数的内置对象arguments
调用函数时,传入的参数自动被封装为一个名为arguments的数组,甚至于函数定义时都不用写形参了。相当于python中的*args。
function add(a,b){
console.log(a+b); // 3
console.log(arguments.length); // 2
console.log(arguments); // 数组[1,2]
}
add(1,2)
// 实例1:加法器 var ret=0; function add(){ for (var i in arguments){ ret= ret + arguments[i]; }; return ret; } alert(add(1, 2, 3, 4)); // 10 // 实例2:验证实参输入是否符合要求 function f(){ if (arguments.length != 3){ throw Error("param should be 3!"); } } f(1, 2, 3, 4, 5); // Uncaught Error: param should be 3!
三、函数对象的属性和方法
1、属性
length
alert(func1.length) // func1函数参数的个数
2、方法
void()
function f(){
return 8
}
alert(f()) // 8
alert(void(f())) // undefined void的作用是阻拦return值的返回
四、作用域
1、js的作用域和py相似,if 、while、for等控制语句并没有自己作用域;而函数是有自己的作用域的
2、闭包
所谓闭包通俗讲就是里层的函数能用外层函数中的数据,这样一种封装方法。
var city = 'beijing'; function bar(){ console.log(city); } function func(){ var city = "shanghai"; return bar; } var ret = func(); ret(); // beijing var city = 'beijing'; function func2(){ var city = "shanghai"; function inner(){ console.log(city); } return inner; } var ret = func(); ret(); // shanghai
3、局部变量与全局变量
function f2(){
var a= 1;
}
f2();
alert(a); // 定义时前面加var了,a是局部变量。console中查看:a is not defined。网页上不报错,与Python不同
function f3(){
a = 1; // a全局变量。平时尽量不用,因为很容易乱。仅看这一句并不知道是在定义变量还是在给变量重新赋值
}
f3();
alert(a)
4、作用域链
参考:http://www.cnblogs.com/yuanchenqi/articles/5980312.html
String对象
一、创建字符串对象
var s1 = "hello"; // 直接创建字符串
var s2 = new String("nihao"); // 通过实例化一个对象的方法创建出字符串
二、字符串对象的属性和方法
1、length 属性
var s1 = "hello"; alert(s1.length); // 5
2、遍历字符串中的字符
var s1 = "hello";
for (i in s1){
console.log(s1[i])
}
3、编排方法
是String对象针对HTML格式的一组方法。功能是给字符串加相应的html标签。了解即可,一般是直接写html标签,而不是用这种方式生成。
s="Hello" document.write(s.italics()); // html代码中:<i>hello</i> document.write(s.bold()); // html代码中:<b>hello</b> document.write(s.anchor()); // html代码中:<a name="undefined">hello</a>
4、大小写转换
s="Hello"; document.write(s.toUpperCase()); // HELLO document.write(s.toLowerCase()); // hello
5、获取指定字符
s.charAt(index) s.charCodeAt(index)
- s 代表字符串对象
- index 代表字符位置的索引号
- index 从0开始编号
- charAt 返回index位置的字符
- charCodeAt 返回index位置的Unicode编码
s="hello world" document.write(s.charAt(6)); // w 索引值为6的字符 document.write(s.charCodeAt(6)); // 119 索引值处字符的asc码
6、查询字符串
console.log(s.search("l")); // 2 匹配第一个字符l的索引值
console.log(s.indexOf("l")); // 2
console.log(s.lastIndexOf("l")); // 9
console.log(s.match("e")); // ["e"] 返回一个数组,里面是所有匹配结果
7、字符串处理
s="hello world"
// 替换
console.log(s.replace("e","E")); // hEllo world
// 分割
console.log(s.split("e")); // ["h", "llo world"]
// 连接
console.log(s.concat(" world")); // hello world world
// 字符串的截取
console.log(s.substr(1, 3)); // ell 从索引1位置开始,取3个字符
console.log(s.substring(1, 3)); // el 从索引1位置开始,到索引3的位置,不包括索引3
console.log(s.slice(1, 3)); // el 从索引1位置开始,到索引3的位置,不包括索引3
console.log(s.slice(1, -3)); // ello wo 与substring的区别是:第二参数可为负数,表示从索引1开始取到倒数第3个位置
Array对象
一、创建数组对象
var arr = [1, 2, 3]; // 创建方式1 var arr2 = new Array(1, 2, "a") // 创建方式2 与python不同的是:python输入的参数需是一个对象 var arr3 = new Array(3); // 注意:用方式2时,若实参只有一个值且是一个数字,数字表示的是长度而不是内容。当然创建完后,数组也是可变长的
二维数组:
var arr4 = [5, [2, 4], 3, [7, 8]]
二、数组的属性和方法
1、成员个数
arr.length
2、获取子数组
即 切片操作。
(1)slice
var arr1=['a','b','c','d','e','f','g','h']; var arr2=arr1.slice(2,4); var arr3=arr1.slice(4); //end省略则相当于从start位置截取以后所有数组元素 var arr4=arr1.slice(2,-1); alert(arr2.toString()); //结果为"c,d" alert(arr3.toString()); //结果为"e,f,g,h" alert(arr4.toString()); //结果为"c,d,e,f,g"
(2)splice
主要用途是对数组指定位置进行删除和插入。
arr.splice(start, deleteCount, value, ...)
- start 开始位置索引
- deleteCount 删除数组元素的个数
- value 表示在删除位置插入的数组元素
- value 参数可以省略
var a = [1,2,3,4,5,6,7,8]; a.splice(1,2); console.log(a); // [1, 4, 5, 6, 7, 8] a.splice(1,0,2,3); console.log(a); // [1, 2, 3, 4, 5, 6, 7, 8]
3、进出栈操作
即 成员的增、删、改操作。
队列模式是“先进先出”,栈模式是“先进后出”。JavaScript数组采用“栈模式”。
(1)push和pop
var arr5=[1, 4, 6];
arr5.push(13); // 压栈,即往数组中添加成员 相当于python的append
console.log(arr5); // [1, 4, 6, 13]
arr5.push("hello", 7); // 同时压入两个成员
console.log(arr5); // [1, 4, 6, 13, "hello", 7]
arr5.pop(); // 弹栈,相当于python的pop
console.log(arr5); // [1, 4, 6, 13, "hello"]
(2)unshift和shift
var arr6 = [1, 4, 6]; arr6.unshift(45); // 压栈,与push不同的是:新加进去的成员放在数组的开头 console.log(arr6); // [45, 1, 4, 6] arr6.shift(); // 弹栈,与shift不同的是:从数组的开头位置往外弹 console.log(arr6); // [1, 4, 6]
4、连接数组
(1)join
功能与python中类似,将数组中的字符串拼接成一个字符串。区别:js中join是数组的方法,python中是字符串的方法。
ret=[1, 2, 3, 4, 5, 6, 7].join("-") ;
console.log(ret); // "1-2-3-4-5-6-7"
(2)concat
合并数组。
var a = [1,2,3]; var b=a.concat(4,5); console.log(a); // [1, 2, 3] console.log(b); // [1, 2, 3, 4, 5]
5、数组排序
(1)reverse
翻转方向。
var arr7 = [1, 2, 4, 3, 5, 100]; arr7.reverse(); console.log(arr7); // [100, 5, 3, 4, 2, 1]
(2)sort
排序,注意:当成字符串排序,是根据首字符的asc码排。
var arr7 = [1, 2, 4, 3, 5, 100]; arr7.sort(); console.log(arr7); // [1, 100, 2, 3, 4, 5]
如果就想按照数字的大小排呢?
var arr7 = [1, 2, 4, 3, 5, 100]; console.log(arr7.sort(mysort)); // [1, 2, 3, 4, 5, 100] function mysort(a, b){ // 排序实际上内部是这样进行的 if (a>b){ // 简便写法 return a-b return 1; }else if(a<b){ return -1; }else{ return 0; } }
Date对象
一、创建Date对象
var date_obj = new Date(); // 不输入实参,默认是当前时间
alert(date_obj); // Thu Aug 31 2017 09:27:57 GMT+0800 (中国标准时间)
var date_obj2 = new Date("2016/3/16 12:20:20"); // 输入待转为真正时间的字符串
alert(date_obj2); // Wed Mar 16 2016 12:20:20 GMT+0800 (中国标准时间)
var date_obj3 = new Date(5000); // 5000是5000毫秒,即5秒
alert(date_obj3); // Thu Jan 01 1970 08:00:05 GMT+0800 (中国标准时间) 因是东八区,所以是8点
二、Date的方法
1、获取日期和时间
var date_obj4 = new Date(); console.log(date_obj4.toLocaleString()); // 2017/9/5 下午4:02:18 当地时间 console.log(date_obj4.toUTCString()); // Tue, 05 Sep 2017 08:02:18 GMT 国际标准时间 console.log(date_obj4.getFullYear()); // 2017 年(全称),因为2017年可以简写为 17 console.log(date_obj4.getMonth()); // 8 月,它的月份是0-11这么来的 console.log(date_obj4.getDate()); // 5 日 console.log(date_obj4.getDay()); // 2 星期几,星期天为:0,星期一-星期六为:1-6 console.log(date_obj4.getHours()); // 16 时 console.log(date_obj4.getMinutes()); // 2 分 console.log(date_obj4.getSeconds()); // 18 秒 console.log(date_obj4.getMilliseconds()); // 920 毫秒
// 输出这样的实际格式:2016年11月08日15:02 星期二 function getTime(){ var date_obj = new Date(); var year = date_obj.getFullYear(); var month = date_obj.getMonth(); var day = date_obj.getDate(); var hour = date_obj.getHours(); var minute = date_obj.getMinutes(); var second = date_obj.getSeconds(); var week = date_obj.getDay(); return year+"年"+month+"月"+f(day)+"日"+hour+":"+minute+":"+second+" "+ch_week(week); } function ch_week(n){ var week = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"] return week[n] } function f(num){ if(num<10){ return "0"+num } return num } alert(getTime());
2、设置日期和时间
var date_obj=new Date(); date_obj.setFullYear (1997); //设置年1997 date_obj.setMonth(7); //设置月7 date_obj.setDate(1); //设置日1 date_obj.setHours(5); //设置小时5 date_obj.setMinutes(12); //设置分钟12 date_obj.setSeconds(54); //设置秒54 date_obj.setMilliseconds(230); //设置毫秒(0-999)为230 document.write(date_obj.toLocaleString()+"<br>"); //返回1997年8月1日5点12分54秒 date_obj.setTime(870409430000); //设置累计毫秒数(从1970/1/1午夜) document.write(date_obj.toLocaleString( )+"<br>"); //返回1997/8/1 下午12:23:50
3、日期和时间对象的转换
getTimezoneOffset() 返回本地时间与GMT的时间差,以分钟为单位,如东八区:8个时区×15度×4分/度=480; Date.parse(x) 返回累计毫秒数(从1970/1/1午夜到本地时间) Date.UTC(x) 返回累计毫秒数(从1970/1/1午夜到国际时间)
RegExp对象
一、创建
// 方式1:
var re_obj=new RegExp("\d+", "g"); // "g"表示全局通用
// 方式2:
var re_obj2=/\d+/g; // 用两个斜杠包住
二、方法
var re_obj=/\d+/g;
re_obj.test("jangja892jlag"); // true 检测字符串中是否有相匹配的结果,如果有返回布尔值true
var s="hell65o"; console.log(s.match(/\d/g)); // ["6", "5"] 取出所有匹配到的内容,放入一个数组 console.log(s.search(/\d/g)); // 4 取出第一个结果的索引值 console.log(s.split(/\d/g)); // ["hell", "", "o"] 有空 console.log(s.replace(/\d/g, "*")); // hell**o 替换
Math对象
是一个内置对象,拿来即用。即不用实例化。ECMA已经给实例化好了。
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) 返回角的正切。
补充:
1、字典
<script type="text/javascript">
// 定义
var dic = new Array(); // 注意它的类型是Array
dic["zs"] = "张三";
dic["ls"] = "李四";
dic["ww"] = "王五";
dic["zl"] = "赵六";
// 查
console.log(dic); // [zs: "张三", ls: "李四", ww: "王五", zl: "赵六"]
console.log(dic["zs"]); // 张三
console.log(dic.zs); // 用点的方式也可以读取字典的值
//遍历字典
var output = "";
for (var key in dic) {
console.log(key, dic[key])
}
//特殊的字典,注意它的类型是Array
var dic2 = ["a", "b", "c", "d"];
//遍历字典
for (var key in dic2) {
console.log(key, dic2[key]); // 它的key是 0,1,2,3
}
//字典的简化风格方式,注意它的类型就不是Array了,而是Json对象
var dic3 = { "zs": "张三1", "ls": "李四1", "ww": "王五1" };
for (var key in dic3) {
console.log(key, dic3[key])
}
</script>
2、JavaScript对象的序列化
JSON.parse(arg) 将字符串转换成对象 JSON.stringify(arg) 将对象转换成字符串
参考:http://www.cnblogs.com/yuanchenqi/articles/5980312.html
浙公网安备 33010602011771号