3

从我可以从这两个来源推断:

源 1源 2

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

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

4

2 回答 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'
于 2013-01-27T15:51:04.787 回答
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 会将原始数据类型包装在布尔包装器中。

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
}
于 2013-01-27T15:56:44.873 回答