天天看點

js部分的總結

一。詞法結構

  1.區分大小寫

2.注意//單行/*多行注釋*

3.字面量(直接量 literal)

12 //數字

5.8 //小數

“hello”

‘hello’

true

/js/gi  //正則

null //空

{x;1,y:2}

[1,2,3,4]

  1. 标示符{變量}和保留字
  2. 分号可以省略但是可能産生問題,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

第  一章 對象

  1. 對象的基本操作  create set query delete test enumerate
  2. 對象的屬性特性 可寫 可枚舉 可配置(是否可删除)
  3. 對象的對象特性

對象的原型 prototype

對象的類  标示對象類型的字元串

對象的擴充标記  是否可添加新屬性

//建立對象的三種方法

  1. 對象直接量

var empty={};

var point = {x:0,y:0};

  1. new建立對象

var 0 = new Object{}; //空對象  和{}一樣

var a = new Array{};

  1. 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(); 

每次調用函數,都會生成一個新的作用域鍊。包括新的内部變量