问题标签 [ecma262]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - 对标准的权威 JavaScript 验证
我正在尝试验证我网站上的 JavaScript 。这些脚本不会抛出任何错误,并且在 Chrome 和 Firefox(最新稳定版本)上运行良好。但是,动画部分绝对不能在 IE (9)[*1][*solved] 上运行。我已经为动画使用了 jQuery 和 jQueryUI,并希望它可以跨浏览器兼容。
通常我不会关心 IE 用户,但喜欢anybrowser.org上人们的想法,并认为坚持标准而不是使用最低公分母,并将优雅的降级留给浏览器/JS 引擎。根据 w3c 验证器,我的页面是 HTML5 兼容的,我想用 JavaScript 做同样的事情,但找不到可接受的方法。
为什么 JSLint 不起作用 -
- 它不会像 w3c 验证器一样获取页面并检查它。
- 所以没有办法检查 jQuery 引用的脚本。(有一些关于此的帖子)。
我确实找到了一个ECMA-264 测试页面,可以检查浏览器,但不是我的 JavaScript。
所有序言之后的问题是:如何验证网页上的 Javascript?是否有 JavaScript 的权威验证器?
* 1 补充:缩小与脚本在 IE9 上不工作无关。即使是未缩小的版本也不起作用。
*已解决:此评论解决了特定页面的问题。
这开始是“什么是 Javascript? ”在这里关闭并迁移到Programmers。感谢YannisRizos帮助我将原始问题拆分为程序员和 SO 之间可以接受的问题。
javascript - JavaScript 中的原始包装器行为
在《面向 Web 开发人员的专业 Javascript 》一书中,我读到 JavaScript 在尝试访问原始对象的属性和方法时会在内部使用原始包装器。这是否意味着每次我尝试访问字符串原语的长度属性时,都会重新计算值?我的直觉告诉我,由于字符串是固定的,因此它们的长度值存储在某个地方并且只能由包装器访问,但我宁愿确定。
javascript - 具有负数和非整数幂的 Math.pow
ECMAScript 规范Math.pow
具有以下特殊规则:
- 如果 x < 0 且 x 是有限的且 y 是有限的且 y 不是整数,则结果为 NaN。
( http://es5.github.com/#x15.8.2.13 )
结果是Math.pow(-8, 1 / 3)
给出NaN
而不是-2
这个规则的原因是什么?这条规则是否有某种更广泛的计算机科学或 IEEEish 原因,或者它只是 TC39/Eich 曾经做出的选择?
更新
感谢Amadan与我的交流,我想我现在明白了其中的道理。为了后代,我想扩展我们的讨论。
让我们看下面的例子:Math.pow(823543, 1 / 7)
虽然6.999999999999999
它确实应该是7
. 这是由于1 / 7
必须首先转换为十进制表示而导致的不准确性0.14285714285714285
,该表示被截断并失去精度。当我们使用正数时,这并不是一个糟糕的问题,因为我们仍然会得到非常接近真实结果的结果。
然而,一旦我们踏入消极的世界,我们就会遇到问题。如果一个 JavaScript 引擎要尝试计算Math.pow(-823543, 1 / 7)
,它首先需要转换1 / 7
为小数,所以它Math.pow(-823543, 0.14285714285714285)
实际上是没有真正答案的计算。在这种情况下,它可能不得不返回,NaN
因为它找不到实数,即使真正的答案应该是-7
。此外,寻找接近实数的复数以进行“最佳猜测”可能涉及一定程度的复杂性,他们不希望在数学领域中需要 JS 引擎。
我的猜测是由于考虑到浮点数的精度损失,导致他们得出这样的规则:负数的非整数幂应该总是NaN
——基本上是因为非整数幂可能会给出由于精度损失而导致的复数,即使它不应该,并且可能没有好的方法可以从中恢复。
对此,我相当满意,但我欢迎进一步的信息。
javascript - JavaScript 是否有 i18n (Intl) 垫片?
我正在为ECMAScript Internationalization API寻找垫片。有人知道这样的项目吗?(即使它目前仍在进行中。)
javascript - 明确 ECMAScript/JavaScript 中“LexicalEnvironment”和“VariableEnvironment”之间的区别
有人可以澄清这两者之间的区别是什么,因为它们存在于执行上下文中?我很难阅读ECMA 262 v 5规范并清楚地看到差异。
谢谢你,
javascript - 函数表达式是否有自己的作用域/词法环境
我正在阅读ECMA 262 5 规范的执行上下文/词法环境部分。它说明了以下内容:(已添加重点)
词法环境是一种规范类型,用于根据 ECMAScript 代码的词法嵌套结构定义标识符与特定变量和函数的关联。一个词法环境由一个环境记录和一个对外部词法环境的可能为空的引用组成。通常,词法环境与 ECMAScript 代码的某些特定句法结构相关联,例如FunctionDeclaration、 WithStatement 或 TryStatement 的 Catch 子句,并且每次评估此类代码时都会创建一个新的词法环境。
我注意到它没有说明为函数表达式创建词法环境。是为函数表达式创建词法环境,还是仅为函数声明创建词法环境?我错过了什么吗?
编辑:我注意到函数代码将有自己的执行上下文,这就是为什么我也很困惑为什么在词法环境部分没有提到函数表达式。
javascript - Eval 真的为 JavaScript 引入了动态作用域吗?
人们说Eval 为 JavaScript 带来了动态范围,但我看不出这种说法是如何有效的。使用 Eval 使用与调用环境相同的词法环境/变量环境来评估表达式(参考ECMA 262 v. 5)。表达式的赋值或声明显然是动态的,但我认为说它引入了动态范围是不合理的。
我是否正确地说 Eval 没有引入动态范围?
javascript - 是否所有函数声明和表达式都是由幕后调用的 new Function() 创建的?
我正在阅读 ECMA 262 v5 脚本中提到Function definitions的部分。对于函数声明和函数表达式,都提到了以下内容:
返回13.2中指定的创建新 Function 对象的结果
13.2 节中提到的第一步是“创建一个新的原生 ECMAScript 对象...”,然后“将 F 的 [[Class]] 内部属性设置为“Function”。
由于“创建一个新的 Funciton 对象”的措辞,我想知道是否在幕后,函数声明/表达式是通过调用 new Function(....) 创建的?
javascript - JavaScript 闭包 - 使用 ECMA 规范,请解释闭包是如何创建和维护的
我正在阅读有关JavaScript 闭包的内容。我熟悉Execution Contexts,如何维护Lexical Environment,并且非常熟悉Lexical Scoping。
我想知道JavaScript 中的闭包是如何创建和维护的。有时我很难在不知道它实际上是如何做的情况下掌握这些重要的概念。我知道,根据维基百科,闭包是
是一个函数或对函数的引用以及引用环境——一个存储对该函数的每个非局部变量(也称为自由变量)的引用的表。
但我的问题是,我想知道如何根据ECMA 规范创建和维护闭包。我不是在寻找闭包理论的高级解释,请在您的回答中参考 ECMA 规范。
注意:请不要认为这是重复的,除非答案解释了使用 ECMA 规范的关闭。同样,我对有人引用维基百科并举个例子不感兴趣,我想完全理解 JavaScript 是如何做到这一点的。(我对 SO 的这个问题很熟悉)。