标签: ecma262

为什么ECMAScript第4版完全废弃了?

我一直在寻找关于报废ECMAScript第4版的一些信息,但没有取得多大成功,即使在SO上也是如此.我知道Mozilla的JavaScript 1.7实现了第4版中提供的许多(全部?)新功能,我想我记得有一篇好的John Resig帖子,但我现在似乎无法在他的博客上找到它.

特别是,我想知道为什么它完全取消了ECMA-262第5版以及为什么它不仅仅是改进.一些功能非常酷,如生成器,迭代器,let,新赋值运算符和(我特别喜欢的)解构赋值.

我知道所有这些特殊功能只会在具有过时ECMAScript实现的浏览器中抛出错误,但为什么不包括它们,知道有一天这些实现很少而且很远?还有其他原因吗?我们是否可能会在未来的版本中看到一些报废功能重新出现,或者供应商是否害怕破坏兼容性,我们可能永远不会看到标准的这些改进?

顺便说一句,知道一些关于这个问题的意见会很高兴,你是否对从第5版中删除某些功能感到恼火,或者你认为这样做会更好?是否值得玩ECMAScript 4的实现?

javascript ecma262 ecmascript-4

12
推荐指数
2
解决办法
2966
查看次数

为什么JSON只允许字符串成为键?

为什么JSON只允许a string成为一对的密钥?为什么不是其他类型,比如null,number,bool,object,array?考虑到JSON与JavaScript密切相关,我可以从JavaScript规范(ECMA-262)中得出结论吗?我完全是JavaScript的新手,你能帮我指出一下吗?

javascript json ecma262

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

具有负数和非整数幂的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

这条规则的原因是什么?是否存在某种更广泛的计算机科学或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- 基本上因为非整数幂可能给出一个由于精度损失导致的复数,即使它不应该,也可能没有好的方法可以从中恢复.

有了这个,我相当满意,但我确实欢迎进一步的信息.

javascript floating-point ecma262 ieee-754 ecmascript-5

10
推荐指数
1
解决办法
6166
查看次数


使用原型而不是在对象本身上声明属性有什么好处吗?

原型用于声明一类对象的属性和方法.使用原型的一个优点是它节省了内存,因为类的所有实例都指向原型的属性和方法,这样可以节省内存并有效地允许属性被类的所有实例视为静态.

Prototype用于通过原型链接继承.

我的问题很简单.为什么在你可以做的时候根本就使用原型:

function car() {
    this.engine = "v8";
}
function mustang() {
    // nm, no good way to inherit without using prototypes
}
Run Code Online (Sandbox Code Playgroud)

是对的吗?所以原型的主要目的有三个:

  1. 保存记忆
  2. 提供静态属性
  3. 是引用类型从超类继承的唯一方法

javascript ecma262

9
推荐指数
1
解决办法
342
查看次数

Ecma-262(EcmaScript 5)将如何为您提供帮助?

EcmaScript Fifth Edition或Ecma-262已经公布,并包含对该语言的一些更改.新版本中的哪些功能可以帮助您编写更好的代码?

javascript ecma262 ecmascript-5

8
推荐指数
1
解决办法
1465
查看次数

ES5中的Object.defineProperty?

我正在看到有关"新"Object.create的帖子,它使枚举可配置.但是,它依赖于Object.defineProperty方法.我找不到这种方法的跨浏览器实现.

我们是不是在为旧的Object.create写作?我不能写出在IE6/7中无效的东西.

javascript ecma262 prototypal-inheritance ecmascript-5

8
推荐指数
1
解决办法
5735
查看次数

为什么`typeof this`返回"对象"?

var f = function(o){ return this+":"+o+"::"+(typeof this)+":"+(typeof o) };
f.call( "2", "2" );
// "2:2::object:string"

var f = function(o){ return this+":"+(typeof this)+":"+(typeof o); };
var x = [1,/foo/,"bar",function(){},true,[],{}];
for (var i=0;i<x.length;++i) console.log(f.call(x[i],x[i]));
// "1:object:number"
// "/foo/:object:object"
// "bar:object:string"
// "function () {\n}:function:function"
// "true:object:boolean"
// ":object:object"
// "[object Object]:object:object"
Run Code Online (Sandbox Code Playgroud)

