var f = v => v;
等同于
var f = function(v) {
return v;
};
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" });
1.临时使用的函数。并不会刻意的调用,比如异步的处理函数,事件的处理函数。
2.需要沿用外层this。
3.对象的属性不用箭头函数,除非有特别需求。
4.数组的方法时为了保证代码的简洁性可以使用。
5.适用于不需要使用函数名时调用
1.箭头函数中没有 this,argument,new.target,如果非要使用,则指向外层函数对应的this,argument,new.target.(箭头函数的this指向箭头函数定义时所处的对象,而不是箭头函数使用时所在的对象,默认使用父级的this.)
2.箭头函数没有原型,所以说占用内存空间非常小,不能当成构造函数来使用。
作用:符号的设计是给对象添加私有属性,只能在对象内部进行方法。
特点:
var s1 = Symbol('foo');
var s2 = Symbol('bar');
s1 // Symbol(foo)
s2 // Symbol(bar)
console.log(typeof Symbol('foo'))//'Symbol'
let syb1 = Symbol()
let syb2 = Symbol()
console.log(syb1 == syb2)//false
const syb1 = Symbol("b");
const obj = {
a: 1,
[syb1]: 2 //符号属性
}
console.log(obj)//a:1,[Symbol(b)]:2;
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))
//针对符号属性的遍历获取:getOwnPropertySymbols() 返回为一个数组
console.log(Object.getOwnPropertySymbols(obj))
//一个新的对象上的API, Reflect.ownKeys()方法可以返回所有类型的键名,包括普通键名和Symbol键名
console.log(Reflect.ownKeys(obj))
const syb = Symbol("my symbol")
// console.log(syb + 10)
// 但是可以显示转换为字符串
console.log(String(syb))
syb.toString()
// symbol可以转换为bool值但是不能转换成数值
Boolean(syb)
1.Symbol.for(“符号描述”),如果符号描述相等,则可以得到同一个符号。
const syb1 = Symbol.for("abc")
const syb2 = Symbol.for("abc")
console.log(syb1,syb2)
console.log(syb1 === syb2)//true
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))