// Shorthand property names (ES6) var a = "foo", b = 42, c = {}; var o = { a, b, c }; // Shorthand method names (ES6) var o = { property([parameters]) {}, get property() {}, set property(value) {}, * generator() {} }; // Computed property names (ES6) var prop = "foo"; var o = { [prop]: "hey", ["b" + "ar"]: "there", };
[[property]]
的用法,[[property]]
又稱做特性
,或者屬性描述
用於給屬性添加額外的能力.在一些語境中, attribute是對外的屬性,而property則是對內的屬性,這有點像特色和天賦的區別,特色是展現給別人看的,而天賦倒是特色的根本.var o = { set current (str) {//給current屬性設置了一個setter方法,和普通方法不一樣的是, 直接訪問setter不會返回函數體. this.log[this.log.length] = str; }, log: [] } o.current="1234" //"1234" o.log //["1234"] o.current //undefined
下面來看ES5的寫法:必須使用Object.defineProperty
或Object.defineProperties
來定義[[property]]
,javascript
var o={};Object.defineProperty(o,"b",{get:function(){return this}}); o.b;//返回b{};
function foo(x) {x.push( 4 );x = [4,5,6];x.push( 7 ); return window.a} var a = [1,2,3]; foo( a );//[1,2,3,4] //結果是顯然的,那麼怎樣修改a自己? function foo(x) {x.push( 4 );x.length = 0; x.push( 4, 5, 6, 7 ); return window.a} var a = [1,2,3]; foo( a );//[4,5,6,7] //對引用類型進行值傳遞,須要一份深拷貝 foo(a.slice());
.length
的運做過程是將字符串包裝成包裝類,而後獲取length
屬性,因此在for循環中每次都要執行這樣的操做一次,這很吃性能,最好是把他儲存爲中間變量.valueOf
屬性得到基本值.var a=new Array(3);//[undefined × 3] var b=[,,,]//三個逗號竟然返回[undefined × 3] var c=[undefined,undefined,undefined] var d=[];d.length=3;//[undefined × 3] b.map((i,x)=>{return x;})//[undefined × 3],由於下標不真實存在! c.map((i,x)=>{return x;})//[0,1,2]!! 由於下標真實存在! //若是你想建立空數組,最好的辦法是 Array.apply(null,{length:3})//返回[undefined,undefined,undefined]
7.日期類型兩種得到當前日期的方法java
Date.now() equal (new Date()).getTime()
symbol
用法:Symbol.for()
與Symbol()
這兩種寫法,都會生成新的Symbol
。它們的區別是,前者會被登記在全局環境中供搜索,後者不會。Symbol.for()
不會每次調用就返回一個新的Symbol
類型的值,而是會先檢查給定的key是否已經存在,若是不存在纔會新建一個值。好比,若是你調用Symbol.for("cat")
30次,每次都會返回同一個Symbol值,可是調用Symbol("cat")
30次,會返回30個不一樣的Symbol值。var a=Symbol("a")//返回一個惟一的標記 var b=Symbol.for("b")//返回一個登記在Symbol全局表中的標記, Symbol.keyFor(b)//複查其字符值. 做爲屬性名的Symbol 因爲每個Symbol值都是不相等的,這意味着Symbol值能夠做爲標識符,用於對象的屬性名,就能保證不會出現同名的屬性。這對於一個對象由多個模塊構成的狀況很是有用,能防止某一個鍵被不當心改寫或覆蓋。 var mySymbol = Symbol(); var a = {};a[mySymbol] = 'Hello!';// 第一種寫法 var a = {[mySymbol]: 'Hello!'};// 第二種寫法 var a = {};Object.defineProperty(a, mySymbol, { value: 'Hello!' });// 第三種寫法 a[mySymbol] // "Hello!"// 以上寫法都獲得一樣結果 內置的Symbol值 除了定義本身使用的Symbol值之外,ES6還提供了11個內置的Symbol值,指向語言內部使用的方法。 Symbol.hasInstance 對象的Symbol.hasInstance屬性,指向一個內部方法。當其餘對象使用instanceof運算符,判斷是否爲該對象的實例時,會調用這個方法。好比,foo instanceof Foo在語言內部,實際調用的是Foo[Symbol.hasInstance](foo)。 class MyClass { [Symbol.hasInstance](foo) {return foo instanceof Array;}} [1, 2, 3] instanceof new MyClass() // true 上面代碼中,MyClass是一個類,new MyClass()會返回一個實例。該實例的Symbol.hasInstance方法,會在進行instanceof運算時自動調用,判斷左側的運算子是否爲Array的實例。 下面是另外一個例子。 class Even {static [Symbol.hasInstance](obj) {return Number(obj) % 2 === 0;}} 1 instanceof Even // false 2 instanceof Even // true 12345 instanceof Even // false
JSON.stringify
undefined\Symbol\function
,會跳過他們,若是沒法跳過就會轉化成null.var a = { val: [1,2,3], // probably correct! toJSON: function(){ return this.val.slice( 1 ); } }; var b = { val: [1,2,3], // probably incorrect! toJSON: function(){ return "[" + this.val.slice( 1 ).join() + "]"; } }; JSON.stringify( a ); // "[2,3]" JSON.stringify( b ); // ""[2,3]""