引用数据类型 JavaScript

reference datatype javascript

本文关键字:JavaScript 数据类型 引用      更新时间:2023-09-26

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

1 和源 2

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

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

我相信

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或空字符串'')是所谓的值。这样你就可以对它们进行简单的布尔检查,JavaScript 会将原始数据类型包装在布尔包装器中。

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
}

这只是因为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'