ES5和ES6那些你必須知道的事兒(二)

ES5和ES6那些你必須知道的事兒

ES5新增的東西數組

2、對象方法安全

  一、Object.getPrototypeOf(object)函數

    返回對象的原型ui

function Pasta(grain, width) {
    this.grain = grain;
    this.width = width;
}

var spaghetti = new Pasta("wheat", 0.2);

var proto = Object.getPrototypeOf(spaghetti);

console.log(proto)

     輸出:this

 

  二、Object.createspa

    用法:Object.create(prototype, descriptors)
    prototype

      必需。  要用做原型的對象。  能夠爲 null。  prototype

   descriptors

      可選。  包含一個或多個屬性描述符的 JavaScript 對象。  3d

      「數據屬性」是可獲取且可設置值的屬性。  code

      數據屬性描述符包含 value 特性,對象

      以及 writableenumerable 和 configurable 特性。  

      若是未指定最後三個特性,則它們默認爲 false。 

   返回:一個具備指定的內部原型且包含指定的屬性(若是有)的新對象

var newObj = Object.create(null, {
            size: {
                value: "large",
                enumerable: true
            },
            shape: {
                value: "round",
                enumerable: true
            }
        });

document.write(newObj.size + "<br/>");
document.write(newObj.shape + "<br/>");
document.write(Object.getPrototypeOf(newObj));

// Output:
// large
// round
// null

 

  三、 Object.getOwnPropertyNames
    方法返回對象的全部自身屬性的屬性名(包括不可枚舉的屬性)組成的數組,但不會獲取原型鏈上的屬性。
    即對象的全部key值
 
  四、 Object.defineProperty
     方法會直接在一個對象上定義一個新屬性,或者修改一個對象的現有屬性, 並返回這個對象。
     用法: Object.defineProperty(obj, prop, descriptor)
     obj:要在其上定義屬性的對象。
     prop:要定義的key。
     descriptor:要定義的key對應的value。
 
  五、 Object.getOwnPropertyDescriptor
     返回對象指定的key對應的value
     Object.getOwnPropertyDescriptor(obj, prop)
     obj:要在其上獲取屬性的對象。
     prop:要獲取的key。
 
  六、 Object.defineProperties
      Object.defineProperties(obj, props)
     obj: 將要被添加屬性或修改屬性的對象
     props:  該 對象的一個或多個鍵值對定義了將要爲對象添加或修改的屬性的具體配置
var obj = new Object();
Object.defineProperties(obj, {
    name: {
        value: '張三',
        configurable: false,
        writable: true,
        enumerable: true
    },
    age: {
        value: 18,
        configurable: true
    }
})

console.log(obj.name, obj.age) // 張三, 18

 

  七、 Object.keys
     Object.keys(obj)
     一個表示給定對象的全部可枚舉屬性的字符串數組。
     即對象全部key值組合成的數組。
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj)); // console: ['0', '1', '2']

 

  八、 Object.preventExtensions / Object.isExtensible
     應該使該對象不可擴展/應該檢查的對象
     可防止將新屬性添加到對象中
 
  九、 Object.seal / Object.isSealed
     將要被密封的對象/判斷一個對象是否被密封
 
  十、 Object.freeze / Object.isFrozen
    方法能夠凍結一個對象,凍結指的是不能向這個對象添加新的屬性,不能修改其已有屬性的值,不能刪除已有屬性,以及不能修改該對象已有屬性的可枚舉性、可配置性、可寫性。該方法返回被凍結的對象。
    方法判斷一個對象是否被 凍結

 

3、 strict模式(嚴格模式)

  「use strict」

  將"use strict"放在腳本文件的第一行,則整個腳本都將以"嚴格模式"運行。

 

  嚴格模式影響範圍

    •   變量:  var、delete、變量關鍵字
    •   對象: 只讀屬性、 對象字面量屬性重複申明
    •   函數:參數重名、arguments對象、申明
    •   其餘:this、eval、關鍵字...

  

  設立"嚴格模式"的目的,主要有如下幾個:錯誤檢測、規範、效率、安全、面向將來

    - 消除Javascript語法的一些不合理、不嚴謹之處,減小一些怪異行爲;

    - 消除代碼運行的一些不安全之處,保證代碼運行的安全;

    - 提升編譯器效率,增長運行速度;

    - 爲將來新版本的Javascript作好鋪墊。

 

  將"use strict"放在函數體的第一行,則整個函數以"嚴格模式"運行。

function strict(){  
  "use strict";  
  return "這是嚴格模式。";  
}  
function notStrict() {  
  return "這是正常模式。";  
}  

 

  具體體現:

    a、變量都必須先用var命令顯示聲明,而後再使用

    b、嚴格模式不能對變量調用 delete 操做符

    c、不用保留字作 變量名 或 參數名

    d、爲只讀屬性賦值報錯

    e、嚴格模式下參數名不能重複

    f、只能在腳本的頂級和在函數內部申明函數,if for等語句中申明函數會致使語法錯誤    

    g、嚴格模式下抑制this

 

4、Array.isArray() 

  用於肯定傳遞的值是不是一個 Array

Array.isArray([1, 2, 3]);  
// true
Array.isArray({foo: 123}); 
// false
Array.isArray("foobar");   
// false
Array.isArray(undefined);  
// false
// 下面的函數調用都返回 true
Array.isArray([]);
Array.isArray([1]);
Array.isArray(new Array());
// 不爲人知的事實:其實 Array.prototype 也是一個數組。
Array.isArray(Array.prototype); 

// 下面的函數調用都返回 false
Array.isArray();
Array.isArray({});
Array.isArray(null);
Array.isArray(undefined);
Array.isArray(17);
Array.isArray('Array');
Array.isArray(true);
Array.isArray(false);
Array.isArray({ __proto__: Array.prototype });

  instanceof 和 isArray

當檢測Array實例時, Array.isArray 優於 instanceof,由於Array.isArray能檢測iframes.

相關文章
相關標籤/搜索