为什么要避免在JavaScript中创build对象?

我正在关注W3School的JavaScript教程。 在几乎阅读每个页面时,他们会注意到用户“避免创build对象”,并使用原始数据types。 他们给出这样的理由:“如果使用对象,代码变得难以理解或执行速度会降低”。 是否真的应该避免在JavaScript中创build对象?

例如:

var value = new Number(1); // Avoid this var value = 1; // do something like this instead. 

在JavaScript中,“避免创build对象”这个陈述本身就是荒谬的,因为它在所有地方都有对象,是现存最为面向对象的语言之一。 但是,“避免创build对象版本的原语”,这是你引用的代码是有效的。 也就是说,避免new Stringnew Numbernew Boolean

JavaScript具有string,数字和布尔值的基本和对象版本。 几乎没有任何理由明确地创build它们的对象版本,这样做确实会导致混淆; 请参阅行内评论:

 var s1, s2, n1, n2; // These are false because with ===, an object is never equal to a non-object s1 = new String("hi"); s2 = "hi"; console.log(s1 === s2); // false n1 = new Number(42); n2 = 42; console.log(n1 === n2); // also false // These are false because even with ==, two *different* objects are never equal // (even if they're equivalent) s1 = new String("what the..."); s2 = new String("what the..."); console.log(s1 == s2); // also false n1 = new Number(42); n2 = new Number(42); console.log(n1 == n2); // also false 

它改变了操作员用数字,string和布尔值expression的直观方式:

  • 严格的比较( === )在任何数字被构造时破坏,所以42 === 42是真的,而42 === new Number(42)不是,
  • 当两个数字都是对象时,抽象比较( == )就会中断,所以42 == new Number(42)是true,而new Number(42) == new Number(42)
  • typeof(42)number ,但是typeof(new Number(42))object
  • 当转换为布尔值时, 0是错误的,但是new Number(0)是真的,所以下面两个将会有不同的行为:
 var a = 0; if (a) console.log("not zero"); else console.log("zero!"); // "zero!" var b = new Number(0); if (b) console.log("not zero"); // "not zero" else console.log("zero!");