标签: ecmascript-5

var关键字的目的是什么?我何时应该使用它(或省略它)?

注意:从ECMAScript版本3或5的角度提出了这个问题.在ECMAScript 6发布中引入新功能后,答案可能会过时.

varJavaScript中关键字的功能到底是什么,有什么区别

var someNumber = 2;
var someFunction = function() { doSomething; }
var someObject = { }
var someObject.someProperty = 5;
Run Code Online (Sandbox Code Playgroud)

someNumber = 2;
someFunction = function() { doSomething; }
someObject = { }
someObject.someProperty = 5;
Run Code Online (Sandbox Code Playgroud)

你什么时候使用其中任何一个,为什么/它做什么?

javascript keyword ecmascript-5

1508
推荐指数
15
解决办法
30万
查看次数

获取对象键的数组

我希望将JavaScript对象的键作为数组,在jQuery或纯JavaScript中.

有没有比这更简洁的方式?

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' };
var keys = [];
for (var key in foo) {
    keys.push(key);
}
Run Code Online (Sandbox Code Playgroud)

javascript ecmascript-5

338
推荐指数
6
解决办法
36万
查看次数

如何停止Javascript forEach?

我正在玩nodejs和mongoose - 尝试在深层注释中找到特定注释,并使用递归函数和foreach进行嵌套.有没有办法阻止nodejs forEach?据我所知,每个forEach迭代都是一个函数而且我不能只做"休息",只能"返回",但这不会阻止foreach.

function recurs(comment){
    comment.comments.forEach(function(elem){
        recurs(elem);
        //if(...) break;
    });
}
Run Code Online (Sandbox Code Playgroud)

javascript ecmascript-5

332
推荐指数
8
解决办法
40万
查看次数

Javascript中冻结和密封的区别

我刚刚听说的JavaScript方法freezeseal,可以用来进行任何对象不变.

这是一个如何使用它的简短示例:

var o1 = {}, o2 = {};
Object.freeze(o2);

o1["a"] = "worked";
o2["a"] = "worked";

alert(o1["a"]);   //prints "worked"
alert(o2["a"]);   //prints "undefined"
Run Code Online (Sandbox Code Playgroud)

这些方法有什么区别,它们能提高性能吗?

javascript ecmascript-5

146
推荐指数
6
解决办法
3万
查看次数

如何用Traceur在ES6类中实现私有方法

我现在使用Traceur Compiler来获得ES6功能.

我想从ES5实现这些东西:

function Animal() {
    var self = this,
        sayHi;

    sayHi  = function() {
        self.hi();
    };

    this.hi = function() {/* ... */}
}
Run Code Online (Sandbox Code Playgroud)

目前traceur不支持privatepublic关键字(来自和谐).ES6类语法不允许在类体中使用简单var(或let)语句.

我找到的唯一方法是在类声明之前模拟私有.就像是:

var sayHi = function() {
    // ... do stuff
};

