编程语言
首页 > 编程语言> > 在javascript中有原始变量吗?

在javascript中有原始变量吗?

作者:互联网

一个非常简单的问题,是否有一种情况,在javascript中使用原始数据类型是优选的,我特别困扰原始布尔值,请考虑以下代码

var bool = new Boolean(false);
if (bool){
    alert(bool);
}

它会警觉,但你会得到假,这有点令人困惑(假!=假).

那么使用原始数据类型尤其是原始布尔值是否有意义?

解决方法:

原始值非常有用(原始值之外:true,false,null,1,2等).你在这个问题中谈到的是围绕它们的Object包装器.

对象包装器很有用,因为它允许您添加要在其上调用的函数.更重要的是,当您在原始值上调用方法时,会在它们上创建Object包装器,并在Object包装器上调用方法*.

示例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

*)每次在原始值上调用方法时,都会创建不同的Object包装器:

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());

标签:javascript,variables,boolean-logic,primitive
来源: https://codeday.me/bug/20190715/1467729.html