如果您真的知道答案或可以提供一些信息,这是一个合理的问题.
Firefox和Chrome一直致力于包含ES Harmony中的许多功能......
我的问题实际上是两个部分:
我正在寻找ECMAScript国际化API的垫片.有谁知道这样的项目?(即使它目前仍在进行中.)
javascript internationalization ecma262 ecmascript-5 ecmascript-intl
在这段视频中(大约31分钟),Crockford说他们(代表ECMAScript委员会发言)建议不要使用Object.getPrototypeOf.他的解释是,它并不是真正意义上的普通开发人员,而是用于像Caja这样的东西,可能会将其删除,Object以防止您访问它.
Crockford有时会对他应该如何使用JS(我们不是都可以吗?)的观点持相当意见,所以我想知道这是否真的是ES委员会的全部推荐,或者它只是Crockford的个人观点之一.是否有人阅读任何官方声明警告反对使用Object.getPrototypeOf?这对我来说真的听起来很糟糕:(但是我没有看到MDN页面上有任何关于其使用的警告信息,如果真的那么糟糕,我希望会有通知.
我试图使用let和yield在Firefox.我正在测试版本18和21(每晚)并得到相同的结果.
这是我非常简单的测试脚本:
<html>
<head>
<title>test</title>
<script type="text/javascript">
'use strict';
function a() {
yield 5;
}
</script>
</head>
<body></body>
</html>
Run Code Online (Sandbox Code Playgroud)
我收到此错误:

同样地,当我做一个简单的测试时,let我得到"让它是一个保留的标识符",这真的令人沮丧,因为let 自从版本2以来一直存在于Firefox中!
奇怪的是,如果我在Firebug中执行相同的代码,它就可以了!
我曾尝试在各种其它字符串type和language该属性script标记,但还没有找到一个神奇的一个工程.
这是怎么回事?如何使用脚本标记来处理这些内容?
嗯,我明白了,所以你必须指定版本号.我试过这个,但对于我原来使用网络工作者的更复杂的脚本.显然使用version=1.7包含一个web工作者的脚本,其中包含一个使用let并且yield不够好的脚本 - Web工作者脚本仍然破坏......然后我尝试简化为最简单的情况但显然没有尝试version=1.7最简单的情况.
谢谢......可以稍微发布另一个问题(搜索后)如何让网络工作者工作.
我已经看到一些示例表明Firefox支持某种JavaScript语法*something* if *expression*;.
作为我正在谈论的一个例子,请参阅此MDN文章,其中包含以下示例:
var evens = [i for each (i in range(0, 21)) if (i % 2 == 0)];
Run Code Online (Sandbox Code Playgroud)
我的问题是:
用什么名字来描述这种语法?我主要想知道这一点,以便我可以谷歌它并阅读更多相关信息.我已经尝试了谷歌搜索我能想到的最好的,但未能将正确的术语放在一起以获得有用的结果.
这种语法可以存在于数组理解之外的其他地方吗?我觉得我已经看到过在数组之外使用的其他示例(例如上面的例子中),但我不确定.
在哪里可以阅读有关此语法的更多信息?
除了Firefox之外,还有其他浏览器支持吗
这个功能是ES5还是ES-harmony的计划?
我目前正在为ES6草案实施一些垫片.我想知道是否有人可以告诉我是什么ReturnIfAbrupt意思.例如,我的实现Number.toInt(调用内部[[ToInteger]]如下:
if (!('toInt' in Number))
Object.defineProperty(Number, 'toInt', {
value: function toInt(value) {
// ECMA-262 Ed. 6, 9-27-12. 9.1.4
// 1. Let number be the result of calling ToNumber on the input argument.
var number = Number(value);
// 2. ReturnIfAbrupt(number).
// ?
// 3. If number is NaN, return +0.
if (number != number) return 0;
// 4. If number is +0, -0, +Infinity, or -Infinity, return number.
if (number == 0 || 1 / …Run Code Online (Sandbox Code Playgroud) ECMAScript规范Math.pow具有以下特殊规则:
- 如果x <0且x是有限的且y是有限的并且y不是整数,则结果是NaN.
(http://es5.github.com/#x15.8.2.13)
结果Math.pow(-8, 1 / 3)给出NaN而不是-2
这条规则的原因是什么?是否存在某种更广泛的计算机科学或IEEE推理这一规则的原因,或者它只是TC39/Eich曾经做过的选择?
感谢Amadan与我的交流,我想我现在明白了这个推理.为了后代,我想扩大我们的讨论范围.
我们来看下面的例子:尽管它确实应该是Math.pow(823543, 1 / 7)收益率.这是由必须首先转换为十进制表示的事实引入的不准确性,该十进制表示被截断并且失去精度.当我们处理正数时,这不是一个很糟糕的问题,因为我们仍然得到一个非常接近实际结果的结果.6.99999999999999971 / 70.14285714285714285
然而,一旦我们踏入负面世界,我们就会遇到问题.如果一个JavaScript引擎试图计算Math.pow(-823543, 1 / 7)它,首先需要转换1 / 7为十进制,所以它实际上是计算Math.pow(-823543, 0.14285714285714285)实际上没有真正的答案.在这种情况下,它可能必须返回,NaN因为它找不到实数,即使真正的答案应该是-7.此外,寻找接近实数的复数来做出"最佳猜测"可能涉及一定程度的复杂性,他们不希望JS引擎在数学领域中拥有.
我的猜测是由于考虑到浮点数的精度损失导致他们遵循以下规则:非整数幂的负数应该总是NaN- 基本上因为非整数幂可能给出一个由于精度损失导致的复数,即使它不应该,也可能没有好的方法可以从中恢复.
有了这个,我相当满意,但我确实欢迎进一步的信息.
假设我的语言看起来像
print "Hello World"
Run Code Online (Sandbox Code Playgroud)
这转化为
var $__Helpers = {
print: function(s) {
if (typeof s != 'string')
throw new TypeError('String expected');
console.log(s);
}
};
$__Helpers.print("Hello World");
Run Code Online (Sandbox Code Playgroud)
如果这种语言的用户这样做
print 5
Run Code Online (Sandbox Code Playgroud)
通过$__Helpers.print说"String expected" 将抛出TypeError .我希望开发人员工具将该print 5行显示为此错误的原始调用.我知道如何让我的源地图显示一个看起来像的调用堆栈
transpiled_script.js:2
original_script.os:1
Run Code Online (Sandbox Code Playgroud)
transpiled_script.js:2调用$__Helpers.print函数的脚本和行号在哪里,是调用original_script.os:1的脚本和行号print 5.我想让开发工具忽略顶部调用transpiled_script.js(这只是我的转换程序的一个实现细节)并且只显示来自原始脚本的调用(这是他们应该在自己的脚本中调试的部分).
我显然不能简单地映射transpiled_script.js:2到original_script.os:1因为print内部可能有多个调用original_script.os,所以它不是一对一的关系.
有没有办法做到这一点?
(我使用escodegen来生成我的源码和我的源码图(escodegen使用Node mozilla/source-map模块),所以有办法告诉escodegen或mozilla/source-map这样做是理想的,但我可以覆盖escodegen的输出,如果这是不可能的.)
我正在开发Android应用程序,我们正在调查内存使用情况.
从hprof查看堆转储,我们看到在JarURLConnectionImpl中的静态缓存中使用了近2M(我们的堆的22%):

查看JarURLConnectionImpl的源代码,看起来条目被添加到静态jarCache变量,但从未被删除.
如果它们永远不会被删除,那就会让我感到内存泄漏.
这是泄漏吗?有修复或解决方法吗?
我正在阅读ES6的草案,我注意到以下Object.prototype.toString部分中的这个注释:
从历史上看,此函数偶尔用于访问本规范以前版本中使用的[[Class]]内部属性的字符串值,作为各种内置对象的名义类型标记.toString的这个定义保留了将它用作那些特定类型的内置对象的可靠测试的能力,但它没有为其他类型的内置或程序定义的对象提供可靠的类型测试机制.
通过在es-discuss上阅读这个帖子,听起来好像在ES6草案中[[Class]]被替换,[[NativeBrand]]以便他们可以将其指定为不可扩展(那些至少是Allen Wirfs-Brock的想法).
好奇,我在FireFox和Chrome上进行了快速测试(启用了实验性JavaScript):
Object.prototype.toString.apply(new WeakMap());
=> '[object WeakMap]'
Run Code Online (Sandbox Code Playgroud)
"WeakMap"不是[[NativeBrand]]ES6草案中规定的内容之一.但是,这"[object WeakMap]"两个浏览器都返回了此测试.
所以我很困惑.我有几个问题.
1. Chrome和Firefox的行为是否正确?
从阅读草案的一种方式来看,它听起来应该回归[object Object](而且所有这些都是新的,所以在这些浏览器的未来版本中看到这种变化我不会感到惊讶).但是,我很难理解草案本节的意图,特别是因为有一些地方"???".
是否有人更热切地关注es-discuss有任何相关信息?或者任何能够更好地理解草案语言的人?
2.有替代方案Object.prototype.toString吗?
从上面引用的说明中,它听起来好像Object.prototype.toString是为了遗留原因而保留,好像现在应该使用新的东西.特别是读取节点的一部分"it does not provide a reliable type testing mechanism for other kinds of built-in ... objects".这是否意味着未来的内置插件无法使用此方法进行测试?
让我们用一个具体的例子.
如果我想确保我从未知来源收到的String对象是一个对象(一个实际构造的String对象,而不是一个原始字符串),我可以这样做:
if (Object.prototype.toString.apply(unknownObject) != '[object String]')
throw new TypeError('String object expected.');
Run Code Online (Sandbox Code Playgroud)
这让我知道是否unknownObject是一个String …
javascript ×9
ecmascript-5 ×3
ecma262 ×2
android ×1
ieee-754 ×1
memory-leaks ×1
source-maps ×1