newJavaScript中的关键字在第一次遇到时会非常混乱,因为人们倾向于认为JavaScript不是面向对象的编程语言.
String Pool是什么意思?以下声明之间有什么区别:
String s = "hello";
String s = new String("hello");
Run Code Online (Sandbox Code Playgroud)
JVM存储这两个字符串有什么区别吗?
取自MDN
字符串文字(用双引号或单引号表示)和从非构造函数上下文中的String调用返回的字符串(即,不使用new关键字)是原始字符串.JavaScript会自动将基元转换为String对象,因此可以对原始字符串使用String对象方法.在要在原始字符串上调用方法或发生属性查找的上下文中,JavaScript将自动包装字符串原语并调用方法或执行属性查找.
因此,我认为(逻辑上)字符串基元上的操作(方法调用)应该比字符串对象上的操作慢,因为任何字符串基元method在应用于字符串之前都会转换为字符串对象(额外工作).
但在这个测试案例中,结果却相反.所述码块1的运行速度比较快的块-2代码,两个代码块在下面给出:
代码块-1:
var s = '0123456789';
for (var i = 0; i < s.length; i++) {
s.charAt(i);
}
Run Code Online (Sandbox Code Playgroud)
代码块-2:
var s = new String('0123456789');
for (var i = 0; i < s.length; i++) {
s.charAt(i);
}
Run Code Online (Sandbox Code Playgroud)
结果在浏览器中有所不同,但代码块-1总是更快.任何人都可以解释一下,为什么代码块-1比代码块-2快.
我继承了另一个开发人员写的一些javascript代码.他不喜欢我们在整个项目中使用的网格组件,因此他决定编写自己的网格组件.他写的网格不能对日期进行排序,因为它只能绑定到字符串/数字.在使用之前,他将所有日期转换为字符串.我查看了他编写的日期函数的字符串格式,并认为我可以只使用原始值为字符串添加日期属性,然后在排序时查看字符串是否具有日期属性并基于此排序.但是,似乎您无法在javascript中向字符串添加属性.我不知道有些类型你不能添加属性.例如:
<html>
<script>
var test = "test";
test.test = "test inner";
console.log(test);
console.log(test.test);
</script>
Run Code Online (Sandbox Code Playgroud)
test.test将是未定义的.奇怪的.我的问题是为什么这段代码不起作用?而且,如果你能想到在该网格上排序日期的任何变通方法(除了实际绑定到日期对象而不是字符串,这将很难修复),这将是非常有用的.
在这里我发现了最好使用非类型强制字符串比较的建议,但在Chrome中,我发现了一些奇怪的东西:
var t1 = String("Hello world!");
var t2 = new String("Hello world!");
var b1 = (t1==t2); // true
var b2 = (t1===t2); // false
Run Code Online (Sandbox Code Playgroud)
这是标准行为吗?如果是这样,t1和t2各自的类型是什么?谢谢.
我已经查看了stackoverflow上的所有问题和答案,但找不到简单的答案.
字符串和对象之间究竟有什么区别?
例如,如果我有这个代码:
var a = 'Tim';
var b = new String('Tim');
Run Code Online (Sandbox Code Playgroud)
究竟有什么区别?
据我所知,这new会使代码复杂化并new String减慢代码速度.
另外,我理解的a==b是true,但更严格的a===b是false.为什么?
我似乎无法理解对象和字符串创建背后的过程.例如:
var a = new String ('Tim');
var b = new String ('Tim');
Run Code Online (Sandbox Code Playgroud)
a==b 是 false