我在Chrome,Firefox和Safari中看到相同的结果,所以我认为它符合规范,但是......为什么?这个规范中的定义是什么?为什么不用于功能呢?

javascript call ecma262

8
推荐指数
1
解决办法
1377
查看次数

是否有一种与环境无关的方法来检测Javascript主机对象?

我正在写一个Javascript stacktrace库.库需要检测程序员创建的特定对象或函数,还是作为环境的一部分(包括内置对象).主机对象由于其不可预测的行为而变得有点问题,因此我采用环境无关的方式来确定Javascript中的特定对象是否是主机对象(请参阅ECMAScript 3 - 4.3.8).但是,区分主机对象与本机对象和原始值对于其他项目中的程序员很有用,特别是在无浏览器的环境中,所以我想关注它,而不是主机对象在我的库中导致的问题或区分程序员创建的对象.

到目前为止,我只能提出依赖于运行javascript代码的环境的解决方案.例如:

// IE Only: does not implement valueOf() in Host Objects
var isHost = (typeof obj === 'object' && typeof obj.valueOf === 'undefined');

// Firefox Only: Host objects have own constructor
var isHost = (obj.constructor && obj.hasOwnProperty('constructor'));
Run Code Online (Sandbox Code Playgroud)

我注意到jQuery自己的isPlainObject()方法也依赖于环境,而且逻辑相当复杂.

也许这是因为具有宿主对象的野兽的性质(因为它们的行为是由环境定义的),但我想进一步深入研究这是否可能并且想知道是否有人遇到过这个特定的问题之前并准备好了解决方案.

所以.有人知道一个简单的独立于平台的解决方案来测试主机对象吗?如果它在无浏览器环境(如Node或Rhino)中运行,那么它就更好了.

可能的方法(可能不起作用):

  • 测试主机对象的特性似乎是一个失败的原因,因为它们的行为没有规范,但是测试该对象是否是ES3规范的一部分可能是可能的.
  • 我已经尝试使用Object.prototype.toString()给定的非常具体的定义,但结果是不确定的,因为一些环境(即IE)选择为本机和主机对象返回相同的值.
  • 可以通过检查constructor通过原型链的对象的最终值是否真的来实现instanceof Function.

javascript cross-platform ecma262 javascript-objects

8
推荐指数
2
解决办法
838
查看次数

是\ 0(C风格的正则表达式字符串中的"\\ 0")是C++正则表达式中的有效转义序列吗?

注意:当我说正则表达式时,[\0]我指的是正则表达式[\0](不包含在C风格的字符串中,然后就是这样"[\\0]").如果我没有在它周围加上引号,那么它不是C风格的字符串,反斜杠不应该被解释为转义为C风格的字符串.

受到这个问题和我的调查的启发,我在clang 3.4中尝试了以下代码:

#include <regex>
#include <string>

int main()
{
    std::string input = "foobar";
    std::regex regex("[^\\0]*"); // Note, this is "\\0", not "\0"!

    return std::regex_match(input, regex);
}
Run Code Online (Sandbox Code Playgroud)

显然,clang并不喜欢这样,因为它抛出:

std::__1::regex_error:表达式包含无效的转义字符或尾随转义.

它似乎是[^\0]部分(改变它[^\n]或类似的东西工作正常).它似乎是一个无效的转义字符.我想澄清一点,我不是在讨论'\0'字符(空字符)或'\n'字符(换行符).在C风格的字符串中,我所说的是"\\0"(包含反斜杠零的字符串)"\\n"(包含反斜杠n的字符串)."\\n"似乎"\n"被正则表达式引擎转化为了它,但它扼杀了"\\0".

C++ 11标准在第28.13节[re.grammar]中说:

basic_regexECMMAcript标志构造的对象识别的正则表达式语法是由ECMA-262指定的,除非如下所述.

我不是ECMA-262的专家,但是我在JSFiddle上尝试了正则表达式,它在JavaScript领域工作得很好.

所以现在我想知道正则表达式[^\0]是否在ECMA-262中有效并且C++ 11标准删除了对它的支持(在后面的内容中... except as specified below.).

问题 …

javascript c++ regex ecma262 c++11

8
推荐指数
1
解决办法
527
查看次数