在 JavaScript 中是否有原始变量的用途
is there ever a use for primitive variables in javascript?
一个非常简单的问题,在javascript中使用原始数据类型是否更可取,我特别受到原始布尔值的困扰,请考虑以下代码
var bool = new Boolean(false);
if (bool){
alert(bool);
}
它会alert
但你会得到false
,这有点令人困惑(false
!= falsy)。
那么使用原始数据类型,尤其是原始布尔值有什么意义吗?
这些不是基元。基元像100
、"foobar"
、false
:
> typeof false
"boolean"
> typeof new Boolean(false)
"object"
new Boolean
(或Number
或String
)是一个对象,遵循对象的规则,而不是基元的规则进行比较,布尔转换等。这些对象对于JS程序员来说确实几乎没有用处(与内部使用它们的JS引擎相反)。
请注意,虽然很少需要使用Boolean
和友元来构造对象(如x = new Boolean(...)
),但这些函数有时本身很有用。例如,以下不错的习惯用法从数组中删除所有 faly 值:
ary = ary.filter(Boolean)
基元值非常有用(例如基元值:真、假、空、1、2 等)。您在问题中谈论的是它们周围的对象包装器。
对象包装器很有用,因为它允许您添加要对其调用的函数。更重要的一点是,当您对基元值调用方法时,会在它们上创建对象包装器,并在对象包装器*上调用方法。
示例 1:字符串
String.prototype.sayHello = function() {
return this + ' says hello';
};
// calling a method on a string literal temporarily converts it to a String
console.log('John'.sayHello()); // 'John says hello'
示例 2:布尔值
var bool = new Boolean(false);
console.log(bool); // Boolean
console.log(bool.toString()); // 'false'
console.log(bool.valueOf()); // false
// How you can use it:
Boolean.prototype.toCaps = function() {
return this.valueOf().toString().toUpperCase();
};
console.log(bool.toCaps()); // 'FALSE'
// calling a method on a boolean literal temporarily converts it to a Boolean
console.log(true.toCaps()); // 'TRUE'
console.log((1 === 1).toCaps()); // 'TRUE'
演示:http://jsbin.com/apeGOve/1/edit
*)每次对基元值调用方法时,都会创建不同的对象包装器:
String.prototype.getWrapper = function() { return this; };
String.prototype.setTest = function() { this.test = 'test' };
String.prototype.getTest = function() { return this.test; };
var str = '123';
console.log('Different wrappers each time',str.getWrapper() === str.getWrapper());
var wrapper = str.getWrapper();
wrapper.setTest();
console.log(wrapper.getTest());
console.log(str.getTest());
您的示例:
var bool = new Boolean(false);
if (bool){
alert(bool);
}
你想知道为什么它会发出错误的警报。
bool
变量,您在创建变量时为其分配了一个值。所以,当你说 JavaScript if(bool)
做一些强制并测试bool
是否是假的时,它不是,所以条件块会执行。现在,您将alert(bool)
尝试调用对象的 toString 方法并显示结果。布尔对象的 toString 方法将布尔对象的值作为字符串返回,因此,您会收到单词"false"警报。
来吧,试试
var bool = new Boolean(false);
bool.toString = function () {
return 'I need a banana';
}
if (bool){
alert(bool);
}
你会得到完全不同的结果。
这就引出了你的另一个问题,即"为什么"你甚至会使用布尔构造函数:你可以为布尔对象分配属性,你不能为true
和false
分配属性。例如,在使用可链接方法构建一些逻辑处理库时,您可能希望从布尔对象继承。
- 在Javascript中重新分配对象变量时,原始对象会发生什么
- 阻止$scope变量副本侦听其原始副本
- 在 JavaScript 中是否有原始变量的用途
- 两个函数使用相同的变量,都不会覆盖其原始变量
- 在 JavaScript 中访问原始全局变量和属性
- 为什么原始变量的行为类似于对象
- 变量不断重置为其原始值
- 变量在操作新实例后失去原始值
- Javascript变量恢复为原始变量
- 如何在 for 循环中维护迭代变量的原始值,该循环设置事件调用,其中迭代值是函数的一部分
- 为什么Google闭包编译器在原始命名空间为空的情况下向全局命名空间添加变量
- js更改变量会影响到原始变量
- highcharts系列删除功能删除所有原始系列数据(即使存储在新变量中)
- 如何在不影响AngularJS中原始变量的情况下操作视图值
- 在JavaScript中更改局部变量会影响具有不同名称的原始全局变量
- 将Mysql查询结果传递给javascript,然后使用原始变量调用函数
- 附加在字符串中的Javascript变量不会被替换'的原始值
- 什么时候我应该使用变量而不是原始值
- 通过jQuery.fn.data()分配变量将保留对原始标记值的引用
- JavaScript's reverse()总是改变原始变量吗?