你认为每个程序员都应该知道哪些JavaScript“隐藏功能”?
在看过以下问题的优秀答案之后,我想是时候问一下JavaScript了。
虽然JavaScript现在可以说是最重要的客户端语言(只需询问谷歌),但令人惊讶的是,大多数Web开发人员很少欣赏它真正的强大之处。
你认为每个程序员都应该知道哪些JavaScript“隐藏功能”?
在看过以下问题的优秀答案之后,我想是时候问一下JavaScript了。
虽然JavaScript现在可以说是最重要的客户端语言(只需询问谷歌),但令人惊讶的是,大多数Web开发人员很少欣赏它真正的强大之处。
你不需要为一个函数定义任何参数。你可以直接使用函数的arguments
类数组对象。
function sum() {
var retval = 0;
for (var i = 0, len = arguments.length; i < len; ++i) {
retval += arguments[i];
}
return retval;
}
sum(1, 2, 3) // returns 6
arguments
对象就会使调用函数变慢很多 -- 比如说,如果(false) arguments; 将会影响性能。 - olliej我可以引用道格拉斯·克罗克福德(Douglas Crockford)的优秀著作JavaScript高级程序设计中的大部分内容。
但是我只为你选取其中一个,那就是始终使用===
和!==
而不是==
和!=
。
alert('' == '0'); //false
alert(0 == ''); // true
alert(0 =='0'); // true
==
不具有传递性。如果您使用 ===
,则对于所有这些语句,它将按预期返回 false。
==
" 是相等比较运算符,在比较时会进行类型转换。
- "===
" 是严格相等比较运算符,不会进行类型转换。==
最令人害怕的部分是'\n\t\r ' == 0
=> true
... :D - sharat87在 JavaScript 中,函数是一等公民:
var passFunAndApply = function (fn,x,y,z) { return fn(x,y,z); };
var sum = function(x,y,z) {
return x+y+z;
};
alert( passFunAndApply(sum,3,4,5) ); // 12
特别地,函数可以作为参数传递,例如Array.filter()接受一个回调函数:
[1, 2, -1].filter(function(element, index, array) { return element > 0 });
// -> [1,2]
您还可以声明一个“私有”函数,该函数仅存在于特定函数的范围内:
function PrintName() {
var privateFunction = function() { return "Steve"; };
return privateFunction();
}
var x = 1;
var y = 3;
var list = {0:0, 1:0, 2:0};
x in list; //true
y in list; //false
1 in list; //true
y in {3:0, 4:0, 5:0}; //true
function list()
{ var x = {};
for(var i=0; i < arguments.length; ++i) x[arguments[i]] = 0;
return x
}
5 in list(1,2,3,4,5) //true
queue[item] = false;
会使 (item in queue) === true
,但仍保留 (queue[item] === false)
... 在某些情况下非常方便(而且看起来比使用hasOwnProperty更清晰)。 - chakrit给变量赋默认值
您可以在赋值表达式中使用逻辑或运算符||
来提供默认值:
var a = b || c;
null
,false
,undefined
,0
,空字符串
或NaN
),变量a
将获得变量c
的值,否则变量a
将获得变量b
的值。这在函数中经常很有用,当您想为参数提供默认值以防未被赋值时:function example(arg1) {
arg1 || (arg1 = 'default value');
}
在事件处理程序中的IE回退示例:
function onClick(e) {
e || (e = window.event);
}
debugger
语句
描述在:§ 12.15 debugger语句
此语句允许您通过编程方式在代码中放置断点:// ...
debugger;
// ...
var str = "This is a \
really, really \
long line!";
你必须小心,因为紧跟在\
后面的字符必须是一个行终止符,如果在\
后面有空格,代码看起来可能完全一样,但会引发SyntaxError
。
var _gaq = _gaq || [];
它可以防止过于热心的用户覆盖自己的工作。 - YahelJavaScript没有块级作用域(但它有闭包,所以说平了?)。
var x = 1;
{
var x = 2;
}
alert(x); // outputs 2
您可以使用[]
而不是.
来访问对象属性。
这允许您查找与变量匹配的属性。
obj = {a:"test"};
var propname = "a";
var b = obj[propname]; // "test"
您也可以使用此方法来获取/设置对象属性,其名称不是一个合法的标识符。
obj["class"] = "test"; // class is a reserved word; obj.class would be illegal.
obj["two words"] = "test2"; // using dot operator not possible with the space.
一些人不知道这一点,最终使用eval() 像这样,这是一个非常糟糕的想法:
var propname = "a";
var a = eval("obj." + propname);
这种方式更难阅读,更难发现错误(无法使用jslint),执行速度更慢,并且可能导致XSS攻击。
foo.bar
的行为与 foo["bar"]
相同。而且需要注意的是,所有内容都是字符串属性。即使进行数组访问 array[4]
,数字 4 也会被转换为字符串(至少根据 ECMAScript v3 规范如此)。 - Claudiu如果您在Google上搜索关于某个JavaScript主题的良好参考资料,请在查询中包含“mdc”关键字,您的第一个结果将来自Mozilla开发者中心。我不带任何离线参考书或书籍。我总是使用“mdc”关键字技巧直接找到我要找的内容。例如:
谷歌:javascript array sort mdc
(在大多数情况下,您可以省略“javascript”)
更新: Mozilla开发者中心已更名为Mozilla开发者网络。 "mdc"关键字技巧仍然有效,但很快我们可能需要开始使用“mdn”。
对于一些人来说可能有点显而易见...
安装 Firebug 并使用 console.log("hello")。这比使用随机的alert(); 要好得多,我记得几年前经常这样做。
私有方法
一个对象可以拥有私有方法。
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
// A private method only visible from within this constructor
function calcFullName() {
return firstName + " " + lastName;
}
// A public method available to everyone
this.sayHello = function () {
alert(calcFullName());
}
}
//Usage:
var person1 = new Person("Bob", "Loblaw");
person1.sayHello();
// This fails since the method is not visible from this scope
alert(person1.calcFullName());