面試筆記準備
<!DOCTYPE html>是html5的頭,DOCTYPE是document type的簡寫,文件型別,作用是說明該文件是html的什麼版本
DTD是文件型別定義,裡面包含解析文件的規則,瀏覽器根據DTD中定義的規則來解析頁面並展現出來,分類為過渡型、嚴格型、框架型
HTML版本發展:HTML2.0----HTML3.2----HTML4.0----HTML4.01----XHTML1.0---HTML5(2008年)
CSS是cascading style sheets層疊樣式表
H5新增常用audio video svg canvas h5定位 本地儲存
新增表單驗證輸入型別email number range 時間選擇器
新增語義化標籤:address aside article audio canvas footer header nav section
CSS3新增border-radius box-shadow @font-face transition過渡 animation
Transform移動
Flex佈局:flex容器,容器屬性flex-direction flex-wrap justify-content flex-flow align-items
Rem佈局:根據頁面html字型大小來渲染頁面,計算當前字型大小有兩種,js計算和媒體查詢,一般ui設計稿都是iphone6的750px來的,除以7.5就是讓1rem=100px
Document.documentElement.style.fontSize = window.innerWidth/7.5*2 +’px’
Stylus:適合編譯環境使用打包,需要安裝對應的loader,簡寫{} ; :都是可選,可以設定變數$fontsize=14px 樣式書寫支援運算,支援函式,@import匯入樣式檔案styl,&父級引用,
ES6核心:
- 解構賦值
- 陣列解構
Let [a,b] = [1,2,3]
解構賦值等號右側個數必須大於或等於左側,不然解構失敗,解構結果是undefined
等號右側如果不是陣列會報錯
允許給定預設值let [a,b,c=66] = [1,2]
預設值可以是表示式,用到時才會求值
陣列解構必須跟順序對應才能取到對應值
-
- 物件解構
物件解構指定key就可以獲取對應值,跟次序無關let {a,b} = {a:666,b:999}
允許給預設值
- 塊級作用域
ES5只有函式作用域和全域性作用域,與塊級作用域配合的是let宣告變數和const常量宣告,塊級作用域標誌{}大括號,沒有塊級作用域之前使用的立即執行函式來達到塊級作用域的目的,立即執行函式執行後就會丟失索引,類似於銷燬
Let和const宣告不屬於window
Let宣告沒有變數宣告提升,必須先定義後使用,不能重複定義,
Const宣告沒有宣告提升,必須先定義先賦值後使用,不允許修改值,如果儲存的是個物件或者陣列這一類引用值,儲存的只是指標,凍結物件方法Object.freeze(obj)
- 字串模板``
字串模板裡面允許無限換行,允許${變數名}插入變數,無需用之前的++連線,無計算功能,單純字串,${這裡面允許進行計算}
字串新增方法:
Str.include(‘a’)返回布林值
str.indexOf('要查詢的東西')返回值是索引位置,沒有就是返回-1
判斷是否以規定字串開頭str.startsWith("監測東西")
結尾方法str.endsWith("監測東西")
重複字串str.repeat(100)
- 函式變化
形參可以給預設值
引入了箭頭函式
箭頭函式中this預設不再指向window不再指向誰呼叫指向誰,而指向其定義時所在的環境
- 陣列
陣列新增一個擴充套件運算子…
功能是可以展開陣列或者合併成陣列
Push pop unshift shift slice splice concat reserve sort
Map forEach filter some every (value,index,arr)=>{}
Reduce((prev,cur,index,arr)=>{})
Object.keys(接收一個物件或者陣列) 返回值是個對應的陣列
Object.values(接收一個物件或者陣列) 返回值是個對應的陣列
Object.entries(接收一個物件或者陣列) 返回值是個對應的陣列
類陣列不具備陣列的各個方法,需要轉換成真正的陣列,Array.prototype.slice.call(類陣列)
ES6方法是Array.from()
ES6新增好用方法arr.findIndex((val,index,arr)=>{})
- 物件
有了簡寫方式,如果值的變數名和物件的key相同可以簡寫
Object.is(one,two)徹底比較兩個數
Object.assign({},s,s,s)物件合併,後面如果有相同的會覆蓋前面的,還可以用來深度複製一個物件
- 解決非同步問題
1.Promise物件
2.async和await
3.generator函式
- 模組化
之前只是一些社群規定的模組化,比如基於commonjs的nodejs還有一下模組化規範如AMD
新增規範的模組化
Export default{}
Import * from ‘../../
全部一起引入import * as module from './module/test.js';全部引數會存入module物件裡面’
- 類和繼承
- 新增資料型別
- 新增資料結構map和set
Set對應陣列資料結構
Let set = new Set([‘0’,’2’,’1’])
對應方法set.add() set.delete() set.clear()
Set中不允許出現重複的值,可用於陣列的去重
- 代理proxy
Let obj = new Proxy(要代理的物件,處理的回撥函式)
- js基礎
typeof(變數)返回值有boolean string number undefined object function都是字串
A instanceof B
變數未定義就使用就會報錯,但是typeof使用不會報錯,var變數宣告有變數提升
匿名函式就是函式表示式,函式有函式體和函式名
遞迴第一找出口,無出口就是死迴圈
ES5之前只有函式作用域和全域性作用域
函式執行前有一個預編譯過程
建立AO物件—找形參和變數宣告並將其值置為undefined—實參與形參相統一—找函式宣告,函式名為屬性名,函式體為值
全域性物件叫GO儲存著全域性變數和全域性函式
變數宣告提升函式宣告提升
var全域性變數都指向window
const和let不再指向window均為undefined
this的4個特點
物件new操作細節
- 建立空物件this={}
- 設定物件的constructor屬性為該建構函式,proto屬性指向該建構函式的原型
- 執行該建構函式並將this指向新的物件
- 隱式返回一個物件例項
包裝類:解決原始值資料型別無相應方法而不會報錯,原始值存在棧裡面,沒有屬性
錯誤提示分類
Call和apply可以改變this指向,不同的是傳參列表不一樣
區分一個變數到底是什麼型別
Es5嚴格模式
使js程式碼更加規範,避免一些不必要的問題出現
嚴格模式不能使用的語法
With eval arguments.caller/callee
變數必須先聲明後使用
- 作用域
全域性作用域和函式作用域
作用域儲存著函式執行時的上下文物件,函式每次執行這個上下文物件都是獨一無二的,函式執行完畢執行上下文就會銷燬
作用域中儲存著變數,函式,查詢變數函式從AO---GO就近原則
[[scope]]中儲存著上下文執行的物件的集合我們稱之為作用域鏈也就是GO和AO
- 閉包
內部函式儲存到了外部,將會產生閉包,閉包會導致原有的作用域不釋放,造成記憶體洩漏,記憶體洩漏就是記憶體被佔用
閉包就是一個函式有權訪問另一個函式的作用域
函式表示式,將一個函式賦值給一個變數儲存,只有真正去訪問執行這個變數的時候才會執行該函式
閉包核心作用就是變數私有化,不會去汙染全域性,而只是向外提供操作變數的方法
- 原型
原型是物件的一個屬性__proto__ === prototype
原型定義了建構函式製造的物件的公共祖先,使用建構函式製造出的物件可以繼承該建構函式的原型上的屬性和方法
物件例項的constructor屬性裡面儲存著自己是由什麼建構函式製造而來的
Object.prototype是原型鏈的最終端
一個建構函式繼承另一個建構函式就會產生原型鏈
Null物件沒有原型
原型上掛載著該型別建構函式的共用方法
在es5之前繼承就是通過繼承原型的方法來實現繼承的
繼承分類:好處就是減少程式碼書寫量
- 傳統繼承 兒子繼承父親,父親繼承祖父,導致了過多不必要的繼承
- 使用建構函式的call和apply進行繼承 表面上是減少了繼承,但是每次都要走一次建構函式
- 共享原型
- 聖盃模式 接組一箇中間函式
- 陣列
Push pop unshift shift slice splice concat join reverse sort
陣列亂序好方法
- DOM
增刪改查
- BOM
幾個核心物件history location navigator screen
- 事件
事件繫結
事件冒泡和事件捕獲
阻止冒泡和阻止預設事件
事件委託
滑鼠事件 click mousedown mousemove mouseup mouseover=mouseenter mouseout=mouseleave
鍵盤事件 keydown keyup keypress
文字框事件input change focus blur
- JSON
一種傳輸資料的格式,以前是xml
JSON格式跟物件很像
兩個核心方法JSON.stringify(obj) JSON.parse(str)
- 一個頁面渲染過程
渲染引擎解析頁面標籤和css各自形成dom樹和css樹最後合併成random樹
- 正則表示式
RegExp
Reg上的方法test(返回值是布林值)和exec返回值是個類陣列,每執行一次得到一個結果,直到匹配完成
字串上的方法
- match匹配得到所有結果並以真陣列的形式返回
- split按reg表示式拆分
- replace替換,先進行reg匹配然後進行替換,第二個是要替換成為的字元,支援函式
表示式符號[]一個表示式代表一位
元字元\d \D \w \W\s\S\b\B
量詞+ * ? {}
子表示式(\w)
子表示式引用\1\2..
正向斷言(?=b)不參與匹配,僅僅是作為必要條件存在
- jQuery
核心好處就是簡化DOM操作,相容性增強,無需考慮相容
操作樣式使用css(屬性名,屬性值) 原生是style.屬性名=屬性值
原生DOM物件和jQuery物件$('#id').get(0)
jQuery的DOM操作
- html()
- text()
- css()
- val()
- attr()
- removeAttr()
- 元素class設定
- addClass
- removeClass
- toggleClass
- 獲取元素寬高,允許設定
- width()
- height()
- innerWidth()
- innerHeight()
- 獲取元素偏移,只能獲取不能設定
- offset().left/top
- position().left/top
- 滾動條
1.$(window).scrollTop();滾動條垂直方向滾動距離,如果傳參進去就是設定移動距離
2.$(window).scrollleft();滾動條水平方向滾動距離,如果傳參進去就是設定移動距離
11.節點操作
1.建立節點$('<div>123</div>')
2.插入方法append()
3. appendTo();剪下操作,將已存在的元素剪下到某個元素後面
4.prepend();插入到內部的前面,跟append相反
全域性方法
- $.each(arr/obj,fn)
20.jQuery事件繫結
.click(fn)
On(‘click’,fn)
Off(‘click’)
One(‘click’,fn)
21.事件模擬trigger(‘click’,data)
22.動畫
1.show(時間,回撥函式)
2.hide(時間,回撥函式)
3.toggle
4.slideUp
5.slideDown
6.fadeIn
7.fadeOut
8.fadeTo
23.自定義動畫el.animate({css},時間,回撥函式)
24.jQuery中的ajax
核心方法$.ajax({})
- 原生ajax
- vue核心
- linux常用命令
last顯示最近系統登入情況
建立資料夾mkdir
建立檔案touch
刪除資料夾或者檔案rm –rf
移到資料夾mv
複製cp
Top 工作管理員
Ps –ef|grep test當前所有程序資訊,grep進行匹配的意思
Df檢視儲存空間分割槽使用情況
Netstat查詢所有埠
檢視txt文字cat less more vi tail head
Shell程式設計
輸出echo “hello world”
定義變數a=10 b=”nihao”
使用變數$a $b
執行sh檔案bash gys.sh
- tcp/ip協議
計算機互聯通訊而建立的協議,是一個協議族,裡面包含很多協議
核心就是分層
- 資料介面層
包含osi7層模型的物理層和資料鏈路層,物理層包含通訊電纜,通訊裝置等
資料鏈路層包含
- 網路層
包含ip協議,IP協議是TCP/IP協議的核心,所有的TCP,UDP,IMCP,IGCP的資料都以IP資料格式傳輸。要注意的是,IP不是可靠的協議,這是說,IP協議沒有提供一種資料未傳達以後的處理機制--這被認為是上層協議--TCP或UDP要做的事情。所以這也就出現了TCP是一個可靠的協議,而UDP就沒有那麼可靠的區別
Ip協議版本ipv4 ipv6
Ip地址
Arp協議
Icmp協議及ping命令使用
Ip路由協議
包含rip ospf
- 傳輸層
傳輸層主要協議是tcp和udp
Tcp協議
Tcp連線過程
- http
Uri和url
http狀態碼
https原理
http請求過程
- 面試小知識
Css hack解決不同瀏覽器css樣式相容
IE核心trident 相容-ms-
火狐核心gecko 相容-moz-
谷歌核心webkit 相容-webkit-
歐朋瀏覽器presto 相容-o-
- w3c標準認識及語義話標籤
垂直居中方法
- flex佈局
- 絕對定位+負margin
- 絕對定位+4個0+margin auto
- 絕對定位+transform+translate負50%
Div高度塌陷 元素脫離文件流導致,如浮動和position=absolute
3列布局,中間固定,左右自適應displayflex 中間固定,左右使用flex進行分配
JavaScript核心ECMAScript BOM DOM
解釋性語言
單執行緒---非同步和同步---單執行緒一個時間只能做一件事—頁面上看到的多個事情一起做是因為計算機組成原理有個叫時間輪轉片的東西,他把每個要執行的任務分割成了很多個小片段,然後去執行,造成視覺上是同時在執行,其實是太快了
js程式碼有頁面級js和外部連結js 同時存在一個標籤是外部高於內部,只有外部js生效
變數宣告var a;
變數賦值a=100
變數定義var a=100
變數名:以字母,下劃線,$開頭,還有數字,數字不能開頭,不能是關鍵字和保留字
原始資料型別:Number String Boolean Null佔位覆蓋 Undefined未定義 Symbol
原始資料型別儲存在棧裡面,棧裡面存資料存的是實打實的資料,無論是複製或者覆蓋,都是真實發生,棧裡面資料進行賦值是拷貝的關係,先進後出,類似口袋
原始值有個不可修改的屬性,就是說房間裡面存進去了東西就不能覆蓋了,只能新開個房間
原始值進行重新賦值原理,他會新開一個房間把新的值存進去然後把之前的那個地址移到這個新的棧的地址,之前的地址初始為最初地址編號
引用資料型別:Array Object Function Date RegExp
引用資料型別的變數名儲存在棧裡面,也就是引用值只是在棧裡面儲存了一個指標,這個指標指向堆的地址,堆裡面儲存著引用型別的值
引用值如果進行重新賦值,也就是再次出現等號,他就會新開一個房間,然後修改這個引用值的棧裡面存的地址指向新的房間
刪資料刪的是地址,抹除的是地址,永久性刪除只能使用資料進行覆蓋
由值決定變數型別,他是動態型別語言
弱型別語言,不指定變數型別,由賦予的值決定
強型別語言,指定變數型別
兩個數交換值
- 藉助第三個變數
c = a
a =b
b =c
- 兩個數進行加減運算
a=a+b
b=a-b
a=a-b
程式設計形式
- 面向過程
機械性解決問題,第一步做什麼,第二不做什麼…按步驟按順序來
- 面向物件
依賴於解決問題的辦法,誰能解決第一個問題,誰能解決第二個問題…
Typeof區分資料型別6個值:string boolean number undefined object function
型別轉換
- 顯示型別轉換null可以轉換成0 undefined會轉成NaN看起來不是數字都是轉成NaN
Number(“123”)
toString()
parseInt()
- 隱式型別轉換 內部都是呼叫顯示型別轉換裡面的方法
Var num=”1”-“1”
isNaN()內部呼叫Number()
++ -- + - ==正負運算子會自動呼叫Number()進行轉換
+號兩側有字串就會自動呼叫String()進行轉換成字串
比較運算最後得出結果是布林值true/false
空格字串是true
空串是false
高內聚 低耦合 耦合就是重複的程式碼,使用函式對耦合程式碼進行內聚簡化程式碼
程式碼規範:小駝峰首字母小寫後面單詞的首字母大寫 大駝峰首字母大寫如建構函式
函式
- 函式宣告function test(){}
- 函式表示式
- 具名函式表示式,函式名無效,寫不寫無所謂
- 匿名函式表示式--函式表示式
- 形參和實參個數可以不用相同,誰多誰少都行
- 實參都儲存到了arguments中,arguments是個陣列,實參列表
- 形參個數存到了函式名裡面length屬性
- 實參列表arguments和形參列表相對映關係,一個變另一個變
- 實參列表出生的時候有多少就是多少,後期加入的變數不會進行相互對映
- 函式終止return
函式遞迴:也就是函式自呼叫,在自己的函式體內執行自己,遞迴必須if指定出口,也就是亙古不變的東西 ,找數學規律符合我們人的思考,常用是階乘和斐波那契數列
全域性變數和區域性變數 全域性作用域和函式作用域,最裡面可以拿外面所有,外面不能拿裡面,訪問順序依據就近原則
解釋性語言過程
- 語法分析
- 預編譯 發生在執行前一刻
變數 宣告提升,會把var宣告,函式宣告整體提升,系統會把函式宣告會永遠提升到邏輯的最前面,都是預編譯造成的
暗示全域性變數,就是沒有使用var直接賦值,歸window物件所有,在嚴格模式報錯,全域性變數、全域性函式都會掛載到window物件上
全域性範圍宣告的變數歸window物件所有
預編譯過程:函式執行前一刻建立AO物件也就是執行期上下文物件,其實是作用域
- 找函式裡面的形參和變數
- 形參和實參值相統一
- 找函式宣告,將函式體作為值賦予函式名
- AO完畢後就是執行函式
- 預編譯有全域性預編譯和函式預編譯
- 全域性預編譯過程
- 建立GO(就是window 物件)
- 找變數宣告,值為undefined
- 找函式宣告,值為函式體
- 全域性執行
- 先有GO後有AO作用域遵循就近原則,如果全域性和區域性有相同變數名,用自己的
作用域:隨著函式而產生,一個函式定義的時候他就會自帶一些屬性,如fn.name、fn.prototype等,這些屬性是可以訪問的,但是有些屬性是訪問不了的,他是給js引擎讀取的如fn.[[scope]]這裡面儲存的就是函式的作用域,一個隱式的屬性,我們無法使用
一個函式在每次執行前都會建立一個獨一無二的執行期上下文叫AO這個執行期上下文決定了函式執行時的環境,函式執行完這個執行期上下文會銷燬
作用域鏈:[[scope]]中所儲存的執行期上下文物件的集合,這個集合呈鏈式連線,這種連線叫做作用域鏈,一個函式在定義時候就有了fn.name fn. Prototype fn.[[scope]]但此時的[[scope]]中只有一個GO當函式要執行的前一刻就會預編譯產生AO並且AO會排在GO的前面
在函式執行中查詢變數從作用域鏈頂端開始查
函式在全域性定義那一刻就產生了作用域,那就是全域性的GO,函式執行前一刻產生了執行期上下文那就是AO
如果函式A裡面還定義了一個函式B那麼函式B的出生環境是整個A函式的作用域鏈,B自己的執行期上下文AO
函式執行完畢後銷燬自己的AO迴歸到被定義狀態
閉包B函式在A函式內,B被return到了全域性,儲存到了外部
閉包會導致原有的作用域鏈不釋放,造成記憶體洩漏
閉包作用:
- 實現累加器,不依賴於外部變數,每執行一次函式就會累加一次
- 可以做快取,作為一個儲存結構,外部不可見,向外提供兩個操作資料的方法
- 變數私有化,只提供對外使用方法介面
- 模組化開發,防止汙染全域性變數
立即執行函式,模擬塊級作用域,執行完一次就會銷燬,一般適用於初始化功能
(function(){}())只執行一次,執行完就會銷燬釋放,有返回值,有形參,正常都有返回值,要的就是返回值,函式必須有預編譯,有執行期上下文
執行符號() 只有表示式才能被執行符號執行 (…)可以變成表示式 被執行符號執行的表示式其函式名被忽略,永遠放棄,立即執行函式會放棄函式名,失去索引
函式裡面包含變數,但函式未執行,那麼整個變數會用最後的值,僅僅是函式體賦值
函式不會去執行,僅僅是賦值,只有去執行的時候才會去找那個變數
使用立即執行函式解決閉包問題,10個立即執行函式都有對應的j解決辦法僅此一種
為了及時得到for迴圈裡面的i使用立即執行函式的形參j接收這個i這樣就可以實時拿到當時對應的i,立即執行函式拿的是當時那個立即執行函式定義的執行上下文,比如給多個li繫結點選事件,輸出每個li的索引,就需要藉助立即執行函式的j來實現
物件 引用資料型別 物件裡面可以存屬性和方法,方法可以控制物件裡面的屬性
物件建立
- 物件字面量var obj = {}
- 建構函式
- 系統自帶建構函式var obj = new Object()
- 自定義建構函式
- 建構函式規定大駝峰式命名,首字母大寫
- 使用建構函式建立物件需要使用new操作符
- 物件產生後可以隨時增刪改查,其他語言的物件出生是什麼樣就不能改了
- 建構函式產生物件的過程new操作後發生以下步驟
函式最開始var this = {}其實並不是空的,而是有個屬性__proto__:Person.prototype這個屬性就是原型,所有由這個建構函式產生的物件都會繼承這個屬性
執行this.xxx=xxx
隱式返回this 如果搗亂顯式return {}就可以覆蓋this但是return 1原始值就不能阻斷,依然正常返回this
只要是new就是產生一個新的物件,每個new出的物件是獨立的
- 模擬new之後過程
- 物件的增刪改查
- 變數未定義就使用會報錯,但是訪問物件上沒有的屬性不會報錯
原始值是不能進行新增方法和物件的,但是有一種叫物件字串,物件數字,物件布林值,使用建構函式構造出的數字,字串,布林值就是物件,是物件就可以進行新增屬性和方法
原始值是規定沒有屬性和方法的,如果新增也不會報錯,但是也無效,用完就會delete銷燬,這就是包裝類,字串有length屬性也是包裝類導致的new String(“abc”).length
原型 從物件如何產生引申出來,第二種產生物件的方法是使用建構函式,而原型就是函式物件上的一個屬性__proto__這個屬性裡面有一些方法和屬性,他定義了所有由該建構函式產生的物件出生後該有的屬性和方法,也就是出生後該有什麼,而且是公平的,所有產生的物件都會有,相當於從祖先那繼承而來的一樣
原型的第一個應用就是,使用建構函式產生物件時,把一些公有屬性存放到原型裡面,這樣所有產生的物件都可以繼承到,做到減少程式碼的冗餘,不用每次都執行一遍相同的程式碼,這就是原型的用處,提取公有屬性
已經使用建構函式產生了的物件,可以新增屬性,如果新增一個與原型中同名的屬性,他只會在本物件上新增一個同名屬性,訪問的時候也是遵循就近原則,訪問自己身上的屬性,自己身上沒有才會去訪問繼承原型而來的屬性,原型上屬性無法通過後代修改,只有通過原型自己修改Person.prototype.name = “gys” 原型Person.prototype是個物件,使用建構函式產生的物件會自帶一個屬性constructor他是儲存自己是由哪個建構函式產生的,constructor屬性從原型上繼承來的
Person.prototype是個物件,而person上的__proto__屬性就是指向這個物件
引用值重寫與修改有本質區別,修改是在原有基礎上進行資料修改,而重寫重新賦予他一個新物件,指向這個新物件
原型鏈:多次繼承之後就會出現繼承多個屬性,繼承多個建構函式的原型,構成原型鏈,訪問原型的時候從自己一直往下找son----father----grand---最終原型Object.prototype
如果原型上的某個屬性是引用值,它可以修改引用值裡面的屬性,比如father中的fortune就是個物件
原始值進行++運算最後是改不了原型上的資料,是給自己加一個屬性,後代無法修改原型,修改也只是給自己新增一個屬性
Object中有個方法是建立物件的第三種方法Object.create(原型)引數是個原型物件
var obj = Object.create(obj1) obj的原型就是obj1
.是最高階的數學運算子
原始值呼叫方法原理是包裝類
自己身上加一個與原型鏈終端相同名的方法叫方法的重寫,Number物件,Array物件都重寫過toString方法並不是使用的原型鏈最終端的toString方法,最終端的toString方法沒有什麼用處,返回值並不是自己要的,Document.write()呼叫的就是原型上的toString方法
Call/apply可以改變this指向,任何一個函式方法都可以進行fn.call()裡面可以傳參,改變this指向,第一位是this指向,後面的是實參,第一個應用就是借用別人的函式實現自己的方法
Call和apply區別:傳參列表不一樣,call可以一個一個傳參,apply必須傳一個數組
繼承:
- es5之前繼承用的是原型來繼承
- 使用建構函式call
- 兩個建構函式共享原型,但是一個改另一個跟著一起改,不能給自己新增單獨的屬性
- 聖盃模式,內部藉助一個空函式繼承祖父的原型,自己繼承這個空函式,然後進行new
名稱空間:管理變數,防止汙染全域性,適用於模組化開發,其實也是個物件,現在不用這個方法了,現在使用閉包實現私有化變數,這樣就不會汙染全域性
物件的列舉,物件的遍歷使用的是for(let prop in obj)迴圈,自動會根據物件屬性名的個數進行迴圈次數,物件的訪問有兩種方法一種是obj.prop或者obj[prop]但是[]裡面支援存放變數,如果是點只能屬性名,不能是變數,使用點最後系統內部會預設把obj.prop轉換成obj[‘prop’]
陣列也可以使用for in進行迴圈
任何一個物件自身都有一個方法obj.hasOwnProperty(prop) 系統自帶的屬性比如原型不算自己的屬性obj.hasOwnProperty(prop)返回值是布林值
in 操作符也可以用來檢測一個屬性是否是物件上的屬性,他只能判斷能不能訪問到該屬性,系統自帶的也會算,比如繼承來的原型
A instanceof B A是不是B構造出來的,原理是看A的原型鏈上是否有B的原型
區分陣列和物件可以使用
- constructor屬性
- instanceof操作符
- Object.prototype.toString.call([]/{})
This特點:4個鐵定律
- 函式預編譯過程中this指向window
- 全域性作用域中GO也是指向window
- Call和apply會改變this指向
- 誰呼叫this this指向誰
Arguments實參列表
- arguments.callee表示函式自身引用
- fn.caller表示函式被誰呼叫,這個是函式自己的一個屬性
- 在嚴格模式中callee和caller不能使用會報錯
特殊的物件之陣列,陣列基本不會出現報錯,怎麼搞都行,陣列產生,陣列字面量var arr=[]
建構函式var arr = new Array()
通過var宣告的變數不能使用delete刪除,叫做不可配置屬性