《JavaScript高级程序设计 第3版》-学习笔记-3

P84-P137页,

这一章看的真久,这个月事太多了。有些内容在代码注释里没提出来了

1、JS强大的数组类型,元素类型任意,提供了非常多的操作数组的方法和属性

  1 /*
  2 数组类型
  3  */
  4 
  5 //stack
  6 var colors = ['red','blue'];
  7 colors.push('brown');
  8 console.log(colors);
  9 console.log(colors.length);
 10 var item = colors.pop();
 11 console.log(item);
 12 console.log(colors);
 13 
 14 //队列
 15 colors = [];
 16 var count = colors.push('red','green');
 17 console.log(count);
 18 console.log(colors);
 19 count = colors.push('black');
 20 console.log(count);
 21 item = colors.shift();
 22 console.log(item);
 23 console.log(colors);
 24 console.log(colors.length);
 25 
 26 //pop 与 unshift搭配可以实现反向队列
 27 
 28 
 29 
 30 
 31 //重新排序
 32 var values = [1,2,3,4,5,6];
 33 values.reverse();
 34 console.log(values);
 35 
 36 values = [0,1,5,10,15];
 37 values.sort();//sort方法默认进行字符串比较,即调用toString方法比较结果
 38 console.log(values);
 39 
 40 //为了实现自定义排序,可以这样
 41 function comp(var1,var2){
 42     return var1 - var2;
 43 }
 44 
 45 values.sort(comp);
 46 console.log(values);
 47 
 48 /*
 49 数组操作方法
 50  */
 51 
 52 
 53 //数组复制合并
 54 var colors1 = ['red','green','blue'];
 55 var colors2 = colors1.concat('yellow',['black','brown']);
 56 console.log(colors1);
 57 console.log(colors2);
 58 
 59 
 60 //slice方法,这个方法的操作不会影响原来的数组
 61 colors = ['red','green','blue','yellow','purple'];
 62 colors2 = colors.slice(1);
 63 var colors3 = colors.slice(1,4);
 64 console.log(colors2);
 65 console.log(colors3);
 66 
 67 //splice方法,最强的数组操作方法
 68 //删除
 69 colors.splice(0,2);//要删除的第一项的位置和要删除的项数
 70 console.log(colors);
 71 //插入
 72 colors.splice(2,0,'red','green');//起始位置、0(要删除的项)和要插入的项-‘red’,‘green’
 73 console.log(colors);
 74 //替换
 75 colors.splice(2,1,'white');//起始位置,删除项数,插入项
 76 console.log(colors);
 77 //这个方法的返回值是被删除的数组,如果没有删除,返回一个空数组
 78 
 79 console.log(colors.indexOf('green'));
 80 console.log(colors.lastIndexOf('green'));
 81 
 82 //数组迭代方法
 83 //every,都返回ture才返回true
 84 numbers = [1,2,3,4,5,4,3,2,1];
 85 var everyRes = numbers.every(function(val,index,arr){
 86     return (val > 2);
 87 });
 88 console.log(everyRes);
 89 
 90 //some,只要有一项为true,则结果为true
 91 var someRes = numbers.some(function(val,index,arr){
 92     return val > 2;
 93 });
 94 console.log(someRes);
 95 
 96 //filter,返回该函数会返回true的项构成的数组
 97 var filterRes = numbers.filter(function(val ,index,arr){
 98     return val > 2;
 99 });
100 console.log(filterRes);
101 
102 //map,返回函数调用结果形成的数组;
103 var mapRes = numbers.map(function(val,index,arr){
104     return val * 2;
105 });
106 console.log(mapRes);
107 
108 //forEach,这个方法没有返回值
109 numbers.forEach(function(val,index,arr){
110     //执行操作
111 });
Array Demo Code

2、Date类型

 1 /*
 2 Date类型
 3  */
 4 
 5 var now = new Date();
 6 console.log(now);
 7 
 8 var someDate = new Date(Date.parse('May 25,2005'));//与new Date('May 25,2005)等价
 9 console.log(someDate);
10 
11 var y2k = new Date(Date.UTC(2012,5,8));//2012年6月8日
12 console.log(y2k);
13 
14 var start = Date.now();
15 start = +new Date();//这样是为不支持Date.now的浏览器兼容,把Date对象转换成字符串
16 
17 //日期类支持大于小于操作符
18 console.log(now > start);
19 
20 //日期格式化
21 var date = new Date();
22 
23 console.log(date.toLocaleDateString());//2015-03-29;
24 console.log(date.getFullYear()+'...'+(date.getMonth()+1)+'...'+date.getDate());
Date Demo Code

