浅谈 var bool= false 和 var bool= new Boolean(false)的区别

前段时间再掘金上看到一个很热门的话题,看代码。

var bool = new Boolean(false);
if(bool){
    console.log('javaScript is amazing!');
}

复制代码

你觉得运行的结果是什么呢?

毫无疑问输出的结果应该是 “javaScript is amazing!”;为什么呢?

其实这个地方很简单,因为bool返回的是一个对象,他是一个引用,我们单纯的if(bool)是判断的是这个对象引用是否存在,而不是拿着这个bool对象引用的值进行判断,如果我们改成if(bool.valueOf())那么肯定就不一样了。

那你肯定会很疑惑为什么?这两种写法的区别是什么?

var bool = false;
if(bool){
    console.log('javaScript is amazing!');
}
var boolObj = new Boolean(false);
if(boolObj){
     console.log('javaScript is amazing!');
}
复制代码

那么接下来我们一起看看吧。

Primitive value VS Reference value

Primitive value(原始值)Reference value(引用值),在JavaScript中我们变量(variable)可以被存储为两种值类型,分别为原始值,引用值。

Primitive value
  1. 原始值是存储在 (Stack)上的数据 [Data]
  2. 原始值直接存储在变量访问的位置。

原始类型(基本类型):Undefined,Null,Boolean,Number,String,Symbol(ES6)

Reference value
  1. 引用值是存储在(Heap)中的对象 [Object]
  2. 引用值是一个指向该对象被存储在存储器中位置的值。

对象是一个属性的集合,一个属性可以是引用一个对象或原始值,原始值没有属性。

除了null和undefined类型,其他的原始值都有他对应的对象包装物(即包装对象),例如 string 对应 new String(),boolean 对应 new Boolean() ,但是primitive都是不可变的。

当JavaScript中遇到对string这类基本类型值进行属性访问或方法调用时,会调用new 相应的包装对象,将基本类型值封装成一个对象,

例子:

var str = 'aaa';
str.name = 'string1';
//JavaScript会对str执行new String(str)方法,返回一个临时的对象,在调用方法或属性结束后销毁此对象。
str.length // 3  
str.name //undefined   基本类型是不包含属性的。
复制代码

Note:str变量所表示的永远是primitive的字符串,而不会因为在调用length属性进行了一次临时包装而发生变化。

Primitive Value存储在栈中,Reference value存储在堆中

简单总结Heap(堆)和Stack(栈)的区别

  1. Stack的空间是由操作系统自动分配和释放的,Heap的空间是由使用者自动申请和释放的。
  2. 栈的空间有限,堆的空间是无限的自由区。
  3. 栈是用来存 ,堆是用来存 引用
  4. 在JS中申明的变量是原始值(Primitive value),则存储在栈中,如果是引用值(Reference value)则存储在堆中。

举例:

// var 变量名 = '';这样定义的东西在栈区
var str = 'aaa';  //只在栈内存中分配空间
//new 数据类型();  这样定义的东西就在堆区
var strObj = new String('aaa'); //则在堆内存中分配空间

复制代码

转载于:https://juejin.im/post/5af6feec51882542682e4a29

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值