HTML 学习笔记 May 10,2017 js函数调用过程内存分析、js函数细节、js一维数组细节、二维数组转置、js面向对象编程介绍、类(原型对象)和对象、类和对象细节、创建对象的几种方式、this关键字详解
var myvar = jiSuan('abc');
js 函数
var num1 = window.prompt('请输入第一个 num');
var num2 = window.prompt('请输入第二个 num');
var operator = window.prompt('请输入运算符');
num1 = parseFloat(num1);
num2 = parseFloat(num2);
// 如何调用函数
document.write("res = " + jiSuan(num1,num2,operator));
//自定义函数
// 输入两个数,再输入一个运算符
function jiSuan(num1,num2,operator) {
var res = 0;
if (operator == '+') {
res = num1 + num2;
} else if (operator == '-') {
res = num1 - num2;
} else if (operator == '*') {
res = num1 * num2;
} else {
res = num1 / num2;
}
return res; // 返回
}
var myvar = text('abc');
// 如果 text 函数没有返回值,但是你又接收了,则返回 undifined ,如果有返回值,则是什么就返回什么.
function abc2 () {
// 在 js 中有一个 arguments ,可以访问所有传入值
// window.alert(arguments.length);
// 遍历所有的参数
for (var i = 0;i<arguments.length;i++) {
window.alert(arguments[i]);
}
}
JS 中的数组,可以存放更种数值,不区分类型
// 老王的王八体重
var weights = [3,5,1,3.4,2,50];
var all_weight = 0;
var avg_weight = 0;
// 数组的遍历
for (var i = 0;i<weights.length;i++) {
all_weight += weights[i];
}
avg_weight = all_weight/weights.length;
// 如果你想知道它的数据类型是什么
window.alert(avg_weight.constructor); // 可以打印出来它是什么数据类型 function Number() {[native code]}
document.writeln("总体重是" + all_weight + "平均体重是" + avg_weight.toFixed(2)); // toFixed(2) 就是保留两位小数.
js 中的数组是引用传值
数值传值原理图:
数组传值原理图:
var str = "hello world abc";
var arr = str.split(" "); // 用空格来分隔字符串成数组
window.alert(arr);
// 还可以使用 for in 进行循环
for (var key in arr) {
window.alert(key + "= " arr[key]);
}
// 二分查找
二分查找有个前提,该数组是有序的.如果不是有序的,就不能用二分查找
Math.floor((1+2)/2); // 这样就是 1
// 二分排序
var arr = [1,4,6,8,90,800];
// 思路:找到数组的中间数(midVal),和你要查找的数(findVal) 进行比较,如果 midVal > findVal 则说明 findVal 在数组的左边,就把该数组二分(就只在左边查找)
function binarySearch(arr,findVal,leftIndex,rightIndex) {
// 防止无穷递归
if (leftIndex>rightIndex) {
// 提示找不到
document.writeln("找不到");
return;
}
// 找到中间这个值
var midIndex = Math.floor((leftIndex+rightIndex)/2);
var midVal = arr[midIndex];
// 比较
if (midVal>findVal) {
// 在左边找
binarySearch(arr,findVal,leftIndex,midIndex-1);
} else if (midVal<findVal) {
// 在右面找
binarySearch(arr,findVal,midIndex+1,rightIndex);
} else {
document.writeln("找到 下标为"+midIndex);
return;
}
}
对二维数组进行转置
var arr = [[2,4,6,8],[8,9,0,-1],[9,6,2,1]];
// 定义一个新的数组
var arr2 = [];
// 初始化,定下有多行
for (var i = 0;i<arr[0].length;i++) {
arr2[i] = [];
}
// 可以动态的添加数据
// 遍历旧数组
for (var i = 0; i<arr.length;i++) {
for (var j = 0; j<arr[i].length;j++) {
arr2[j][i] = arr[i][j];
}
}
// 成功!遍历 arr2 数组就是一个转置数组
for (var i = 0; i<arr2.length;i++) {
for (var j = 0; j<arr2[i].length;j++) {
document.writeln(arr2[i][j] + " ");
}
document.write("
");
}
js 面向(基于)对象编程
js 中基于对象 == js 面向对象
js 中没有类 class ,但是它取了一个新名字叫原型对象。因此,类等同于 原型对象。
// 这里就是一个 Cat 类
function Cat() {
}
//
Cat();// 如果这样用,Cat()就是函数
var cat1 = new Cat();// 如果这样用,就是 类
// 这时 cat1 就是一个对象(实例)
cat1.name = "小白";
cat1.age = 3;
cat1.color = "白色";
// js 中对象的属性可以动态的添加
// 属性没有限制.
window.alert(cat1.name);
window.alert(cat1.age);
window.alert(cat1.color);
创建对象:
var 对象名=new 类名();
function Person(){}
var a = new Person();
window.alert(a.constructor); // a 对象实例的构造函数
window.alert(typeof a); // a 的类型是 object
var b = 123;
window.alert(b.constructor);
window.alert(typeof b); // b 的类型是 number
var c = "123";
window.alert(c.constructor);
window.alert(typeof c); // b 的类型是 string
// 如何判断一个对象实例是不是 Person 类型
if (a instanceof Person) {
window.alert("a 是 Person");
}
// 也可以用这种方法 来判断 a 是不是 Person 类型
if (a.constructor==Person) {
window.alert("a 是 Person");
}
var b = cat1;
b.name = "逗逗";
window.alert(b.age + "名字" + b.name + cat1.name); // 这里 a 和 b 的名字都变成了"逗逗"
调用私有属性
function Person() {
var name="abc"; // 如果这样去使用 name 这个属性是私有的
var age=900;
this.name2 = "abc2"; // this.name2 表示 name2 这个属性是公开的
this.show=function() { // 如果你一定要访问私有属性,则需要定义一个公开方法
window.alert(name + " " + age);
}
}
var p1 = new Person();
p1.show();
这个打印出来是 90