1. 程式人生 > >JS權威指南需要注意的知識點(1-6章)

JS權威指南需要注意的知識點(1-6章)

客官快來看一看了,都給你濃縮好了,確定不進來摟一眼嘛,走過路過不要錯過喲

in運算子

  in運算子希望它的左運算元是一個字串或可以轉化為字串,希望它的右運算元是一個物件,如果右側的物件擁有一個名為左運算元值的屬性名,則表示式返回true,否則為fasle 

var obj = {X:1,Y:2}
"X" in obj   // true
"Z" in obj  //false
"toString" in obj  //true:物件繼承了toString()方法

var data = [7,8,9]
"0" in data   //true: 查詢的是下標0
1 in data    //true:查詢的下標1    
3 in data    //  fasle: 下標3不存在
"toString" in obj //true:物件繼承了toString()方法
 

  注意點:無論是物件還是陣列,toString等從原型鏈上繼承的方法也能查詢的到,但右運算元為陣列時,若為數字或者可轉化成數字的字串則查詢的是下標

 

邏輯與(&&)

  在賦值的時候需要要特別注意:左假返左,左真返右

let a = false && 1   //a:false
let a = true && false //a:false
let a = true && 1 // a: 1

  即賦值時&&左邊為假,則直接返回左邊,不管右邊真假都不在繼續看右邊,若左邊為真則直接返回右邊,無論右邊真假

 

eval()

  eval()是js用來解釋執行原始碼組成的字串的一個函式,它只接受一個引數,若引數不是字串則返回該引數,而是字串則將字串當做JS原始碼進行編譯。

  特點:

    使用了呼叫他的變數作用域環境,並且具有改變區域性變數的能力

    直接呼叫eval時,他會在呼叫他的上下文作用域執行,而間接呼叫則會使用全域性物件作為其上下文作用域

    嚴格模式下,只允許eval執行查詢或者更改區域性變數,不允許新建

 

delete

  刪除陣列元素時並不會改變陣列的長度,即相當於將被刪除的元素設定為undefined

 

var 

  var宣告的變數無法通過delete刪除

    變數宣告語句會進行提升,賦值語句則還在語句原來的位置執行

var a = 12;
delete a;
console.log(a); //12

 

function

  函式宣告語句會被進行函式宣告提升,也就是說可以在一個函式宣告之前呼叫它

 

if else

  else總是和就近的if想匹配

 

for in

  for in迴圈遍歷時不會遍歷物件的所有屬性,而只是會遍歷所有的可列舉屬性,例如toString這種內建方法則並不會被遍歷出來

 

try  catch finally

  不管try拋錯不拋錯,finally始終會執行

   當try由於return,continue,break語句使得直譯器跳出try語句塊時,直譯器在執行新的目的碼時會先執行finally中的邏輯

         如果finally使用了return,continue,break或者throw語句使整個程式發生跳轉,不管try是否丟擲異常,這個方法仍然會正常返回

with

  用於臨時擴充套件作用域鏈,步驟:將擴充套件的物件新增到作用域鏈頭部,執行語句,然後恢復作用域鏈。嚴格模式禁用,非嚴格模式也不推薦使用,因為會降低效能

   with提供了讀取物件屬性的快捷方案,但是並不能建立物件的屬性

 use strict

  意為使用嚴格模式,只有在實現了ECMAScript的JavaScript直譯器中才起作用

  只能出現在程式碼的開始或者函式體的開始

  在嚴格模式中呼叫函式的一個this是undefined,而在非嚴格模式下則為全域性物件

  判斷瀏覽器支援不支援嚴格模式(即判斷有沒有實現ECMAScript5)

var hasStrictMode = (function(){
   "use strict";
   return this === undefined  
}())

 

物件

  JS物件不僅僅是字串到值的對映,除了保持自有的屬性,JS物件還可以從一個稱為原型的物件繼承屬性,物件的方法通常是繼承的方法,這種'原型式繼承' 是JS的核心特徵。

    定義物件時,屬性名可以是包含空字串在內的任意字元,但物件中不能存在兩個同名的屬性

var test = {
     '':123       
}    
console.lof(test[''])    // 123

  JS物件和屬性劃分

    內建物件:由ECMAScript規範定義的物件或類,如陣列,函式,日期和正則

    宿主物件:由JavaScript直譯器所嵌入的宿主環境所定義的,客戶端中表示網頁結構的HTMLElement物件均是宿主物件

    自定義物件:是由執行中的JavaScript程式碼建立的物件

    自有屬性:是直接在物件中定義的屬性

    繼承屬性:是在物件的原型物件中定義的屬性

 

Object.create()

  它建立一個新物件,第一個引數是這個物件的原型

   建立一個沒有原型的物件: Object.create(null)

 

物件

  內建建構函式的原型是隻讀的

 

delete

  delete只是斷開屬性和宿主物件的聯絡,而不會去操作屬性中的屬性,例子在下方

  delete只能刪除自有屬性,不能刪除繼承屬性(要刪除繼承屬性必須從定義這個屬性的原型物件上刪除,而且會影響所有繼承了這個原型的物件)

  delete也不可以刪除那些可配置性為false的屬性

a = {p:{x:1}}
b=a.p
delete a.p
console.log(a)  // 1

 

列舉屬性名稱的方法

   1. for in  會遍歷物件中所有的可列舉屬性(包括自有屬性和繼承屬性)

    2.object.keys() 返回一個數組,包括可列舉的自有屬性

    3.Object.getOwnPropertyNames() 返回所有自有屬性的名稱

 

Object.getOwnPropertyDescriptor()

  獲取自有屬性的描述符

 

Object.defineProperty()

  設定屬性的特性,但是隻能設定或者修改自有屬性

 

Object.getPrototypeOf()

  用來查詢物件的原型

 

isPrototypeOf()

  檢測一個物件是否是另一個物件的原型

 

物件的三個屬性

   原型屬性: 用來繼承屬性的

   類屬性: 是一個字串,表示物件的型別資訊

   可擴充套件性:表示是否可以給物件新增新屬性,內建物件和自定義物件是顯式可擴充套件的,但是宿主物件的是否可擴充套件由JS引擎來決定

 

JSON

  1.json的語法是JS語法的子集,它並不能表示JS裡面的所有值,支援物件,陣列,無窮大數字,true,false,null,並且可以序列化和還原,注意:NAN,Infinity和-Infinity序列化後的結果是null

   2.日期物件序列化的結果是ISO格式的日期字串,但JSON.parse()依舊保留他們的字串形態,而不會將他們還原為原始日期物件

   3.函式,RegExp物件和Error物件以及undefined不能序列化

   4.JSON.stringify()只能序列化物件的可列舉的自有屬性(即呼叫Object.keys()所列出的)

 

toString()

  注意:

var test = {a:1,b:2}.toString()
console.log(test)    // [object Object]

  由於這種預設的toString()並不會攜帶很多有用的資訊,有很多類都攜帶著自定義的toString(),例如Array.toString(),Date.toString(),以及Function.toString()等

 

toLocaleString()

  返回一個表示這個物件的本地化字串,Object中預設的toLocaleString()方法並不做任何本地化自身的操作,僅僅是呼叫toString()方法並返回對應值,但是Date和Number則對其做了定製,可以用它來對時間,日期,時間做本地化的轉換。Array類的toLocaleString()和toString()不同的是每個陣列的元素都會呼叫toLocaleString()方法轉化為字串,而不是呼叫toString()

&n