这不是一个笑话的设置,我真的在问.
Douglas Crockford喜欢说在javascript原型面向对象语言中没有必要new
.
他解释说,这new
只是为了让人们从基于类(即" 经典 ")的面向对象编程语言中获得某种程度的安慰:
JavaScript,我们很难
new
雅JavaScript是一种原型语言,但它有一个
new
运算符,试图使它看起来有点像经典语言.这往往会使程序员感到困惑,从而导致一些有问题的编程模式.您永远不需要
new Object()
在JavaScript中使用.请改用对象文字{}
.
好的:
new
坏 {}
好但是后来评论者VítorDeAraújo指出这两者并不相同.他给出了一个例子,表明a string
不像object
:
字符串对象和字符串值不是同一个东西:
Run Code Online (Sandbox Code Playgroud)js> p = "Foo" Foo js> p.weight = 42 42 js> p.weight // Returns undefined js> q = new String("Foo") Foo js> q.weight = 42 42 js> q.weight 42
字符串值不能具有新属性.同样的事情对其他类型也有效.
这里发生了什么string
不是一个object
?我是否混淆了javascript与其他一些语言,其中一切都是对象?
JS中的所有东西都是一个对象.我一直都知道,我完全理解这一点.我知道为什么{} !== {}
.这是两个不同的对象.就像你写出来一样new Object() == new Object()
.
其他一些例子:
{} == {} // => false
[] == [] // => false
/ / == / / // => false
new String() == new String() // => false
Run Code Online (Sandbox Code Playgroud)
但是,Strings也是对象(这就是为什么你可以做''.replace()
和扩展它们),为什么这个工作:
'' == '' // => true
Run Code Online (Sandbox Code Playgroud)
显然,如果这不起作用,比较两个字符串会非常头疼,但这似乎与语言的其余部分不一致.在内部,发生了什么?它只是一次性还是有其他概念背后的?
是否有任何理由为什么字符串不能自相同?我正在处理大量的字符串,最后一些字符串不等于自己.
这是一张图片,展示了我在说什么.
有任何想法吗?
已解决:有一个回车符(\ r)附在其中一个字符串的末尾.我使用String.length来查看每个字符串的长度,它们不同(5和6).然后我使用String.charAt查看了字符串.在Chrome中,这显示一个空字符串("").但是,空字符串不是虚假值.我在FireFox中尝试了这个,它显示了回车.
在Firebug中写下这个简单的代码:
console.log(new String("string instance"));
console.log("string instance");
Run Code Online (Sandbox Code Playgroud)
你看到的是:
为什么这两个console.log()
调用导致不同的输出?为什么字符串文字与通过String
对象创建字符串不同?它是Firebug表示风格吗?或者它们的性质不同?
我经常在我的Javascript中使用以下模式:
x = couldBeNullThing || valueIfItIsNull;
Run Code Online (Sandbox Code Playgroud)
因为它胜于:
x = couldBeNullThing ? couldBeNullThing : valueIfItIsNull;
Run Code Online (Sandbox Code Playgroud)
我也经常使用相同模式的轻微变体:
x = x || valueIfXIsNotDefined;
Run Code Online (Sandbox Code Playgroud)
这一切都很棒...除了问题,我最近发现:
foo = "";
//assert foo.x === undefined;
foo.x = foo.x || valueIfXIsNotDefined;
//assert foo.x === undefined;
Run Code Online (Sandbox Code Playgroud)
换句话说,如果你有一个字符串,你就做了string.aPropertyThatStringDoesntHave || foo,你既不会回头也不会回到实际价值; 相反,你得到了未定义.
谁能解释为什么会这样?在我看来,如果foo.x未定义,那么foo.x || anythingElse应该总是导致任何东西......所以为什么不呢?
为什么在严格地与原始字符串值进行比较时,字符串对象的创建不会返回true?
var obj = new String('0');
var str = '0';
console.log(obj == str); //returns true
console.log(obj === str); //returns false
Run Code Online (Sandbox Code Playgroud)