JavaScrpit筆記
數據類型
ECMAScript中有5種簡單數據類型(也稱為基本數據類型):Undefined、Null、Boolean、Number和String。還有1種復雜數據類型——Object,Object本質上是由一組無序的名值對組成的。
ECMAScript的變量是松散類型的,所謂松散類型就是可以用來保存任何類型的數據
例如:
var age = 12;//不用int修飾
typeof運算符
雖然變量無類型之分 但其值是有類型的 用typeof運算符判斷
"undefined"——如果這個值未定義;
"boolean"——如果這個值是布爾值;
"string"——如果這個值是字符串;
"number"——如果這個值是數值;
"object"——如果這個值是對象或null;
"function"——如果這個值是函數
undenfined類型 和 null類型\
undefined值是派生自null值的
alert(undefined == null) // true
一般的把var 定義的沒有初始化的值定義為 undefined 而null是用來初始化未賦值的對象的。
Boolean類型
注:Boolean類型的字面量的值區分大小寫。 true和flase 對 True和Flase 錯
NUmber類型
NaN(NOt a NUmber)例如:
var num = 10/0
String類型
string 是存儲在棧中 所以字符串一旦創建就不能改變
Object類型
函數
JS中的函數也是對象 也有相應的屬性和方法
屬性:length(argument數組的長度)和prototype(繼承和原型構造函數時特別有用)
方法:call()和apply() 用來擴大作用域 (可以借用父類的構造函數 和原型鏈一起構成組合繼承)
定義函數
-
函數聲明
function functionName(){ // 函數體}
-
函數表達式
var sayHi = function(){// 函數體} //函數是對象的體現 有一個特別好玩的功能:模仿塊級作用域 (function(){ //for(var i ...) })() //i在for循環有用
模擬重載
JS中沒有重載的概念 但可以用 arguments對象來模擬重載
例如:
//變相實現重載
function add(){
if(arguments.length == 1){
alert(argumemts[0]+10);
}
if(arguments.length == 2){
alert(argumemts[0]+argument[1]+10);
}
}
add(10);
add(10,20);
繼承和創造對象
理解prototype屬性:
無論什么時候,只要創建了一個新函數,就會根據一組特定的規則為該函數創建一個prototype屬性,這個屬性指向函數的原型對象。在默認情況下,所有原型對象都會自動獲得一個constructor(構造函數)屬性,這個屬性包含一個指向prototype屬性所在函數的指針。就拿前面的例子來說,Person.prototype. constructor指向Person。而通過這個構造函數,我們還可繼續為原型對象添加其他屬性和方法。
通過prototype屬性指向的原型對象 創建的對象
function Person(){
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){
alert(this.name);
};
}
var person1 = new Person();
person1.sayName(); //"Nicholas"
var person2 = new Person();
person2.sayName(); //"Nicholas"
alert(person1.sayName == person2.sayName); //true
而通過構造函數創建的對象 每個對象的屬性和方法在內存中各有一份 其中一個對象的改變不影響其他對象的屬性和方法(prototype定義的對象則不同)
繼承就是把prototype屬性指向的原型對象 進行重寫
function SuperType(){
this.property = true;
}
SuperType.prototype.getSuperValue = function(){
return this.property;
};
function SubType(){
this.subproperty = false;
}
//繼承了SuperType
SubType.prototype = new SuperType(); // 重寫SubType.prototype指向的原型對象
SubType.prototype.getSubValue = function (){
return this.subproperty;
};
var instance = new SubType();
alert(instance.getSuperValue()); //true
總結:其實創建對象和繼承還有很多的方式 可以參考JavaScript高級程序設計(第3版)
閉包(函數和函數非不清的關系)
js閉包的來源:return函數名或者匿名函數 ②函數可以嵌套函數
形式:閉包就是一個函數,兩個函數彼此嵌套,內部函數就是閉包(需要return)
function f1(){
var age = 20;
var height = 170;
function f2(){
console.log("年齡:"+age+"-身高:"+height);
}
return f2;
}
//ff--> 函數名
var ff = f1();
ff();//年齡:20-身高:170