看了 javascript 杂谈之哪种写法你更喜欢? 后很是有收获,所以总结一下:
1.js支持“逻辑短路”,所谓逻辑短路是指:
- 在”||” 运算中,第一个条件符合就结束判断。
- 在”&&”运算中,第一个条件不符合就结束判断。
2.匿名函数
function(
这种写法作用是声明并执行一个方法,等同于:() { })();
Test() { } Test();
3.连续赋值
var a = {n:1};
var b = a;
a.x = a = {n:2}; //相当于a.x=(a={n:2})
console.log("a.x: " + a.x); //返回值:a.x: undefined
console.log("a.n: " + a.n); //返回值:a.n: 2
console.log("b.x: " + b.x); //返回值:b.x: [object Object]
console.log("b.n: " + b.n); //返回值:b.n: 1
说明:由于js中的连续赋值是按引用传递的,所以在a.x=a={n:2}后,两个a已经不是一个对象了,所以现在的a中并没x这个属性
4.下边这段代码类似与jquery中的写法
(function (windows) {
var yQuery = function () {
//获取对象本身
return yQuery.fn.init();
};
yQuery.fn = yQuery.prototype = {
//初始化
inti: function () {
return this;
}
};
//这里定义扩展方法
yQuery.extend = yQuery.fn.extend = function () {
var options, src, copy,
target = arguments[0] || {},
i = 1,
length = arguments.length;
if (length === i) {
//this=yQuery=$
target = this;
--i;
}
for (; i < length; i++) {
if ((options = arguments[i]) != null) {
for (var name in options) {
src = target[name];
copy = options[name];
//判断this中是否存在,存在则跳过,执行下一次循环
if (src === copy) {
continue;
}
//判断是不是对象,如果是对象则递归
if (typeof copy === "object") {
yQuery.extend(name, copy);
}
if (copy !== undefined) {
//这里的target=yQuery=$
target[name] = copy;
}
}
}
}
return target;
};
//向window中添加yQuery和$属性
windows.yQuery = windows.$ = yQuery;
})(window);
使用:
方法一:
$.extend({Name:””,getName:function(){alert($.Name)}});
方法二:
$.ui=$.ui || {}; //如果$.ui存在则把自己赋值给自己,反之添加ui并赋值为空对象{}
$.extend($.ui,{Name:””,getName:function(){alert($.Name)}});