3、强大的正则类型

 1 /*
 2 RegExp类型
 3  */
 4 
 5 var exp = /^\d+$/ig;//必须转义(\)的元字符 ( [ { \ ^ $ | ) ? * + . ] }
 6 console.log(exp.test('12324234a'));
 7 
 8 var expEmail = /^\w+@\w+\.\w+\.?\w*$/i;
 9 console.log(expEmail.test('lvyahui8@126.com'));
10 console.log(expEmail.test('lvyahui8@126.com.'));
11 console.log(expEmail.test('lvyahui8@126.com.cn'));
12 console.log(expEmail.test('lvyahui8@126.co-'));
13 var expEmail2 = new RegExp('^\\w+@\\w+\\.\\w+\\.?\\w*$','i');
14 console.log(expEmail2.test('lvyahui8@126.com'));
15 console.log(expEmail2.test('lvyahui8@126.com.'));
16 console.log(expEmail2.test('lvyahui8@126.com.cn'));
17 console.log(expEmail2.test('lvyahui8@126.co-'));
18 
19 //exec方法
20 var text = 'mom and dad and baby';
21 var pattern = /mom( and dad( and baby)?)?/gi;
22 var matches = pattern.exec(text);
23 console.log(matches.index);
24 console.log(matches.input);
25 console.log(matches[0]);
26 console.log(matches[1]);
27 console.log(matches[2]);
28 
29 text = 'cat, bat, sat, fat';
30 pattern = /.at/;
31 matches = pattern.exec(text);
32 console.log(matches.index);
33 console.log(matches[0]);
34 console.log(pattern.lastIndex);
35 
36 matches = pattern.exec(text);
37 console.log(matches.index);
38 console.log(matches[0]);
39 console.log(pattern.lastIndex);
40 
41 pattern = /.at/g;
42 matches = pattern.exec(text);
43 console.log(matches.index);
44 console.log(matches[0]);
45 console.log(pattern.lastIndex);
46 
47 matches = pattern.exec(text);
48 console.log(matches.index);
49 console.log(matches[0]);
50 console.log(pattern.lastIndex);
RegExp Demo Code

4、函数类型,函数类型也是对象,也有属性和方法

  1 /*
  2 Function 类型
  3  */
  4 
  5 function sum(num1,num2){
  6     return num1+num2;
  7 }
  8 var sum2 = function(num1,num2){
  9     return num1+num2;
 10 };
 11 
 12 var otherName = sum2;
 13 console.log(otherName(3,2));
 14 
 15 //函数并不能重载的根本原因在于函数名只是个指针,重新申明一个函数只是修改了函数指针的值
 16 function factorial(num){
 17     if(num<=1){
 18         return 1;
 19     }
 20     else{
 21         return num * arguments.callee(num-1);//将函数的执行过程与函数名解耦
 22     }
 23 }
 24 /*
 25 window.color = 'red';
 26 var o = {color:'blue'};
 27 function sayColor(){
 28     console.log(this.color);
 29 }
 30 sayColor();//'red' 当在网页的全局作用域调用函数时,t在该函数里,this对象指向window
 31 o.sayColor = sayColor;
 32 o.sayColor();//'blue'
 33 //函数名只是个指针,全局sayCOlor和o.sayCOlor指向的是同一个函数
 34 */
 35 function sayName(name){}
 36 function cp(a,b){}
 37 function pt(){}
 38 console.log(sayName.length);//1
 39 console.log(cp.length);//2
 40 console.log(pt.length);//0
 41 
 42 
 43 /*
 44  函数属性和方法
 45  */
 46 
 47 //属性,length,prototype
 48 
 49 function person(name,age){
 50     this.name = name;
 51     this.age = age;
 52     function getName(){
 53         return this.name;
 54     }
 55 }
 56 
 57 console.log(person.length);//1
 58 console.log(person.prototype);//{}
 59 
 60 
 61 //function apply,call
 62 function callSum1(num1,num2){
 63     return sum.apply(this,arguments);
 64 }
 65 
 66 function callSum2(num1,num2){
 67     return sum.apply(this,[num1,num2]);
 68 }
 69 
 70 function callSum3(num1,num2){
 71     return sum.call(this,num1,num2);
 72 }
 73 
 74 console.log(callSum1(10,10));//因为在全局作用域中调用,所以
 75 console.log(callSum2(10,10));
 76 console.log(callSum3(10,10));
 77 
 78 var o = {color:'blue'};
 79 
 80 function sayColor(){
 81     console.log(this.color);
 82 }
 83 
 84 //这里输出为undefined 是因为当前运行环境不在浏览器,也就是不在window的作用域,this指针并不指向window
 85 console.log(this);  //{}
 86 sayColor();             //red
 87 sayColor.call(this);    //red
 88 sayColor.call(window);  //red
 89 
 90 sayColor.call(o);       //blue
 91 
 92 //bind方法
 93 var window = {color:'red'};
 94 var o = {color:'blue'};
 95 
 96 function sayColor(){
 97     console.log(this.color);
 98 }
 99 
