函数对象的属性 1 2 3 4 5 6 7 8 9 10 11 12 13 <script> function foo ( ) {} var bar = function ( ) {} foo.message = "hello " console .log (foo.message ) console .log (foo.name ,bar.name ) function foo (a,b,c ) {} console .log (foo.length ) </script>
Arguments arguments是一个类数组对象,可以用索引找元素,但无法用filter等方法
因此可以把arguments转Array
1 2 3 4 function foo ( ) { var newArgs1 = Array .from (arguments ) var newArgs2 = [...arguments ] }
剩余参数 注意rest参数是一个真正的数组,可以进行数组的所有操作
1 2 3 4 function foo (num1, num2, ...otherNums ) { clg (otherNums) } foo (222 ,12 ,123 ,123 )
函数式编程 纯函数
相同的输入值,需产生相同的输出
函数输出和输入值以外的其他隐藏信息或状态无关,也和由I/O设备产生的外部输出无关
不能有语义上可观察的函数副作用,诸如”触发事件”,使输出设备输出,或更改输出值以外物件的内容
柯里化(Curring)
把接受多个参数的函数,变成接受一个单一参数的函数,并且返回接受余下的参数,而且返回结果的新函数的技术
柯里化声称,如果你固定某些参数,你将得到接受余下参数的一个函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 function foo (x, y, z ) { console .log (x + y + z) } foo (10 , 20 , 30 ) function foo (x ) { return function (y ){ return function (z ){ console .log (x, y, z) } } } foo (10 )(20 )(30 ) var foo3 = x => y => z => console .log (x + y + z)
组合函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 function double (num ){ return num*2 } function pow (num ){ return num ** 2 } function composeFn (...fns ){ var length = fns.length for (var i =0 ; i < length; i++){ var fn = fns[i] if (typeof fn !== "function" ){ throw new Error ("position ${i} must be function" ) } } return function (...args ){ var result = fns[0 ].apply (this , args) for (var i = 1 ; i <length; i++){ var fn =fns[i] result= fn.apply (this ,[result]) } } } var newFn = composeFn (double, pow) console .log (newFn (100 )) newFn (100 )
with语句的使用(了解) 1 2 3 4 5 6 7 var obj = { ms : "hello" } with (obj) { console .log (ms) }
严格模式
严格模式可以在js文件开启,在函数开头开启
1 2 3 4 5 6 js :"use strict" function alugg ( ){ "use strict" }
严格模式的限制
不会意外创建全局变量
会引起静默失败的复制操作抛出异常
试图删除不可删除的属性
不允许函数参数有相同的名称
不允许使用with
this绑定不会转成对象类型
对象属性控制 属性描述符
可以修改属性,可以添加属性
Object.defineProperty()
1 2 3 4 5 6 7 var obj = { name : "why" , age :18 } Object .defineProperty (obj, "name" , { configurable : false , })
Object.definePropertiest一次定义多个属性描述符
数据属性Data Properties描述符(Descriptor)
configurable
enumerable
value
writable
存取属性(Accessor访问器 Properties)描述符
configurable
enumerable
get
set
通过对象定义属性,configurable,enumerable,writable默认都是true,但通过对象属性描述符默认则是false
**Configurable:**表示属性是否可以通过delete删除属性,是否可以修改它的特性,或者是否可以将它修改为存取属性描述符
**Enumerable:**表示属性是否可以通过for-in或者Objects.keys()返回该属性
**Writable:**表示是否可以修改属性的值