一、函数
1.函数是一段代码,基本格式为function fun_name(){ }和function fun_name(a,b){ }。
2.var f = new Function("x","y","return x*y");等价于function f(x,y){return x*y;}。
3.函数可以进行嵌套,一个函数可以作为参数传入到另一个函数,如function add(a,b){return a+b;} function cal(f,a,b){return f(a,b);}然后可以使用cal(add,5,6)调用。
4. 关于函数变量空间:定义在任何函数之外的变量属于全局变量,在整个网页中全部有效;而定义在某个函数内部的变量属于局部变量,只在函数内部有效。当局部变量有和全局变量一样的变量时,采用局部变量。
<script> function max(a, b) { return a > b ? a : b; } var u = 42; var v = 24; function print(s) { document.write(s); } function println(s) { print(s + "<br>"); } function gcd(u, v) { var a = u; var b = v; var temp = v; while (v != 0) { temp = u % v; u = v; v = temp; } // alert(a + "和" + b + "的最大公约数是" + u); println(a + "和" + b + "的最大公约数是" + u); } gcd(42, 21); gcd(12, 67); println(max(42, 21)); </script>
二、数组
1.数组的几种格式有:
var a = new Array(); var b = new Array(size); var c = new Array(d1,d2,...,dn); var d = [d1,d2,...,dn]
其中:[]可以访问一个数组单元、a[0]可读可写,索引从0开始。a[x]=n代表创建数组中一个单元x并赋值为n。
2. a.length代表数组长度,是其中最大的下标加一。
3. .length长度可写。如下
<script> var colors = ["red", "blue", "green"]; colors.length = 2; alert(colors[2]); </script>
这里自定义长度为2,第三个元素green被挤掉。于是colors[2]代表的第三个元素由于未定义,运行结果应为undefined。
<script> var colors = ["red", "blue", "green"]; colors.length = 4; alert(colors[3]); colors[colors.length] = "black"; colors[colors.length] = "brown"; </script>
这里自定义长度是4,但是第四个还是没有赋值,结果仍为undefined。后面两个colors.length分别都在原来数组的基础上添加了一组元素(先加了black,后加了brown。最终数组长度是6),增加了代码的可扩展性。
4. 还有一些对数组的操作,toString和valueOf都是转换数组为字符串输出(产生字符串),join里面添加的是分隔符。
<script> var colors = ["red", "blue", "green"]; colors.length = 4; alert(colors[3]); colors[colors.length] = "black"; colors[colors.length] = "brown"; alert(colors.toString()); //产生字符串 alert(colors.valueOf()); //产生字符串 alert(colors); alert(colors.join(",")); //分隔符为, alert(colors.join("||"));//分隔符为|| </script>
5. 数组堆栈操作
堆栈操作即为像往一个只有一个出口的瓶子里面放东西一样,遵循先进后出,后进先出的规则。
<script> var colors = new Array(); var count = colors.push("red","green"); //push进两个元素 alert(count); //2 count = colors.push("black"); // push进一个black alert(count); //3 var item=colors.pop(); //pop出最后的元素 alert(item); //black alert(colors.length); //恢复为2 </script>
6. 数组队列操作
此种方式遵循先进先出的原则,和排队一样。
<script> var colors = new Array(); var count = colors.push("red","green"); alert(count); count = colors.push("black"); alert(count); var item = colors.shift(); //队列操作 alert(item); //先出red alert(colors.length); //长度2 </script>
7. 排序操作
从小到大排序sort;倒序排序reverse。此处要注意直接使用sort时是按照unicode的顺序来的,想要正常排序要创建排序函数sortNumber。
<script> function sortNumber(a, b) { return a - b; // } var values = [0, 1, 15, 5, 10]; var me = values.slice(0); //相当于克隆了代码 // function gettime() { // var myDate = new Date(); // return myDate.getTime(); // } // var start = gettime(); values.sort(); document.write(values + "<br>");//0,1,10,15,5注意Unicode顺序 values.sort(sortNumber); document.write(values + "<br>");//0,1,5,10,15 me.reverse(); document.write(me + "<br>");//10,5,15,1,0 // var end = gettime(); // var time = end - start; // document.write(time+"<br>"); </script>
另一个从大到小的排序:
<script> function compare(value1, value2) { if (value1 < value2) { return 1; } else if (value1 > value2) { return -1; } else { return 0; } } var values = [0, 5, 1, 10, 15]; values.sort(compare); alert(values);//15,10,5,1,0 </script>
8. 数组操作
- 连接:concat
- 截取:slice
colors2 = colors.concat("yellow", ["black", "brown"]); //连接 colors3 = colors.slice(1, 4); //截取1-4
- splice(开始位置,删除个数,插入元素)
splice(0, 2); //删除 splice(2, 0, "red", "green");//插入两个数组元素 splice(2, 1, "red", "green");//替换
三、对象
对象是JavaScript中的一种复合数据类型,可以把多个数据集中到一个变量中,并且给其中的每个数据起名字。换言之,对象是一个属性集合,每个属性都有自己的名字和值。
格式如下:var o = new Object(); //空的对象
var ciclr = { x : 0, y:0, radius :2};
1. 访问对象属性(通过运算符)
如:
var book = new Object(); book.title = "HTML5学习" book.translator = "楚留香"; book.chapter1 = new Object(); book.chapter1.title = "HTML5简介"
即使构造的时候不存在的属性也可以在之后随时增加。
2. 删除对象属性
delete book.chaspter1;或者book.chapter1 = null;
3. 遍历所有属性
for (var x in o)
<script> var o = new Object(); o.name = "Jack Chu"; o.age = 20; o.salary = 300; for (var x in o) { // alert(x); 错误,会显示元素名 // alert(o[x]); alert(x + "=" + o[x]); } </script>
4. 构造方法
- 构造函数
1. 不能直接制造对象;
2. 通过this来定义成员;
3. 没有return;
<script> function Rect(w, h) { this.width = w; this.height = h; this.area = function () { return this.width * this.height; }; } var r = new Rect(5, 10); alert("长方形的面积是" + r.area()); r.width = 10; alert("长方形的面积变成了" + r.area()); </script>
只定义了构造函数就可以构造任意数量的对象。
- 原型对象
1. prototype属性制定了他的原型对象,可以用 “ . ”运算符直接读它的的原型对象的属性。
2. 档写这个属性时才在它自己内部产生实际的属性。
<script> function Person() { } Person.prototype.name = "Jack"; Person.prototype.age = 20; Person.prototype.job = "Software Engineer"; Person.prototype.sayName = function () { alert(this.name); }; var person1 = new Person(); // person1.sayName(); //Jack var person2 = new Person(); // person2.sayName(); //Jack // alert(person1.sayName == person2.sayName); //true person1.name="Chu"; alert(person1.name);//Chu from instance alert(person2.name);//Jack from prototype </script>
关于prototype的更多解释如下:
JS中的protype和Java的继承不是一个概念的。Java中的继承是类继承,而JS中是没有类的,只有对象(哪怕ES6中有class语法也是一种语法糖,不是真正的‘类’)。 JavaScript 中的对象有一个特殊的 [[Prototype]] 内置属性,表示对其他对象的引用。几乎所有的对象在创建时 [[Prototype]] 属性都会被赋予一个非空的值。 比如一个对象 var a = { b:1 } 当进行a.b操作的时候会触发对象的[[GET]]操作,这个操作会检查对象是否有这个属性,有就使用没有就到 [[Prototype]] 属性上去查找,一层层查找上去直到[[Prototype]] 为空,这就是原型链的概念。
prototype只保留了对原型链上属性和方法的引用,你可以理解成通过它可以访问自身和原型链上属性或方法,但其实本身对象上的只是一个指针,并不拥有这些属性
在Java中类被实例化,会把把类的行为复制到对象中,但是原型继承并不会复制对象属性,而是相当于在两个对象中创建一个关联,这样一个对象可以顺着原型链查找到另一个对象的属性或方法
<script> function Person(name, age, job) { this.name = name; //代表不共享,是自己的 this.age = age; this.job = job; this.friends = ["Jack", "Martin"]; } Person.prototype = { constructor: Person, sayName: function () { alert(this.name); } }; var person1 = new Person("Nics", 29, "Software Engineer"); var person2 = new Person("Ian", 32, "Doctor"); person1.friends.push("Marry"); alert(person1.friends); alert(person2.friends); alert(person1.friends == person2.friends);//false alert(person1.sayName == person2.sayName);//true </script>