这是我自己平时忽略的一些知识点,记录下来。
一、js中两种类型 :值类型和引用类型
比如 var num=5;与 var num=new number(5);
二、undefined 与null
undefined:表示对象没有被定义或者没有被初始化;是从null派生出来的
null:表示一个尚未存在的对象占位符;
alert(null==undefined); //输出“true”
三、typeof运算完返回的是字符串
typeof undefined: “undefined”
null: “object”
string: “string”
number : “number”
boolean: “Boolean”
function: “function”
object: “object”
所以 if(typeof num2=="undefined"){ } ,而不是if(typeof num2==undefined){ }
还要提醒,一个没有返回值的function(或者直接return返回)实际上返回的是undefined。
function voidMethod()
{
return;
}
alert(voidMethod()); //输出 "undefined"
四、js中的变量创建
局部变量:var bianliang="hehe";(显示定义)
全局变量: bianliang="haha"; (隐式定义)
五、学习三种命名成员方法
Camel命名法:首字母小写,接下来的每个单词首字母大写。
比如:var firstName, var myColor;
Pascal命名法:首字母大写,接下来的每个单词首字母大写。
比如:var FirstName, var MyColor;
匈牙利类型命名法:在以Pascal命名法的变量前附加一个小写字母来说明该变量的类型。例如s表示字符串,则声明一个字符串类型的变量为:
比如:var sFirstName;
在JavaScript中应该使用匈牙利命名法命名变量,使用Camel命名法命名函数。
虽然JavaScript中的变量可以变换类型,但是熟悉强类型语言的人都知道,这是很危险的做法,很有可能最后在使用时都无法确定变量的类型。所以应该尽量使用匈牙利命名法命名变量,下面是匈牙利命名法的前缀列表:
类型 前缀 示例
Array a aNameList
Boolean b bVisible
Float f fMoney
Function fn fnMethod
Int i iAge
Object o oType
Regexp re rePattern
string s sName
可变类型 v vObj
六、全局变量和闭包
全局变量的作用于是当前窗口Window对象,所以一个全局对象就是一个Window对象的一个属性;
举例: function test() { sName = " ziqiu.zhang "; }
test();
alert(sName);
alert(window.sName); //结果一样
闭包:说白了就是包含变量的函数,由于在该函数中用到变量。
例子:
<script type="text/JavaScript">
function start()
{
var count = 10;
//设置定时器,每隔3秒钟执行一次
window.setInterval(function()
{
document.getElementById("divResult").innerHTML += count + "<br/>";
count++;
}, 2000);
};
start();
</script>
说明匿名函数function就是一个闭包,因此里面用到的count变量会一直保存在闭包里。
七、javascript中的 function
程序是由数据和逻辑两部分组成的;基本的数据类型可以存储各类数据,而function可以存储逻辑。
(1)function可以声明一个方法和一个类型(也就是类)
例子: function testMethod(){ } function Car(){ }
(2)js中function的本质: function 变量是引用类型,内容存储的是指向function内容的指针,js中的对象有一个特点就是里面不管属性还是方法都是以name/value这种字典数组存储的。
例子 alert(testMethod); 会弹出整个方法内容。
(3)js中的function不支持重载,因为js中同名的function只能有一个,并且function函数的参数可以是任意个。但是function有个重要的参数就是 arguments,可以访问到传入function的所有参数信息。根据参数的信息在函数内部if else 来完成 重载功能,but不提倡。
例子: arguments.length; arguments[index]分别可以获取传入参数的个数以及每个参数的信息
(4)js中的this指向函数调用者(此特性在jQuery中表现为链式编程)
例子: var oName = { name: "zhang" }; //这一个object的数据类型
window.name = "I am window";
//showName是一个函数,用来显示对象的name属性
function showName() //Window下的一个全局方法
{
alert(this.name); //哪个对象调用这个函数就显示哪个对象的name
}
//相当于函数的声明
oName.show = showName; // 根据function的本质可以看作是一个属性调用
window.show = showName;
showName(); //输出 输出为 "I am window"
oName.show(); //输出 输出为 "zhang"
window.show(); //输出 输出为 "I am window"
八、js中的原型(prototype)
(1) prototype:表示声明的函数和属性属于动态的;
区别动态和静态属性和方法,动态的属性和方法必须由实例化的对象调用,静态方法和属性直接由类调用。
声明和调用时的区别:举例说明:
声明:function staticClass() { }; //声明一个类
staticClass.staticMethod = function() { alert("static method") }; //创建一个静态方法
staticClass.prototype.instanceMethod = function() { "instance method" }; //创建一个实例方法
调用:staticClass.staticMethod();
staticClass.instanceMethod(); //语句错误, 无法运行.
//实例方法需要首先实例化后才能调用:
var instance = new staticClass();//首先实例化
instance.instanceMethod(); //在实例上可以调用实例方法
js中正是由于使用prototype才使得js面向对象,才使得对象可以调用方法和属性(使用this声明动态属性)
当前创建类有好多中方法,但是最常见的还是--动态原型方法,动态原型方法的精髓在于使用prototype声明实例方法,使用this声明实例属性。
(2) 使用原型链实现继承
在JavaScript中可以通过prototype来实现对象的继承。
举例:GoodCar.prototype = new Car(); // GoodCar这个类继承Car这个类
此时GoodCar这个类中已经包含父类Car的所有属性和方法了,接下来就是添加自己的属性和方法了。
function GoodCar(){ }
GoodCar.prototype = new Car();
GoodCar.prototype.run = function() { alert("run fast"); }
GoodCar类自身的方法一定要在实现继承语句之后定义;
为什么称这种方式为原型链继承呢?因为GoodCar的prototype是Car,而Car的prototype是object,也就是说GoodCar也具有object对象所有的属性和方法。这是一个“链”的结构。