为什么给对象添加的方法能用在基本类型上?
因为 C++ 和 Java 的成功,在这两门语言中,每个类都是一个类型,二者几乎等同,以至于很多人常常会把 JavaScript 的“类”与类型混淆。
事实上,JavaScript 中的“类”仅仅是运行时对象的一个私有属性,而 JavaScript 中是无法自定义类型的。
所以,我们必须认识到 3 与 new Number(3) 是完全不同的值,它们一个是 Number 类型, 一个是对象类型。
console.log(typeof 3) -> Number
console.log(typeof new Number(3)) -> object
真是难理解,JS 就 TMD 的是一门奇葩的语言,就是说new出来的都是对象,而不是基本类型,很奇葩,就是说 OC 就不会有 new int(3) 这样的做法,因为 int 是基本类型
其中最为臭名昭著的是 JS 中的“ == ”运算,因为试图实现跨类型的比较,它的规则复杂到几乎没人可以记住。
这里我们当然也不打算讲解 == 的规则,它属于设计失误,并非语言中有价值的部分,很多实践中推荐禁止使用“ ==”,而要求程序员进行显式地类型转换后,用 === 比较。
JS 真是垃圾
Symbol.prototype.hello = () => console.log("hello");
var a = Symbol("a");
console.log(typeof a); //symbol,a 并非对象
a.hello(); //hello,有效
这里为什么说 JS 特别,因为 Symbol 是基础类型,就像 OC 里面,给 int(不是NSNumber)动态添加 方法一样,是有点特别,又有点绕,就是说 JS 所有的类型都可以动态加属性和方法