为了账号安全,请及时绑定邮箱和手机立即绑定

两种变量创建类型的异同

两种变量创建类型的异同

慕慕森 2019-04-16 20:26:32
我们知道,javascript中,除了null、undefined两种类型,一切都是对象。然而:javascriptvarnum_obj=newNumber(100);varnum_val=100;console.log(typeofnum_obj);//"object"console.log(typeofnum_val);//"number"num_obj.myCustomAttr="mycustomattrbute";num_val.myCustomAttr="mycustomattrbute";console.log(num_obj.myCustomAttr);//"mycustomattrbute"console.log(num_val.myCustomAttr);//undefined那么问题来了通过new关键字构造的变量与直接赋值的变量有何不同?分别出现上述两种不同结果的原因是什么?javascript为何要这么设计?
查看完整描述

2 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

JavaScript并非所有的东西都是对象
javascript有2套类型系统:原始值(primitive)和对象(object)。
原始值类型boolean,number以及string都有自己对应的包装类型Boolean,Number和String。
原始值是不可变的,你不能给它们添加属性。
你的问题1:
通过new关键字构造的字符串变量与直接赋值的字符串变量有何不同?
new创建的是String对象(object)。
直接赋值的字符串变量创建的是字符串原始值(primitive)。
分别出现上述两种不同结果的原因是什么?
原始值是不可变的,你不能给它们添加属性。因此输出undefined。
javascript为何要这么设计?
不能怪javascript,大部分语言都这样,都有2套类型系统。
但是现在的主流脚本语言正在改变这个现状,一切都是对象。
因此,你不仅可以写"abcde".length(),你甚至可以写1.add(3)表示1+3,如果结合闭包,那就更炫酷了:
5.time({print("hello");});
输出5次"hello"。
                            
查看完整回答
反对 回复 2019-04-16
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

包装对象带有一些有用的属性和方法。比如,数字对象就带有toFixed()和toExponential()之类的方法,字符串对象带有substring()、chatAt()和toLowerCase()等方法以及length属性。这些方法非常方便,和原始值相比,这是包装对象的优势,但其实原始值也可以调用这些方法,因为原始值会首先转换为一个临时对象,如果转换成功,则调用包装对象的方法。
因为原始值可以根据需要转换成对象,这样的话,也不必为了用包装对象的方法而将原始值手动“包装”成对象。比如,不必使用newString("hi"),直接使用"hi"即可。
不得不使用包装对象的一个场景是,有时我们需要对值进行扩充并保持值的状态。原始值毕竟不是对象,不能直接对其进行扩充。
Source:第三章字面量和构造函数
                            
查看完整回答
反对 回复 2019-04-16
  • 2 回答
  • 0 关注
  • 350 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信