为什么要避免在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!");