class Animal {
...
Run Code Online (Sandbox Code Playgroud)

没有什么比通过预期的更好,this没有apply-ing或bind-ing它每次都不能将正确的方法传递给私有方法.

那么,是否有可能在ES6类中使用与traceur编译器兼容的私有数据?

javascript class ecmascript-5 ecmascript-6 traceur

134
推荐指数
8
解决办法
19万
查看次数

用JavaScript创建范围 - 奇怪的语法

我在es-discuss邮件列表中遇到了以下代码:

Array.apply(null, { length: 5 }).map(Number.call, Number);
Run Code Online (Sandbox Code Playgroud)

这产生了

[0, 1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

为什么这是代码的结果?这里发生了什么事?

javascript ecmascript-5

127
推荐指数
3
解决办法
1万
查看次数

[] .forEach.call()在JavaScript中做什么?

我正在查看一些代码片段,我发现多个元素在一个节点列表上调用一个函数,并将forEach应用于一个空数组.

例如,我有类似的东西:

[].forEach.call( document.querySelectorAll('a'), function(el) {
   // whatever with the current node
});
Run Code Online (Sandbox Code Playgroud)

但我无法理解它是如何工作的.任何人都可以解释我在forEach前面的空数组的行为以及它是如何call工作的?

javascript arrays foreach nodelist ecmascript-5

118
推荐指数
5
解决办法
7万
查看次数

Javascript减少一个空数组

当我减少数组时,我试图将数字设为零,但我不清楚这个函数的行为

[].reduce(function(previousValue, currentValue){
  return Number(previousValue) + Number(currentValue);
});
Run Code Online (Sandbox Code Playgroud)

结果

TypeError: Reduce of empty array with no initial value
Run Code Online (Sandbox Code Playgroud)

似乎如果数组是空的我无法减少它

[""].reduce(function(previousValue, currentValue){
  return Number(previousValue) + Number(currentValue);
});
Run Code Online (Sandbox Code Playgroud)

结果

""
Run Code Online (Sandbox Code Playgroud)

如果数组中唯一的元素是空字符串,则检索空字符串

javascript arrays ecmascript-5

90
推荐指数
2
解决办法
4万
查看次数

为什么019不是JavaScript语法错误?或者为什么019> 020

如果我输入019 > 020JavaScript控制台(在Chrome和Firefox中测试),我会得到答案true.

这是因为020被解释为OctalIntegerLiteral(等于16),而019显然被解释为DecimalLiteral(和等于19).由于19是大于16,019 > 020true.

令我困惑的是为什么019被解释为DecimalLiteral第一名.它是哪种产品?DecimalIntegerLiteral不允许019:

DecimalIntegerLiteral ::
    0
    NonZeroDigit DecimalDigits_opt
Run Code Online (Sandbox Code Playgroud)

OctalIntegerLiteral也不允许019(因为9不是八进制数字):

OctalIntegerLiteral ::
    0 OctalDigit
    OctalIntegerLiteral OctalDigit

OctalDigit :: one of
    0 1 2 3 4 5 6 7
Run Code Online (Sandbox Code Playgroud)

因此,从我在规范中看到的,019实际应该被拒绝,我不明白为什么它被解释为十进制整数.

我想这里有一些兼容性规则,但我找不到正式的定义.可以请任何人帮我这个吗?

(为什么我需要这个:我正在使用JavaCC为Java开发一个JavaScript/ECMAScript解析器,并且必须特别注意规范 - 以及它的偏差.)

javascript grammar javacc language-lawyer ecmascript-5

78
推荐指数
1
解决办法
2544
查看次数

为什么JavaScript中的对象不可访问?

为什么默认情况下对象不可迭代?

我一直看到与迭代对象有关的问题,常见的解决方案是迭代对象的属性并以这种方式访问​​对象中的值.这似乎很常见,它让我想知道为什么对象本身不可迭代.

for...of默认情况下,像ES6 这样的语句很适合用于对象.因为这些功能仅适用于不包含{}对象的特殊"可迭代对象" ,所以我们必须通过箍来使这个对我们想要使用它的对象起作用.

for ... of语句创建一个循环迭代可迭代对象 (包括Array,Map,Set,arguments对象等)......

例如,使用ES6 生成器功能:

var example = {a: {e: 'one', f: 'two'}, b: {g: 'three'}, c: {h: 'four', i: 'five'}};

function* entries(obj) {
   for (let key of Object.keys(obj)) {
     yield [key, obj[key]];
   }
}

for (let [key, value] of entries(example)) {
  console.log(key);
  console.log(value);
  for (let [key, value] of entries(value)) {
    console.log(key);
    console.log(value);
  }
}
Run Code Online (Sandbox Code Playgroud)

当我在Firefox(支持ES6)中运行代码时,上面按照我期望的顺序正确记录数据:

hacky的输出

默认情况下,{}对象不可迭代,但为什么?缺点是否超过了可迭代对象的潜在好处?与此相关的问题是什么?

此外,由于{}对象是从"阵列状"集合和"可迭代的对象",如不同NodeList,HtmlCollection以及arguments …

javascript arrays iterator ecmascript-5 ecmascript-6

72
推荐指数
4
解决办法
5万
查看次数