YongSir

专业程序员伪装者

JS jQuery拾遗

记录一下JS中某些语法点,以及同swift,python等的对比

默认参数(Default arguments)

函数支持默认参数的必要性:从个人经历来看,在开发中特别是组建和公共API的开发中,由于JS松散的类型,特别是函数调用参数不定的特点,屡屡出现的类型检测这样的鸡肋代码让人如鲠在喉,eg:

1
2
3
4
5
6
7
var add = function(a, b) {
b = typeof b !== "undefined" ? b : 0
return a + b
}

add(1) // 1
add(1,1) // 2

如果使用默认参数,我们就省去了不必要的检测:

1
var add = function(a, b=0)

剩余/可选参数(Rest arguments)

正如前边所说,js函数调用很松散,所以可选参数在js上很容易实现,最简单的莫过于使用arguments,但对其他语言就需要特殊的支持,ES6上显然也是这样认为的,所以:

1
2
3
function(arg0, arg1, ...rest) {
alert('you pass' + rest.length + 'extra args')
}

说明: 根arguments对象不同,剩余参数数组rest是一个真实的数组

jQuery 常见方法

  • 集合类操作相关:对集合类元素的遍历操作已经见怪不怪了,几乎所有的语言都有,比如swift和java中的map,reduce等等,在jQuery中也自然存在:
    $.each(obj, function(key, value))
    $.map(obj, function(value, index):自1.4之前只对数组管用,1.6之后改为所有,按设计规则,常根return
    $.extend([deep?], target, [obj1, ...]):对象的合并扩展,默认是浅拷贝,常常用在函数参数的扩展上,这一点倒是根默认参数的设计很契合,可以扩展已有的参数 eg

    1
    2
    3
    4
    5
    6
    // 通过extend扩展已有参数
    function(obj) {
    var default = {a: 'a'};
    var opt = $.extend(default, obj);
    console.log(opt);
    }

    deep表示是否递归拷贝
    Demo 测试

jQuery非典型

当从window对象开始查找时,如果使用jQuery函数会出现问题,eg:

1
2
3
$(window).on('scroll', function (e) {
var img = $(this).find('img) // find函数只会返回[]
})

visibility: hiddendisplay: none

最重要的区别在于: 后者脱离文档流,而前者不是,所有的效果差异都是这一点造成的,如前者会在隐藏的部分保持空白,而后者不会,再如在hidden以后,前者可检测宽高offSet等位置信息,而后者没有,在作页面自动加载时遇到了这个问题,在此记录