为什么要避免在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 String
, new Number
和new 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!");