参考数据类型 JavaScript

3

根据这两个来源,我可以推断出:

来源1来源2

在JavaScript中,当一个基本数据类型用于对象上下文时,它会被内部转换为对象。但这只是一个临时的转换,因为使用后该对象将从内存中移除。

我的问题是,使用这种方法有什么好处? 只是为了节省内存吗?还是有其他优点呢?


这意味着您不需要为每个变量指定类型;var string =“somestring”;string = 1234; //不会抛出错误 - Paul S.
1
使用这种方法的优势是什么? - Bergi
变量str = 'hello'; 变量length = str.length; 在上述语句中,str将被内部转换为一个对象,并在语句执行后被删除。但是在PHP中,我们有一个简单的函数来完成相同的事情,而不是创建一个对象。使用JavaScript方法的优点是什么? - depz123
2个回答

1

这只是因为JavaScript是一种基于原型的编程语言。

原型编程被认为鼓励程序员专注于一些示例的行为,只有在后期才会担心将这些对象分类为原型对象,然后以类似于类的方式使用它们。 因此,许多基于原型的系统鼓励在运行时更改原型。

这意味着你可以做这样的事情:

var str = 'foo'
str.weight // just return 'undefined'

var yes = true, no = false
yes.__proto__.length = function() { return this.toString().length; }
yes.length() // 4
no.length() // 5

var num = 10, amount = 0
num.__proto__.plus = function(num) { return this + num; }
amount.plus(num) // 10

但不幸的是,JavaScript 的一些特性受到了 Java 的影响,例如原始值与对象之间的区别,因此你会遇到这些奇怪的问题:

var str = 'foo'
str.weight = 42
str.weight // undefined

str = new String('foo')
str.weight = 42
str.weight // 42

1.toString() // error!
var n = 1
n.toString() // '1'

1
我相信JavaScript因你提到的原因之一而具有易于类型转换的优势。
正如先前的评论所暗示的那样,JavaScript是弱类型的;您可以声明一个变量而无需声明它是什么类型的变量,因此也不知道您正在使用它做什么。这有简单的好处,比如能够编写:
var str = 'hello user #',
    num = 3,
    sayhello = str + num;

alert(sayhello); // alerts 'hello user #3'

请注意,这里的数字可以像字符串一样简单地添加到字符串中。
因此,许多运算符和方法可用于更强类型的语言中可能不太容易使用。您可以在无需首先检查或转换参数类型的情况下,在参数上使用parseInt方法:
var returnWholeNumber = function (arg) {
        return parseInt(arg, 10);
    },
    str = '5 is the answer',
    num = 8.19437;

alert(returnWholeNumber(str)); // alerts number 5
alert(returnWholeNumber(num)); // alerts number 8

通过提供临时对象包装器,JavaScript 使您无需自己进行一些转换。它根据您尝试执行的操作提供包装器,然后将其丢弃。因此,JavaScript 可以比更强类型的语言更具动态性和表现力。
这对条件语句也很有用。一些值(例如 0 或空字符串 '')被称为“falsey”。这样,您可以对它们进行简单的布尔检查,JavaScript 将原始数据类型包装在 Boolean 包装器中。
if (!userInput) {
    alert('no input');
}

然而,类型强制转换可能会令人困惑,并需要谨慎处理:
alert('1' + 2 + 3); // alerts 123
alert('1' + '2' + '3'); // alerts 123
alert(1 + 2 + 3); // alerts 6

对于条件语句,也要使用三个等号来检查类型,以避免意外的强制转换:

var i = '3';
if (i == 3) { // type-coercing conditional; i can be a string or a number and this will be true
    alert('i is 3'); // will successfully alert
}
if (i === 3) { // type-checking conditional; i has to be an actual number (and the value must be 3)
    alert('i is a number 3'); // will not alert because i is a string
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接