我们知道,javascript中,除了null、undefined两种类型,一切都是对象。然而:
javascript
var num_obj = new Number(100); var num_val = 100; console.log(typeof num_obj); // "object" console.log(typeof num_val); // "number" num_obj.myCustomAttr = "my custom attrbute"; num_val.myCustomAttr = "my custom attrbute"; console.log(num_obj.myCustomAttr); // "my custom attrbute" console.log(num_val.myCustomAttr); // undefined
那么问题来了
通过 new 关键字构造的变量与直接赋值的变量有何不同?
分别出现上述两种不同结果的原因是什么?javascript为何要这么设计?
JavaScript 并非所有的东西都是对象
javascript 有 2 套类型系统:原始值(primitive)和对象(object)。
原始值类型 boolean, number 以及 string 都有自己对应的包装类型 Boolean, Number 和 String。
原始值是不可变的,你不能给它们添加属性。
你的问题1:
new
创建的是 String 对象(object)。原始值是不可变的,你不能给它们添加属性。因此输出
undefined
。不能怪 javascript,大部分语言都这样,都有 2 套类型系统。
但是现在的主流脚本语言正在改变这个现状,一切都是对象。
因此,你不仅可以写
"abcde".length()
,你甚至可以写1.add(3)
表示1+3
,如果结合闭包,那就更炫酷了:输出
5
次"hello"
。