一。詞法結構
1.區分大小寫
2.注意//單行/*多行注釋*
3.字面量(直接量 literal)
12 //數字
5.8 //小數
“hello”
‘hello’
true
/js/gi //正則
null //空
{x;1,y:2}
[1,2,3,4]
- 标示符{變量}和保留字
- 分号可以省略但是可能産生問題,js會自動補;
var y = x+f
(a+b).toString()
等價于
var y = x+f(a+b).toString();
二.類型。值和變量
1.原始類型 數字。字元串和布爾 null空 undefined 未定義
2. 對象類型
3.類 Array Function Date RegExp Error
4.js 解析器 中內建了垃圾回收
5.任意js的值dou可以轉為布爾值
undefined
null
-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.== 和 ===
==用于一般比較,===用于嚴格比較,==在比較的時候可以轉換資料類型,===嚴格比較,隻要類型不比對就傳回flase。
8.類型轉換
var n = 17;
alert(n.toString(2)); //二進制 10001
alert (n.toString(8)); // 021
alert (n.toString(16)); //0✖21
alert (n.toString (10)); alert(n.toString());
9.toString() valueOf()
var date = new Date(2011,1,3);
date.valueOf() 傳回毫秒數代表的時間
10.JS是動态類型 var n = 10; 程式運作期間 才會确定變量的類型
11. 變量作用域
函數作用域和聲明提前
函數内定義的變量 聲明自動提前到函數頂部
12. 作用域cope chain
在不包含函數的函數體内,作用域鍊有兩個對象,第一個是定義函數.參數和局部變量的對象,第二個是全局對象。在一個嵌套函數體内,作用域鍊上至少有三個對象。定義一個函數時,它儲存了一個作用域鍊調用函數時,它建立一個新的對象存儲它的局部變量,并将這個對象添加到儲存的那個作用域鍊上,同時建立一個新的更長的表示函數調用作用域的“鍊”。對于嵌套函數每次調用外部函數時,内部函數會重新定義一遍。每次調用外部函數的時候作用域鍊是不同的。
13. delete in eval void
第 一章 對象
- 對象的基本操作 create set query delete test enumerate
- 對象的屬性特性 可寫 可枚舉 可配置(是否可删除)
- 對象的對象特性
對象的原型 prototype
對象的類 标示對象類型的字元串
對象的擴充标記 是否可添加新屬性
//建立對象的三種方法
- 對象直接量
var empty={};
var point = {x:0,y:0};
- new建立對象
var 0 = new Object{}; //空對象 和{}一樣
var a = new Array{};
- Object.create{}
var o1 = Object.create{(x:1,y:2)}; //o1 繼承自對象原型{x:1,y:2}
var o2 = Object.create{null};//o2不繼承任何屬性和方法
var o3 = Object.create(Object.prototype);
//空對象和{}new Object()一樣
7.屬性的操作 作為關聯數組的對象
object.property
object["property"] 散列 映射 字典 關聯數組
8.繼承
js的繼承隻能從父類擷取屬性的值,而不能修改原型鍊
如果對象book為null或undefined
book.subtitle.length會報錯
解決方法
var len = book && book.subtitle && book.subtitle.length;
删除屬性
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: 0,
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()
擴充Object.prototype 書 P137
11.對象的三個屬性
prototype class extensible attribute
查詢對象的原型
ecmascript5中 Object.getPrototypeOf(o1)
ecmascript3中 o1.constructor.prototype
通過對象直接量或new Object()方式建立的對象
包含一個constructor的屬性,指Object()的構造函數
constructor.prototype才是真正的原型
p.isPrototypeOf(o)檢測對象p是否是o的原型
//擷取對象的類型 字元串
Object.prototype.toString.call(o1).slice(8,-1)
12.對象的可擴充性
對象是否可以新加屬性
Object.preventExtensions() 設定對象不可擴充
Object.isExtensible()
Object.seal() 除了将對象設定為不可擴充,還将屬性設定為不可配置
Object.freeze()
除了将對象設定為不可擴充,将屬性設定為不可配置,還把屬性設定為隻讀
第8章 函數
1.函數調用,方法調用
function t(){ }
t(); 函數調用 this是全局對象 嚴格模式下是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();
每次調用函數,都會生成一個新的作用域鍊。包括新的内部變量