7.箭头函数
1.Es6中允许使用箭头(=>)定义函数,称之为箭头函数
var f = v => v;
等同于
var f = function(v) {
return v;
};
2.箭头函数的简写:
1.如果箭头函数的参数只有一个的时候可以省略小括号。
var f = v => v;
等同于
var f = function(v) {
return v;
};
2.如果箭头函数的函数体只有一条返回语句时,可以省略花括号,可以省略return关键字。
var f = () => 5;
var f = function () { return 5 };
var sum = (num1, num2) => num1 + num2;
var sum = function(num1, num2) {
return num1 + num2;
};
3.如果返回值是一个对象的时候,就会吧对象的花括号认为时函数体的花括号,把返回值变成表达式的形式。
var getTempItem = id => ({ id: id, name: "Temp" });
3.箭头函数使用场景
1.临时使用的函数。并不会刻意的调用,比如异步的处理函数,事件的处理函数。 2.需要沿用外层this。 3.对象的属性不用箭头函数,除非有特别需求。 4.数组的方法时为了保证代码的简洁性可以使用。 5.适用于不需要使用函数名时调用
4.箭头函数的注意点
1.箭头函数中没有 this,argument,new.target,如果非要使用,则指向外层函数对应的this,argument,new.target.(箭头函数的this指向箭头函数定义时所处的对象,而不是箭头函数使用时所在的对象,默认使用父级的this.) 2.箭头函数没有原型,所以说占用内存空间非常小,不能当成构造函数来使用。
8.symbol(符号)
ES6新增一种普通数据类型为符号Symbol
作用:符号的设计是给对象添加私有属性,只能在对象内部进行方法。 特点:
- 没有字面量的创建方式,只有Symbol()创建。
var s1 = Symbol('foo');
var s2 = Symbol('bar');
s1
s2
- 新增的数据类型,typeof返回为symbol。
console.log(typeof Symbol('foo'))
- 每次调用Symbol函数得到的符号永远不会想到,不管有没有符描述和符号描述号是否相同.
let syb1 = Symbol()
let syb2 = Symbol()
console.log(syb1 == syb2)
- 符号可以作为对象的属性名使用,这种属性名叫做符号属性.
const syb1 = Symbol("b");
const obj = {
a: 1,
[syb1]: 2
}
console.log(obj)
- 由Symbol值作为的键名(符号属性), 不会被常规方法所遍历。
- fon…in/for…of/Object.keys()/Object.getOwnPropretyNames()/JSON.stringify().
const syb1 = Symbol("abc")
const obj = {
a : 1,
[syb1] : 2
};
console.log(obj[syb1])
for (const key in obj) {
console.log(key)
}
console.log(Object.keys(obj))
console.log(Object.getOwnPropertyNames(obj))
console.log(Object.getOwnPropertySymbols(obj))
console.log(Reflect.ownKeys(obj))
- 符号类型无法被隐式转换,数学运算,字符串拼接.
const syb = Symbol("my symbol")
console.log(String(syb))
syb.toString()
Boolean(syb)
共享符号和知名符号 :
1.Symbol.for(“符号描述”),如果符号描述相等,则可以得到同一个符号。
const syb1 = Symbol.for("abc")
const syb2 = Symbol.for("abc")
console.log(syb1,syb2)
console.log(syb1 === syb2)
2.知名符号:有特殊含义的符号,配置底层
1. Symbol.hasInstance 影响instanceof运算符的结果。
function A() {}
Object.defineProperty(A, Symbol.hasInstance, {
value: function(v) {
console.log(v)
return false
}
})
const a = new A()
console.log(a instanceof A)
2. Symbol.isConcatSpreadable 会对数组concat方法产生影响。
const arr =[3]
const arr2 = [4,5,6,7];
arr2[Symbol.isConcatSpreadable] = false;
const result = arr.concat(99,arr2)
console.log(result)
const arr = [1]
const obj = {
0 : 3,
1 : 5,
length : 2,
[Symbol.isConcatSpreadable] : true
}
const result = arr.concat(99,obj)
console.log(result)
3. Symbol.toPrimitive 对数据类型的转换产生影响。
const obj = {
a : 1,
b : 2
}
obj[Symbol.toPrimitive] = function(){
return 123
}
console.log(obj + 123)
4.Symbol.toStringTag 可以影响Object.prototype.toString的返回值。
class Person {
[Symbol.toStringTag] = "Person"
}
const p = new Person()
console.log(p)
console.log(Object.prototype.toString.call(p))
|