JavaScript 的隐藏特性?

IT技术 javascript hidden-features
2021-01-29 11:29:22

你认为每个程序员都应该知道 JavaScript 的哪些“隐藏特性”?

在看到以下问题的高质量答案后,我认为是时候向它询问 JavaScript 了。

尽管 JavaScript 可以说是目前最重要的客户端语言(问问 Google),但令人惊讶的是,大多数 Web 开发人员很少意识到它的强大功能。

6个回答

您不需要为函数定义任何参数。您可以只使用该函数的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
同样,参数有一个“被调用者”属性,它是当前函数本身。这允许使用匿名函数进行递归,很酷!
2021-03-13 11:29:22
@Nathan "f(x,y,z)" 看起来比 "f([x,y,z])" 更好。
2021-03-25 11:29:22
还值得注意的是,访问 Arguments 对象的成本相对较高——最好的例子是在 Safari、Firefox 和 Chrome nightlies 中,仅仅引用arguments对象会使调用函数的速度慢得多——例如。如果(假)参数;会伤害性能。
2021-04-01 11:29:22
@Vincent Robert:请注意,它arguments.callee已被弃用。
2021-04-04 11:29:22
哇!真的?!老实说,我不知道。这个网站真的需要一个“最喜欢的答案”功能。我肯定会添加这个。
2021-04-06 11:29:22

我可以引用道格拉斯·克罗克福德 (Douglas Crockford) 的优秀著作JavaScript: The Good Parts 的大部分 内容

但我只给你一个,总是用===and!==代替==and!=

alert('' == '0'); //false
alert(0 == ''); // true
alert(0 =='0'); // true

==不是可传递的。如果您使用===它,则会按预期为所有这些语句提供 false。

我认为最可怕的部分=='\n\t\r ' == 0=> true... :D
2021-03-20 11:29:22
遗憾的是,这么多人认为克罗克福德是无所不知的。诚然,这个人的大部分批评都是正确的,但我没有像许多开发人员那样全面支持他的东西......
2021-03-27 11:29:22
我支持杰森的警告。这本书本身就是很有意思,它确实给了很多好的建议,但DC是太相信他做事的方式是唯一正确的道路,一切是“有缺陷”。如果您想要一些示例,请查看他在 JSLint Yahoo Group 上的回复。
2021-03-29 11:29:22
好吧 == 和 === 与动态类型无关。== 执行类型强制,这是一个不同的野兽。如果您知道要转换为字符串/数字/等,那么您应该明确地这样做。
2021-04-04 11:29:22
如果您对动态类型感到困惑并且只希望它“真正”相等,那么使用 === 而不是 == 是一个很好的建议。我们这些了解动态类型的人可能会在我们知道要强制转换的情况下继续使用 ==,例如 0 == '' 或 0 == '0'。
2021-04-10 11:29:22

函数是 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

函数式编程技术可用于编写优雅的 javascript

特别是,函数可以作为参数传递,例如Array.filter()接受回调:

[1, 2, -1].filter(function(element, index, array) { return element > 0 });
// -> [1,2]

您还可以声明一个仅存在于特定函数范围内的“私有”函数:

function PrintName() {
    var privateFunction = function() { return "Steve"; };
    return privateFunction();
}
我刚刚更新了示例以展示如何使用仅存在于特定函数范围内的“私有”函数。
2021-03-13 11:29:22
不确定这是一个隐藏功能……更像是一个核心功能。
2021-03-15 11:29:22
函数即数据的概念绝对在我的书中赢得了很大的分数。
2021-03-17 11:29:22
javascript中创建函数的三种方式: function sum(x, y, z){ return (x+y+z); 和 var sum = new Function("x", "y", "z", "return (x+y+z);"); 是其他方式。
2021-03-25 11:29:22
new Function()和 一样邪恶eval不使用。
2021-03-30 11:29:22

您可以使用in运算符检查对象中是否存在键:

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
另外,要小心:in 操作符也会测试原型链!如果有人在 Object.prototype 上放置了一个名为 '5' 的属性,那么即使您在 list(1, 2, 3, 4)' 中调用了 '5',第二个示例也会返回 true... 你最好使用 hasOwnProperty方法:list(1, 2, 3, 4).hasOwnProperty(5) 将返回 false,即使 Object.prototype 具有属性 '5'。
2021-03-17 11:29:22
@Kris,除非有人覆盖 Object.prototype.hasOwnProperty ;)
2021-03-17 11:29:22
对于最通用的解决方案,可以测试一个对象是否有自己的属性,即使它被命名为“hasOwnProperty”,你也必须一路走到: Object.prototype.hasOwnProperty.call(object, name) ;
2021-03-21 11:29:22
我有一段时间没有使用该技术,所以我忘记了我之前实际上使用过对象字面量。谢谢指正。
2021-03-22 11:29:22
不是那么聪明,它会检查键是否存在,而不是值是否存在。列表中的 x;只因为 x[1] != null 才有效,而不是因为值 1 存在。
2021-03-23 11:29:22

为变量分配默认值

您可以||在赋值表达式中使用逻辑或运算符来提供默认值:

var a = b || c;

a变量将获得的valuec只有当bfalsy(如果是nullfalseundefined0empty string,或NaN),否则a将获得的valueb

这在函数中通常很有用,当您想在未提供参数的情况下为参数提供默认值时:

function example(arg1) {
  arg1 || (arg1 = 'default value');
}

事件处理程序中的 IE 回退示例:

function onClick(e) {
    e || (e = window.event);
}

以下语言特性已经存在很长时间了,所有 JavaScript 实现都支持它们,但直到ECMAScript 5th Edition之前它们才成为规范的一部分

debugger声明

描述于:§ 12.15 调试器语句

此语句允许您通过以下方式以编程方式在代码中放置断点

// ...
debugger;
// ...

如果调试器存在或处于活动状态,它将导致它立即中断,就在该行上。

否则,如果调试器不存在或不活动,则此语句没有可观察到的效果。

多行字符串文字

描述于:§ 7.8.4 字符串文字

var str = "This is a \
really, really \
long line!";

你必须小心,因为旁边的字符\ 必须是一个行终止符,如果你在\example后面有一个空格,代码看起来完全一样,但它会引发一个SyntaxError.

如果它是空的,如果它被认为是错误的,则不会。a = 0 || 42; 会给你 42。这可以与 Python 或 C# 相媲美??操作员。如果您想要 C# 行为,请执行 a = (b === null) ?丙:乙;
2021-03-12 11:29:22
我希望有适当的 || 仅用于未定义。我今天被这个咬了 0,因为我想创建重载方法的模拟,所以最后一个参数是可选的,而是使用默认值。
2021-03-13 11:29:22
如果您在 ASP.NET 上开发,它也适用于 Visual Studio :)
2021-03-31 11:29:22
我不知道多行字符串文字技术。太棒了,谢谢。
2021-04-04 11:29:22
+1 默认的 Google Analytics 代码段使用了这个技巧。` var _gaq = _gaq || [];`; 它可以防止过度热心的用户覆盖他们自己的工作。
2021-04-08 11:29:22