我们知道,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"。
慕的地6264312
TA贡献1817条经验 获得超6个赞
包装对象带有一些有用的属性和方法。比如,数字对象就带有toFixed()和toExponential()之类的方法,字符串对象带有substring()、chatAt()和toLowerCase()等方法以及length属性。这些方法非常方便,和原始值相比,这是包装对象的优势,但其实原始值也可以调用这些方法,因为原始值会首先转换为一个临时对象,如果转换成功,则调用包装对象的方法。因为原始值可以根据需要转换成对象,这样的话,也不必为了用包装对象的方法而将原始值手动“包装”成对象。比如,不必使用newString("hi"),直接使用"hi"即可。不得不使用包装对象的一个场景是,有时我们需要对值进行扩充并保持值的状态。原始值毕竟不是对象,不能直接对其进行扩充。Source:第三章字面量和构造函数
添加回答
举报
0/150
提交
取消