函數(shù)
新特性
新增參數(shù)默認(rèn)值
在寫函數(shù)的時候可以給形參所在的變量分配一個默認(rèn)值损拢,如果在調(diào)用函數(shù)的時候撒犀,沒有寫入實參福压,那么形參變量中的值就是默認(rèn)值或舞。
默認(rèn)值會讓function
的length
屬性失真,在默認(rèn)值后包含默認(rèn)值的形參將不會計入length屬性,并且嚴(yán)格模式不可以使用嚷那。
function test(x,y=10) {
return x + y;
}
console.log(test()) // NaN 因為x沒有值 而y是一個數(shù)字
console.log(test(3,3)) // 6
console.log(test(3)); // 13
新增rest參數(shù)
寫法...vals
胞枕,vals只是一個變量名魏宽,寫什么都可以,記得放在參數(shù)末尾也就是最后一個參數(shù)决乎,不然會報錯队询。
rest參數(shù)就是一個數(shù)組构诚。嚴(yán)格模式不可以使用。
function testEach(...vals) {
vals.forEach(function (val) {
console.log(val);
})
}
function test(...vals) {
for (var val in vals){
console.log(vals[val]);
}
}
test("呵","呵") // 呵送膳,呵
testEach(1,2,3,4) // 1,2,3,4
新增擴展運算符...
...
可以把一個數(shù)組轉(zhuǎn)化為序列的方式,不止是數(shù)組偽數(shù)組也可以碌补。
嚴(yán)格模式不可以使用。
function test(a,b,c) {
return a+b+c;
}
console.log(test(...[1,2,3])); // 6
函數(shù)的name屬性
name
返回的是一個函數(shù)的名稱
function test() {
}
var arr = new Array();
console.log(test.name) // test
console.log(arr.push.name) // push
函數(shù)的新寫法“箭頭函數(shù)”
箭頭函數(shù)可以簡化原先函數(shù)的書寫方式照藻,實例如下袜啃。
var myparseInt = num => Number.parseInt(num)
var n = myparseInt("72b");
console.log(n); // 72
如上代碼num => Number.parseInt(num)
相當(dāng)于一個匿名函數(shù),而myparselnt
則相當(dāng)于一個函數(shù)的名稱,也可以說是一個變量接收了一個匿名函數(shù)那么久可以通過這個變量來調(diào)用函數(shù)幸缕,匿名函數(shù)如果放到ES5中代碼如下:
var myparseInt =function(num) {
return Number.parseInt(num)
}
多個參數(shù)或者沒有參數(shù)可以用()來表示參數(shù)的地方如:
var test= ()=> "返回值"
//等同于
var test =function() {
return "返回值"
}
如果返回值大于一條語句要用{}
包裹起來囊骤。
var test= (num1,num2)=> {
var n = num1 + num2;
return n/10;
}
console.log(test(30,40)) // 70
箭頭函數(shù)里面根本沒有自己的this晃择,而是引用外層的this。
function fn() {
return () =>{
return () =>{
return this.name
}
}
}
var jack = fn.call({"name":"jack"})
/**
獲取的jack
function () {
return function () {
return _this.name;
};
}
*/
console.log(jack)
console.log("---" + jack.name) // ---
console.log(jack.call()()) // jack
console.log(jack.call({"name":"jack2"})()) // jack
var jack2 =jack.call({"name":"jack2"});
console.log("---" + jack2.name) // ---
/**
jack2
function () {
return _this.name;
}
*/
console.log(jack2)
console.log(jack2()) // jack
對象
新特性
對象屬性的簡易寫法
// 變量
var name = "jack";
var age = 18;
// 將變量賦值給對象
var obj = {name};
obj = {age}
console.log(obj) // Object {age: 18} 會覆蓋上一個name
obj = {name,age}
console.log(obj) // Object {name: "jack", age: 18} 這樣就可以不覆蓋了
對象的方法簡易寫法(五星好評)
var p = {
run(){
console.log("跑");
}
}
p.run()
屬性名與方法名可以利用表達(dá)式
var n = "name"
var r = "run";
var obj = {
[n] : "jack",
[r](){
return "跑";
}
}
console.log(obj.name) // jack
console.log(obj.run()) // 跑
Object.is()
判斷2個值是否相等
var a = NaN;
var b = NaN;
console.log(Object.is(a,b)) // true
Object.assign()
合并對象也物,包含屬性和方法的合并,第一個參數(shù)是主對象宫屠,后面的是要合并的對象。
var obj = {};
var car = {
run(){
return "跑";
}
}
var dog = {
eat(){
return "吃";
}
}
Object.assign(obj,car,dog);
console.log(obj.run()); // 跑
console.log(obj.eat()); // 吃
Object的描述對象Descriptor
Object.getOwnPropertyDescriptor(obj,key)
獲取這個描述對象
var car = {
run(){
return "跑";
}
}
/**
描述對象 enumerable 決定是否是可以在循環(huán)中被遍歷出的屬性
Object
configurable: true
enumerable: true
value: run()writable: true
__proto__: Object
*/
console.log(Object.getOwnPropertyDescriptor(car,"run"));
Object.keys(obj)
返回由對象所有鍵所組成的數(shù)組
var car = {
run(){
return "跑";
}
}
var arr = Object.keys(car)
console.log(arr); // ["run"];
Object.values(obj)
返回由對象所有值所組成的數(shù)組,其特性與keys
一樣
var test = {name:"test"}
var vals = Object.values(test)
console.log(vals) // ["test"]
Object.entries(obj)
這個返回值有2種情況,當(dāng)對象只有一個鍵值對的時候只會返回一個一維數(shù)組,0
下標(biāo)的是key
而1
下標(biāo)的是val
,但是當(dāng)這個對象有多個鍵值對的時候,所返回的就是一個二維數(shù)組,每一個鍵值對就是一個一維數(shù)組.
var test = {name:"test"}
test.age = 12;
var entries = Object.entries(test)
console.log(entries) // [["name","test"],["age",12]]
Object.getOwnPropertyNames(obj)
表面看和keys這個方法區(qū)別不大,但是如果是enumerable: true
描述對象中的這個屬性為否在keys
中是不可能遍歷出的但是在這里就可以遍歷了
var arr = [1];
arr.name = "數(shù)組";
var keysArr = Object.keys(arr)
var getOwnPropertyNamesArr = Object.getOwnPropertyNames(arr);
console.log(keysArr); // ["0", "name"]
console.log(getOwnPropertyNamesArr) // ["0", "length", "name"]
Reflect.ownKeys(obj)
返回值為數(shù)組,包含所有的key,不論enumerable
和Symbol
var arr = [1];
arr.name = "數(shù)組";
var keysArr = Reflect.ownKeys(arr)
console.log(keysArr); // ["0", "length", "name"]
Object.setPrototypeOf(obj,proto)
可以設(shè)置對象中的proto屬性
var car = {
run(){
return "跑";
}
}
console.log(car);
/**
結(jié)果如下:
Object
run: run()
__proto__:Object
__defineGetter__:__defineGetter__()
__defineSetter__:__defineSetter__()
__lookupGetter__:__lookupGetter__()
__lookupSetter__: __lookupSetter__()
constructor: Object()
hasOwnProperty: hasOwnProperty()
isPrototypeOf:isPrototypeOf()
propertyIsEnumerable:propertyIsEnumerable()
toLocaleString: toLocaleString()
toString: toString()
valueOf: valueOf()
get __proto__: __proto__()
set __proto__: __proto__()
*/
var car = {
run(){
return "跑";
}
}
var test = {name:"test"}
Object.setPrototypeOf(car,test);
console.log(car)
/**
Object
run: run()
__proto__: Object
name: "test"
__proto__: Object
__defineGetter__:__defineGetter__()
__defineSetter__:__defineSetter__()
__lookupGetter__:__lookupGetter__()
__lookupSetter__: __lookupSetter__()
constructor: Object()
hasOwnProperty: hasOwnProperty()
isPrototypeOf:isPrototypeOf()
propertyIsEnumerable:propertyIsEnumerable()
toLocaleString: toLocaleString()
toString: toString()
valueOf: valueOf()
get __proto__: __proto__()
set __proto__: __proto__()
*/
Object.getPrototypeOf(obj)
取出一個對象的proto
屬性 和setPrototypeOf
對應(yīng)