我在es-discuss邮件列表中遇到以下代码: Array.apply(null, { length: 5 }).map(Number.call, Number); 这产生 [0, 1, 2, 3, 4] 为什么这是代码的结果? 这里发生了什么事?
我看到有关“新”Object.create,使枚举可configuration的post。 但是,它依赖于Object.defineProperty方法。 我找不到这个方法的跨浏览器实现。 我们坚持写旧的Object.create吗? 我不能写在IE6 / 7中不起作用的东西。
在阅读这篇贴在dzone上的文章时,我发现了由Marcus Lagergren最初在Twitter上发布的一段JavaScript代码。 下面的代码显然打印string"fail" (![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]; 这涉及到隐式types转换,我试图理解这条线是如何解释的。 我已经隔离每个字符 (![]+[])[+[]]打印"f" (![]+[])[+!+[]]打印"a" ([![]]+[][[]])[+!+[]+[+[]]]打印"i" (![]+[])[!+[]+!+[]]打印"l" 我也设法分解expression式,从"i" 字母"f" ![]一个空数组是一个对象,根据ECMAScript文档,点9.2在转换为boolean时计算为true ,所以这是false false+[]按照第11.6.1节二进制+运算符的两个参数都被转换为String,因此我们得到"false"+"" ,其结果为"false" +[]一个加号运算符会导致一个ToNumber转换,如果该参数是一个Object则会进行ToPrimitive转换。 这种转换的结果是通过调用对象的[[DefaultValue]]内部方法来确定的。 如果数组为空,则默认为0 。 (ECMAScript文档,章节: 11.4.6,9.3,9.1 ) "false"[0]我们访问索引为0的字符,因此"f" 字母"a" 同样的故事,这里唯一的区别是方括号内的部分(通过使用一元+和! )触发的额外的转换(通过计算一个数字来指向string"false"中的另一个字符) ! 运营商。 如上所述, +[]计算结果为0 。 如第9.2 节和第11.4.9 节中定义的那样, !0评估为true 。 首先,将0转换为布尔值false ,然后运算符将该值反转。 +true再次为+true ,一元正则触发一个ToNumber转换,它返回一个1表示二进制true ( Section 11.4.6 and 9.3 ) "false"[1]返回string中的第二个字符,即"a" 字母“l” !+[]计算结果如上所述 使用基元上的二进制+ true+true触发ToNumber转换。 如果是,则结果是1+1等于2 "false"[2] – […]
在一个未知的主机环境中,以ES5严格模式处理全局对象的build议方法是什么? ECMAScript不提供一个内置的方式来引用我知道的全局对象。 如果是这样,这是我正在寻找的答案。 在已知的环境中 ,全局对象通常具有自引用属性。 由于全局对象是全局范围的VO ,因此全局对象的属性是全局variables,所以我们可以使用它们从任何地方获取全局对象的句柄: 在networking浏览器中,我们可以使用window或self 。 在node.js中,我们可以使用global 。 但是,在所有主机环境中并不一定如此。 据我所知,Windows Script Host不提供任何方法来访问全局对象。 在WSH中获取全局对象的推荐方法似乎是在不parsing对象的上下文中使用this关键字。 例如: var GLOBAL = (function(){return this}()); 这种技术将适用于任何主机环境,但不能用于严格模式,因为未定义的方式不会在严格模式下引用全局对象: 如果在严格模式代码中评估这个值,那么这个值不会被强制转换为对象。 null或undefined的这个值不会被转换为全局对象,并且原始值不会被转换为包装器对象。 通过函数调用传递的值(包括使用Function.prototype.apply和Function.prototype.call调用的函数)不会强制将此值传递给对象(10.4.3,11.1.1,15.3.4.3,15.3。 4.4)。 正如所料,以下代码导致undefined : (function(){ "use strict"; var GLOBAL = (function(){return this}()); console.log(GLOBAL); }()); 那么, 在任何环境下,无论严格模式如何处理全局对象,正确的方法是什么? 顺便说一句,我目前的方法是嗅探引用全局对象的全局variables,如下所示: var self, window, global = global || window || self; …然后只是使用global 。 我认为这是一个不好的解决办法,其中大部分是相当明显的,并没有解决WSH问题。
正如你可能知道的那样,ECMAscript试图变得聪明,如果你没有明确地写入分号 ,它会自动插入分号 。 简单的例子 function foo() { var bar = 5 return bar } 仍然按预期工作。 但是,如果你依赖于这一点,有一些警告。 如果我们重新写这样的function function foo() { var bar = 5 return { bar: bar } } ..这个函数现在会返回undefined因为解释器会在return语句后面插入这个分号(这就是为什么你总是应该在同一行作为一个语句带上大括号的原因)。 但是,知道所有这一切,我想知道现在在不同的浏览器和版本中,像下面这样的return语句是多么的安全 function foo() { var a = true, b = true, c = false; return a && b && c; } 我只是在生产环境中写了一个类似的return statement 。 […]
我明白,JavaScript中的每个函数都是一个一级对象,并且它有一个内部属性[[scope]],它托pipe函数的自由variables的绑定logging。 但是,有两个特例。 Function构造函数创build的函数是否也是闭包? 由Function构造函数创build的函数对象是特殊的,因为它的[[scope]]不能引用其外部函数的词法环境,而只能引用全局上下文。 例如, var a = 1; var fn = (function outer() { var a = 2; var inner = new Function('alert(a); '); return inner; })(); fn(); // will alert 1, not 2. 这是不直观的。 这也被称为封闭? 如果一个内部函数没有任何自由variables,那么当内部函数被创build时,我们可以说是闭包吗? 例如, // This is a useless case only for academic study var fn = (function outer() { […]
我正在玩nodejs和mongoose – 试图find深入的评论嵌套recursionfunc和foreach内的具体评论。 有没有办法阻止nodejs forEach? 据我所知每一个迭代是一个函数,我不能只是做“rest”,只有“返回”,但这不会停止foreach。 function recurs(comment){ comment.comments.forEach(function(elem){ recurs(elem); //if(…) break; }); }
我正在查看一些代码片段,并且发现多个元素通过节点列表调用一个函数,forEach应用于一个空的数组。 比如我有这样的东西: [].forEach.call( document.querySelectorAll('a'), function(el) { // whatever with the current node }); 但我不明白它是如何工作的。 任何人都可以解释我在forEach前的空数组的行为,以及如何call ?
注意 :这个问题是从ECMAScript版本3或5的angular度提出的。在ECMAScript 6版本中引入新function可能会使答案过时。 Javascript中var关键字的function究竟是什么,以及它们之间有什么区别: var someNumber = 2; var someFunction = function() { doSomething; } var someObject = { } var someObject.someProperty = 5; 和: someNumber = 2; someFunction = function() { doSomething; } someObject = { } someObject.someProperty = 5; 你什么时候可以使用一个,为什么?它有什么作用?