標籤:src ret tostring 分享 總結 時間 desc empty valueof
一、詞法結構
1、js裡面區分大小寫
2、注釋分為兩類: // 單行注釋 /*多行注釋*/
3、字面量(直接量 literal)
12 //數字 number
"hello" ‘hello‘ //字串 string
true false //布爾類型
null //空類型
/js/gi //正則
{x:1,y:2} //字典
[1,2,3,4] //數組
4、標示符(變數)和保留字
5、分號可以省略但是可能會產生問題,js會自動補全;
二、類型、值和變數
1、原始類型: 數字、字串和布爾 、null空 undefined未定義
2、物件類型
3、類 Array Function Date RegExp Error
4、js解析器 中整合了記憶體回收
5、任意js的值都可以轉為布爾值
undefined
null
0
-0
NaN
"" 都被轉換為false
6、封裝對象
var s = "hello"; //原始類型(沒有方法)
s.len = 4; //當調用原始類型的屬性或方法的時候(原始類型是沒有屬性和方法的)
//只要引用了字串的屬性個方法,就會調用new String(s)把原始類型,封裝成對象
//以後調用s.len是調用String對象的屬性和方法,一旦引用結束,新建立的臨時對象會銷毀
var n = s.len; //此時為undefined
alert(n); //調用字串 布爾 數位屬性或方法時,建立的臨時對象。是封裝對象 顯示定義封裝對象
var s = new String("hello");
var s = "hello"; //兩個是不同的
7、==和===
8、類型轉換
var n = 17;
alert(n.toString(2)); //二進位 10001
alert(n.toString(8)); // 021
alert(n.toString(16)); //0x21
alert(n.toString(10));
alert(n.toString());
9、toString() value()
var date = new Date(2011,1,3);
date.valueOf() 返回毫秒數代表的時間
10、js是動態類型 var n = 10; 程式運行期間 才會確定變數的類型
11、變數的範圍
函數的範圍和聲明提前
函數內定義的變數 聲明自動提前到函數頂部
12、範圍鏈 scope chain
在不包括函數的函數體內範圍鏈有兩個對象,第一個是自訂函數,參數和布局變數的對象,第二個是全域對象
在一個嵌套函數體內,範圍鏈上至少有三個對象
定義一個函數時,它儲存了一個範圍鏈。調用函數時,它建立一個新的Object Storage Service它的局部變數,並將將這個對象添加到儲存的那個範圍鏈上,同時建立一個新的更長的表示函數調用範圍的"鏈"。對於嵌套函數每次調用外部函數時,內建函式會重新定義一遍。每次調用外部函數的時候範圍鏈是不同的。
13、delete in eval void
三、對象
1、對象的基本操作 create set query delete test enumetare
2、對象的屬性特性 可寫 可枚舉 課配置 (是否可刪除)
3、對象的對象特徵
對象的原型 prototype
對象的類 標記物件類型的字串
隊對象的擴充標記 是否可添加新屬性 //建立的擴充的三種方法
4、對象直接量
var empty = {};
var point = {x:0,y:0};
5、new建立對象
var o = new Object(); //Null 物件 和{}一樣
var a = new Array();
6、Object.create()
var o1 = Object.create({x:1,y:2}); //o1繼承自對象原型{x:1,y:2}
var o2 = Object.cteate(null); //o2不能繼承任何屬性個方法
var o3 = Object.create(Objec.prototype); //Null 物件和{}new Object()一樣
7、屬性的操作 作為關聯陣列的對象
object.property
object["property"] 散列 映射 字典 關聯陣列
8、繼承
繼承對象book為null或undefined
book.subtitle.length 會報錯
解決方案
var len = book&&book.subtitle&&book.subtitle.lenghth;
刪除屬性
delete book,subtitle
檢測屬性 in hasOwnpreperty() propertyIsEnumerable()
var o = {x:1};
"x" in o
"toString" in o
hasOwnPreperty();判斷屬性是否是自己的。繼承屬性返回false
propertyIsEnumerable()只有是自有屬性,並可枚舉
擷取所有的屬性
Object.keys()
Object.getOwnPropertyNames()
9、屬性getter和setter
var o = {
x:o,
y:1,
set r(value){value = this.r;},
get r(){return this.x + this.y;}
};
x 資料屬性,r存取器屬性
10、屬性的特徵 ecmascript5 老的ie不支援如下用法
資料屬性的特性:值value可寫性writable
可枚舉 enumerable
可配置 configurable
存取器屬性特性: get set
可枚舉 enumerable
可配置 configurable
//返回{value:1,writable:true,emunerable:true,configurable:true}
Object.getOwnPropertyDescriptor{{x:1},x}
//查不到屬性 返回 undefined
設定屬性的特性 不能修改繼承的屬性特性
Object.defineProperty()
//設定不可枚舉屬性
var o = {};
Object.defineProperty(o,"x",{
value:1,
writable:true,
emunerable:false,
configurable:true
})
//設定唯讀
Object.defineProperty(o,"x",{writable:false})
//修改多個屬性特性
Object.defineProperties()
11、對象的三個屬性
prototype class extensible attribute
查詢對象的原型
ecmascript5 中 Object.getPrototypeOf(o1)
ecmascript3 中 o1.constructor.prototype
通過對象直接量或 new Object()方式建立的對象
包含一個 constructor 的屬性,指Object()的建構函式
constructor.prototype 才能真正的原型
p.isPrototypeOf()檢測對象p是否是o的原型
//擷取對象的類型 字串
Object.prototype.toString.call(o1).slice(8,-1)
12、對象的可擴充性
對象是否可以新加屬性
Object.preventExtensions() 設定對象不可擴充
Object.isExtensible()
Object.seal() 除了將對象設定為不可擴充,還將屬性設定為不可配置
Object.freeze()
除了將對象設定為不可擴充,將屬性設定為不可配置,還把屬性設定為唯讀、
四、函數
1、函數調用,方法調用
function t(){ }
t(); 函數調用 this是全域對象 strict 模式下是undefined
var o = {a:function(){}};
o.a() 方法調用 this是當前調用的對象
2、建構函式調用
var o = new Object(); var o= new Object;
o繼承自建構函式的prototype屬性 內部的this是此對象
var r = new o.m();中的this不是o
3、P184 函數的執行用到了範圍鏈,這個範圍鏈是函數定義的時候建立的。
嵌套的函數f()定義在這個範圍鏈裡,其中的變數scope是局部變數
範圍鏈
調用s()將建立函數s的執行環境(調用對象),並將該對象置於鏈表開頭,
然後將函數t的調用對象連結在之後,最後是全域對象。然後從鏈表開頭尋找變數name
調用ss() ss() ==> t() ==> window
name="lwy";
function t(){
var name="tlwy";
function s(){
var name="slwy";
console.log(name);
}
function ss(){
console.log(name);
}
s();
ss();
}
t();
每次調用函數,都會產生一個新的範圍鏈。包括新的內部變數
JavaScript部分總結