es5重要新特性梳理

嚴格模式相關內容來自: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

相關文章
相關標籤/搜索