根据ES5.1规范,程序"use strict;" "foo".bar = 42;会导致String创建一个对象,分配给它上面的属性,然后抛弃该对象,导致没有可观察到的影响 - 包括任何异常.(可以通过在与Opera 12中的ES5兼容的JS实现中尝试来确认效果的缺失.)
在现代JS实现中,它抛出一个TypeError代替尝试它:
"use strict"; "foo".bar = 42;Run Code Online (Sandbox Code Playgroud)
我很确定新的行为是由ES6规范强制执行的,但是尽管多次阅读相关部分,但我看不出它被指定的位置TypeError.事实上,关键部分似乎没有变化:
6.2.3.2 PutValue(V,W)#
- ReturnIfAbrupt(V).
- ReturnIfAbrupt(W).
- 如果Type(V)不是Reference,则抛出ReferenceError异常.
- 让base为GetBase(V).
- 如果IsUnresolvableReference(V)为真,那么
- ...
- 否则,如果IsPropertyReference(V)为真,那么
- 一个.如果HasPrimitiveBase(V)为真,那么
- 一世.断言:在这种情况下,base永远不会为null或未定义.
- II.将base设置为ToObject(base).
- 湾 我们成功了吗?base.[[Set]](GetReferencedName(V),W,GetThisValue(V)).
- C.ReturnIfAbrupt(成功). …
我想知道,
这两种初始化基元数组的方法之间的区别是什么?
int[] arr1 = new int[]{3,2,5,4,1};
int[] arr2 = {3,2,5,4,1};
Run Code Online (Sandbox Code Playgroud)
哪一个更受欢迎?
我是一名刚刚开始学习Ruby的Java开发人员.Ruby有没有原始类型?我似乎找不到它们的清单.如果没有,为什么?
具体来说,SortedMap<Vector<String>, int>我得到"在此(int)令牌之后预期的维度." 救命!
据我所知,一个类的任何静态成员像String或Int32也可以从相关的基本数据类型访问.所以,String.Format是一样的string.Format,Int32.MaxValue也是一样的int.MaxValue.
这两种形式有区别吗?对另一个人更喜欢吗?即使它们相同,人们通常认为它们更具可读性吗?
编辑:因为它们是相同的,从人的角度来看是首选吗?你想看String.Format或string.Format读别人的代码吗?
最近有一位采访者要求定义对象和原语之间的区别.考虑到所有语言都以原语开头,这似乎是一个奇怪的问题.你怎么回答这个问题?
我还应该注意,这次访谈是针对前端开发的,所以他所指的语言(我假设)是JavaScript.
什么是基本类型的哈希码,例如int?
例如,让我们说num是一个整数.
int hasCode = 0;
if (num != 0) {
hasCode = hasCode + num.hashCode();
}
Run Code Online (Sandbox Code Playgroud) 我对我的应用程序进行了一些分析,其中一个结果发现堆上大约18%的内存被类型的对象使用Double.事实证明这些对象是Maps 中的值,我不能使用原始类型.
我的理由是原始类型double消耗的内存少于它的对象Double.有没有办法有一个像数据结构的地图,可以接受任何类型的键和基元double作为值?
主要业务是:
我拥有的典型地图是:
HashMap<T, HashMap<NodeData<T>, Double>> graphHashMap<Point2D, Boolean> onSea (虽然不是双倍价值)ConcurrentHashMap<Point2D, HashMap<Point2D, Double>>全部用于Java 8.
附录
我主要对那些有这些类型的地图解决方案的框架不感兴趣,但对解决这些问题时需要考虑的内容感兴趣.如果您愿意,任何此类框架背后的概念/想法/方法是什么.或者解决方案也可能在另一个层面,其中地图被替换为像@Ilmari Karonen在他的答案中指出的特定模式的对象.
有Java API中的可膨胀的数组类相当于Vector或ArrayList可以与图元可以使用类(INT,炭,双,等)?
我需要整数快速,可扩展的阵列,它似乎浪费有包裹他们在Integer班级,以便与使用它们Vector或ArrayList.我的google-fu让我失望了.
public class Primitive {
void m(Number b, Number ... a) {} // widening, autoboxing->widening->varargs
void m(byte b, Number ... a) {} // unboxing, autoboxing->widening->varargs
public static void main(String[] args) {
Byte b = 12;
Primitive obj = new Primitive();
obj.m(b, 23);
}
}
Run Code Online (Sandbox Code Playgroud)
我已经搜索过并发现扩展优先级高于取消装箱,因此在上面的方法调用中,应该调用第一个方法,因为第二个参数对于两者都是相同的.但这不会发生.你可以解释一下吗?