JavaScript有未定义的行为吗?

Ran*_*lue 19 javascript undefined-behavior

JavaScript是否具有未定义的行为(类似于C),还是完全由规范定义,并且确定性?

请注意,我正在丢弃实现错误和规范差异.我也在丢弃像Math.random()和的东西Date.now().

是否有一段JavaScript代码的行为不完全由JavaScript规范决定,因此具有"未定义的行为"?

Ber*_*rgi 9

规范中有很多内容明确留给实现.特别是当涉及到Host Objects时,可能会有许多怪癖.与宿主对象无关的示例:

15.1全球对象

全局对象的[[Prototype]]和[[Class]]内部属性的值是依赖于实现的.

15.1.2.2 parseInt(string,radix)

[如果有太多有效数字] mathInt可能是数学整数值的依赖实现的近似值,该数学整数值由基数-R表示法中的Z表示.

15.3.4.2 Function.prototype.toString

一个依赖于实现的返回功能的表示.

几乎所有的日期解析/ stringifiy算法是实现相关的,这包括toLocaleString,toString,parseDate构造.

15.4.4.11 Array.prototype.sort(comparefn) - 可能是最好的例子:

如果comparefn未定义且不是此数组元素的一致比较函数,则sort的行为是实现定义的.

[...]如果proto不为null并且存在整数j使得满足以下所有条件,那么sort的行为是实现定义的:

  • obj很稀疏(15.4)
  • 0≤j<len

如果obj是稀疏的并且满足以下任何条件,则sort的行为也是实现定义的:

  • obj的[[Extensible]]内部属性为false.
  • obj的任何数组索引属性,其名称是小于len的非负整数,是[[Configurable]]属性为false的数据属性.

如果obj的任何数组索引属性(其名称是小于len的非负整数)是accessor属性或者是[[Writable]]属性为false的数据属性,则sort的行为也是实现定义.

最有利的是:

执行依赖实现的调用序列[...]

15.5.4.9 String.prototype.localeCompare(that)

这两个字符串以实现定义的方式进行比较

15.5.4.11 String.prototype.replace [在替换符号中,如果数字大于组数],结果是实现定义的.

我将在此处停止列出,您可以通过规范进行搜索.其他值得注意的地方可能是toLocaleString方法,或者方法返回的依赖实现的近似值Math.

  • 当然,JavaScript中的"依赖于实现"与C中的"未定义行为"完全不同. (3认同)
  • 问题的第一句询问它是否具有类似于 C 的未定义行为。 虽然标准中没有任何内容禁止浏览器允许远程代码使本地机器崩溃,但也没有任何内容可以表明浏览器制造商有权假设该代码永远不会收到会导致它做某些事情的输入。 (2认同)

Tom*_*icz 8

我发现很少的例子,引用ECMAScript语言规范(强调我的):

8.5号码类型

在一些实现中,外部代码可能能够检测各种Not-a-Number值之间的差异,但是这种行为是依赖于实现的 ; 对于ECMAScript代码,所有NaN值都无法区分.

15.7.4.5 Number.prototype.toFixed(fractionDigits)

如果使用多个参数调用toFixed方法,则行为未定义(请参见第15节).

15.7.4.6 Number.prototype.toExponential(fractionDigits)

如果使用多个参数调用toExponential方法,则行为未定义(请参见第15节).

15.7.4.7 Number.prototype.toPrecision(precision)

如果使用多个参数调用toPrecision方法,则行为未定义(参见第15节).

15.9.4.3日期.UTC(年,月[,日期[,小时[,分钟[,秒[,ms]]]]])

当使用少于两个参数调用UTC函数时,该行为与实现有关.

  • 我认为第一个例子是无效的,因为*到ECMAScript代码所有NaN值都无法区分*.我确信在几乎所有语言中,外部代码都可能能够检测到语言规范未涵盖的实现差异. (2认同)

hvg*_*des 6

我发现

Array.sort(compareFunction);

在compareFunction行为不正确的情况下(即返回相同输入的一致结果).

规格:

如果comparefn未定义且不是此数组元素的一致比较函数(请参见下文),则sort的行为是实现定义的.