gpt4 book ai didi

javascript - 为什么要避免在 JavaScript 中创建基元对象?

转载 作者:IT王子 更新时间:2023-10-29 03:01:34 24 4
gpt4 key购买 nike

我正在关注 W3School 上的 JavaScript 教程。在阅读几乎每一页时,他们都会提醒用户“避免创建对象”并改用原始数据类型。他们对此给出了理由,因为“如果使用对象,代码将变得难以理解或执行速度会降低”。我们真的应该避免在 JavaScript 中创建对象吗?

例如:

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

最佳答案

“避免创建对象”这一说法本身在 JavaScript 中是荒谬的,JavaScript 到处都有对象,是现存最面向对象的语言之一。但是“避免创建基元的对象版本”,这是您引用的代码所做的,是有效的。也就是说,避免 new Stringnew Numbernew Boolean

JavaScript 有字符串、数字和 bool 值的原始版本和对象版本。几乎没有任何理由明确地创建它们中的任何一个的对象版本,这样做确实会导致混淆;查看内联评论:

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

字符串、数字和 bool 值的对象版本的存在主要是为了使用为对象类型提供方法的相同机制来提供基元上的方法。当你做的时候

console.log("foo".toUpperCase()); // "FOO"

primitive 字符串 "foo" 创建一个临时对象,然后从该对象读取 toUpperCase 属性。由于该对象继承自 String.prototype,因此它具有 toUpperCase,一切都很好。操作完成后,临时对象将被丢弃(除非有东西保留对它的引用,但是 toUpperCase 什么也做不了,你必须向 String 添加一个方法.prototype 返回对象以便将其保留)。

关于javascript - 为什么要避免在 JavaScript 中创建基元对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41458001/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com