嚴格模式相關內容來自:http://www.cnblogs.com/snandy/p/3428171.htmlhtml
一.數組迭代:數組
1.瞭解迭代app
先不說迭代是什麼意思,先看看數組遍歷處理:函數
var arr=[5,6,7,8,2,1,3]; for(var i=0;i<arr.length;i++){ alert(arr[i]); };
依次把數組內容彈出,咱們如今假若有一個需求,就是把其中大於3的提出保存成一個新數組返回,看下面程序:測試
var arr=[5,6,7,8,2,1,3]; function filter(arr,v){ var temp=[]; for(var i=0;i<arr.length;i++){ if(arr[i]>v){ temp.push(arr[i]); } }; return temp; } alert(filter(arr,3));
是否是拿到了其中大於3的數字,這是咱們本身封裝的方法,其實這就是一個迭代的處理,去遍歷數組而後返回所須要的內容,在es5中,爲咱們提供了各類原生迭代方法。this
這種方法看起來是功能足而逼格不高,咱們把篩選方法掛在原型下:es5
Array.prototype.filter=function(fun){ var temp=[]; for(var i=0;i<this.length;i++){ if(fun(i,this[i])){ temp.push(this[i]); } }; return temp; } var arr=[5,6,7,8,2,1,3]; var res=arr.filter(function(i,val){ if(val>3){ return true }; }); alert(res);
返回告終果,而且條件設置用回調函數,這是麼麼噠。spa
2.es5各類迭代方法prototype
上面咱們自定義個filter方法,用來帥選所需,咱們看看es5爲咱們的方便處理,來了哪些妖孽特性。code
forEach
map
filter
some
every
用流行話就是5小隻,咱們一次測試特性:
forEach:
var arr=[5,6,7,8,2,1,3]; arr.forEach(function(value, index, array) { alert(value+"-"+index); });
在回調中,第1 2分別表明每次遍歷到的值和索引,寫法上比for簡潔多了,咱們試試支不支持邏輯處理:
var arr=[5,6,7,8,2,1,3]; arr.forEach(function(value, index, array) { if(value>3){alert(value+"-"+index);} });
map:
和forEach相似
var arr=[5,6,7,8,2,1,3]; arr.map(function(value, index, array) { if(value>3){alert(value+"-"+index);} });
同樣的用法不同的臉
filter:
var arr=[0,5,6,7,8,2,1,3]; var arr1=arr.filter(function(value) { return value; }); alert(arr1);
篩選處理,設置返回值,而後判斷是否是true,true的纔會被返回,咱們數字的0在變爲布爾類型會轉爲false,因此最後返回的新數組會去除掉0。
some:
var arr=[0,5,6,7,8,2,1,3]; var res=arr.some(function(value) { return value>3; }); alert(res);
這是一個判斷方法,最終返回布爾值,只有有一個知足咱們設置,就會返回true
var arr=[0,5,6,7,8,2,1,3]; var res=arr.some(function(value) { return value>9; }); alert(res);
全不知足纔會返回false,和咱們的邏輯或很像
every:
var arr=[0,5,6,7,8,2,1,3]; var res=arr.every(function(value) { return value>3; }); alert(res);
some是或的處理,那麼every就是而且,必須所有知足條件纔會返回true
var arr=[0,5,6,7,8,2,1,3]; var res=arr.every(function(value) { return value>-1; }); alert(res);
總結:
forEach和map就是遍歷的處理;
filter是遍歷處理加返回值布爾類型判斷,會返回項true新數組;
some和every是邏輯判斷方法,根據返回值設定,返回布爾值結果。
二.對象建立
var obj = Object.create(Object.prototype,{ name: { value: "demo" //enumerable: false //configurable: false //writable: false } }); alert(obj.name);
一個es5的寫法,建立對象obj,設置name屬性,屬性值是demo。
咱們去掉註釋,修改name屬性處理:
var obj = Object.create(Object.prototype,{ name: { value: "demo", enumerable: false, configurable: false, writable: false } }); alert(obj.name); obj.name="123"; alert(obj.name);
兩次都是輸出demo並不能按之前同樣修改這個屬性值,咱們把writable改成true
var obj = Object.create(Object.prototype,{ name: { value: "demo", enumerable: false, configurable: false, writable: true } }); alert(obj.name); obj.name="123"; alert(obj.name);
輸出123,writable表示是否容許修改也就是二次賦值的意思。
有的時候咱們可能獲取這個對象一個屬性,其實這個對象沒有這個屬性,咱們但願alert一段內容:
var obj = Object.create(Object.prototype,{ name: { value: "demo", enumerable: false, configurable: false, writable: true } }); function get(val){ if(val){}else{ alert("不存在!"); } }; get(obj.sex);
咱們需求實際上是在obj.sex去調用彈出,在es5中,建立對象爲咱們提供了這種處理:
var obj = Object.create(Object.prototype,{ name: { value: "demo", enumerable: false, configurable: false, writable: true }, sex:{ get: function(){ alert(this.name) } } }); obj.sex;
在訪問sex屬性會調用sex屬性定義的get方法,在裏面加入合適的邏輯既能夠輸出提示了:
var obj = Object.create(Object.prototype,{ name: { value: "demo", enumerable: false, configurable: false, writable: true }, sex:{ get: function(){ if(this.name=="demo"){ alert("yes"); }else{ alert("no"); } } } }); obj.sex;
給屬性指定get方法了,咱們就能夠作一些各類處理,除了提示還能夠起到攔截做用:
var arr=[]; var arr1=[1,2,3]; var obj = Object.create(Object.prototype,{ name: { value: "demo", enumerable: false, configurable: false, writable: true }, sex:{ get: function(){ if(this.name=="demo"){ arr=arr1; }else{ alert("no"); } } } }); alert(arr); obj.sex; alert(arr);
是否是相似攔截處理,除了調用對象屬性,還要知足某個屬性是demo纔會讓arr被賦值。
三.嚴格模式
嚴格模式的使用很簡單,只有在代碼首部加入字符串 "use strict"。
'use strict'
嚴格模式,嚴格模式,重要其實就是es5中棄用了不少之前版本的語法,你再用就提示錯誤。
一句話說明了這個的用途,咱們只要知道哪些語法被棄用了(es3,es2,es1),就知道哪些會在使用這個模式下報錯了。
簡單羅列棄用限制和es5不符合語法定義限制:
1.不使用var聲明變量嚴格模式中將不經過
2.任何使用'eval'的操做都會被禁止
3.eval做用域
4.with被禁用
5.caller/callee 被禁用
6.對禁止擴展的對象添加新屬性會報錯
7.刪除系統內置的屬性會報錯
8.delete使用var聲明的變量或掛在window上的變量報錯
9.delete不可刪除屬性(isSealed或isFrozen)的對象時報錯
10.對一個對象的只讀屬性進行賦值將報錯
11.對象有重名的屬性將報錯
12.函數有重名的參數將報錯
13.八進制表示法被禁用
14.arguments嚴格定義爲參數,再也不與形參綁定
15.函數必須聲明在頂層
16.ES5裏新增的關鍵字不能當作變量標示符使用,如implements, interface, let, package, private, protected, public, static, yield
17.call/apply的第一個參數直接傳入不包裝爲對象
18.call/apply的第一個參數爲null/undefined時,this爲null/undefined
19.bind的第一個參數爲null/undefined時,this爲null/undefined
整理來自 http://www.cnblogs.com/snandy/p/3428171.html
按照第一條定義:
'use strict' aa=123;
會提示ReferenceError: assignment to undeclared variable aa