Ran*_*lue 19 javascript undefined-behavior
JavaScript是否具有未定义的行为(类似于C),还是完全由规范定义,并且确定性?
请注意,我正在丢弃实现错误和规范差异.我也在丢弃像Math.random()和的东西Date.now().
是否有一段JavaScript代码的行为不完全由JavaScript规范决定,因此具有"未定义的行为"?
规范中有很多内容明确留给实现.特别是当涉及到Host Objects时,可能会有许多怪癖.与宿主对象无关的示例:
全局对象的[[Prototype]]和[[Class]]内部属性的值是依赖于实现的.
15.1.2.2 parseInt(string,radix)
[如果有太多有效数字] mathInt可能是数学整数值的依赖于实现的近似值,该数学整数值由基数-R表示法中的Z表示.
15.3.4.2 Function.prototype.toString
一个依赖于实现的返回功能的表示.
几乎所有的日期解析/ stringifiy算法是实现相关的,这包括toLocaleString,toString,parse和Date构造.
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.
我发现很少的例子,引用ECMAScript语言规范(强调我的):
在一些实现中,外部代码可能能够检测各种Not-a-Number值之间的差异,但是这种行为是依赖于实现的 ; 对于ECMAScript代码,所有NaN值都无法区分.
如果使用多个参数调用toFixed方法,则行为未定义(请参见第15节).
如果使用多个参数调用toExponential方法,则行为未定义(请参见第15节).
如果使用多个参数调用toPrecision方法,则行为未定义(参见第15节).
当使用少于两个参数调用UTC函数时,该行为与实现有关.
| 归档时间: |
|
| 查看次数: |
1606 次 |
| 最近记录: |