100 var objSayColor = sayColor.bind(o);
101 objSayColor();
Function Demo Code

5、基本包装类型

  1 /*
  2     基本包装类型
  3  */
  4 
  5 //String
  6 var s1 = 'come.text';
  7 var s2 = s1.substring(2);
  8 //使用new关键字创建的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类的对象,
  9 //则只存在于一行代码的执行瞬间,然后立刻被销毁,所以不能动态为基本类型值添加属性和方法
 10 s1 = 'come text';
 11 s1.color = 'red';
 12 console.log(s1.color);//undefined
 13 
 14 var obj = new Object('some test');
 15 console.log(obj instanceof String);//true
 16 
 17 //注意,使用new 调用构造函数与直接调用同名的转型函数是不一样的
 18 var value = '25';
 19 var number = Number(value);
 20 console.log(typeof number);//number
 21 
 22 var obj = new Number(value);
 23 console.log(typeof  obj);//object
 24 
 25 
 26 
 27 
 28 //--Boolean
 29 var falseObj = new Boolean(false);
 30 var result = falseObj && true;
 31 
 32 console.log(result);
 33 
 34 var falseValue = false;
 35 result = falseValue && true;
 36 console.log(result);
 37 
 38 console.log(typeof falseObj);//object
 39 console.log(typeof falseValue);
 40 console.log(falseObj instanceof Boolean);
 41 console.log(falseValue instanceof Boolean);
 42 
 43 //--Number
 44 var numberObject = new Number(10);
 45 console.log(numberObject.toString());//10
 46 console.log(numberObject.toString(2));//1010
 47 console.log(numberObject.toString(8));//12
 48 console.log(numberObject.toString(16));//a
 49 console.log(numberObject.toFixed(2));
 50 //如果长度过长,以最大接近小数位进行舍入
 51 console.log((new Number(10.0047)).toFixed(2));//10.00
 52 console.log((new Number(10.005)).toFixed(2));//10.01
 53 //String
 54 var strValue =  "我是lvyahui";
 55 console.log(strValue.length);   //即使是双字节字符也算一个字符
 56 
 57 console.log('String Start');
 58 //String 类型
 59 //模式匹配
 60 //match方法,找到第一个匹配的
 61 var text = "hello world,lvyahui";
 62 var pattern = /.l/;
 63 var matches = text.match(pattern);
 64 console.log(matches.index);//1
 65 matches.every(function(i){
 66     console.log(i);
 67 });
 68 console.log(pattern.lastIndex);//0
 69 
 70 //search 方法,返回第一个匹配字符串的位置
 71 var pos = text.search(/l/);
 72 console.log(pos);
 73 //replace 方法,两个参数,如果第一个参数是字符串的话,只会替换第一个字符。要想替换所有的字符串,必须使用正则
 74 text = "hello,this is 15$,you &mi"
 75 var repRes = text.replace(/l/g,"w");
 76 console.log(repRes);
 77 repRes = text.replace(/(l)/g,"w $1");
 78 console.log(repRes);
 79 
 80 function htmlEscpae(text){
 81     return text.replace(/[<>"&]/g,function(match,pos,originalText){
 82         switch (match) {
 83             case "<":
 84                 return "&lt;";
 85                 break;
 86             case ">":
 87                 return "&gt;";
 88                 break;
 89             case "&":
 90                 return "&amp;";
 91                 break;
 92             case "\"":
 93                 return "&quot;";
 94                 break;
 95         }
 96     });
 97 }
 98 
 99 console.log(htmlEscpae("<p class=\"greeting\">hello world!</p>"));
100 
101 var colorText = "red,blur,,green,yellow";
102 var c1 = colorText.split(",");
103 var c2 = colorText.split(",",2);//指定数组的大小
104 var c3 = colorText.split(/[^\,]/);
105 console.log(c1);
106 console.log(c2);
107 console.log(c3);
View Code

在所有JS代码执行之前就存在两个内置对象Global和Math对象,不能直接访问Global对象,但Web浏览器中window对象承担了该角色

posted @ 2015-04-09 21:32  lvyahui  阅读(229)  评论(0编辑  收藏  举报