先来看一句颇有争议的一句话——“在JavaScript中,一切皆对象。理解对象,才能理解JavaScript》你觉得这句话是对还是错,为什么?其实知乎上曾经有人问过一个问题——如何理解javascript中的一切都是对象?暂且搁置一旁,在文末,作者会给出自己的答案,想看答案的可以直接拉到文末,看看上一篇中JavaScript是由什么组成的,什么是上例中出现的Function、Array等属于?这里引用两本书和MDN中的内容,结合下定性:根据《JavaScript 高级编程第四版》(以下简称高程4)声明:引用类型包括:Object、Array、类型化数组、Date、RegExp、Function、基本封装类型(String、Number、Boolean)、单个内置对象(Global、Math)、ES6新引用类型(Map、WeakMap、Set、WeakSet)和in《JavaScript启示录》,给出了9个原生(或内置)的对象构造函数,String,Number,Boolean,Object、Array、Function、Date、RegExp、Error和MDN比较全面,不仅有值属性(NaN、undefined)、函数属性(eval、isNaN、parseFloat、encodeURI)、基本对象(Object、Function、Boolean、Symbol)、错误对象(Error、TypeError、ReferenceError)、数字和日期对象(Number、BigInt、Math、Date)、字符串(String、RegExp)、可索引集合对象(Array)、使用键的组合对象(Map、Set、WeakMap、WeakSet)、结构化数据(ArrayBuffer、JSON)、控制抽象对象(Promise、Generator)、辐射(Reflect、Proxy)、国际化(Int1)、WebAssembly、arguments等。个人认为MDN上的内容可以看作是一个dictionary,external(interview)可以根据高度4。解释,等等,你不是说引用类型指的是对象(object)吗,为什么要包含这些东西,不是建-在对象中?对象~~内置对象~~难道说对象包括内置对象?这就是为什么MDN说:对象(object)指的是内存中可以被标识符引用的区域。海拔四说:ECMA-262将对象定义为一组没有组合的属性。你可以把一个ECMAScript对象想象成一个哈希表,里面存储的是一组名称/值对,值可以是数据也可以是函数,所以JavaScript中的对象包括内置对象(或者对象由内置对象和自定义对象)。由于“原型”和“继承”的下层设计,对象是“祖先巨人”。String,Number,Boolean,Array,Function,Date,RegExp,Error等在它的基础上组成了具有各自特点的构造函数。当然,我不认识他们,还有很多其他的内置对象。后来笔者在看《JavaScript权威指南(第6版)》一的时候看到了这个解释:下面的术语是用来区分三种类型的JavaScript对象和两种类型的属性的。本机对象是由ECMAScript规范定义的对象或类。例如,数组、函数、日期和正则表达式都是内置对象。宿主对象由嵌入了JavaScript解释器的宿主环境(例如Web浏览器)定义。通过运行JavaScript代码创建的对象自身的属性(ownproperty)是直接在对象中定义的属性。继承属性(inheritedproperty)是在对象的原型对象中定义的属性。所以JavaScript中的“对象”是非常强大的。大多数元素都是基于“对象”构建的。其中Object、Function、Array等对象比较重要,后面会介绍。单个内置对象,其他内置函数,ES6新增的Map、Set、WeakMap、WeakSet暂不介绍。这里我们将讨论基本的包装类型。基本的封装类型包括:String、Number、Boolean,这些都和basic有关string、number、boolean在类型上有什么区别先看下面代码:varstring1='foo';varstring2=String('foo');varnumber1=10;varnumber2=Number('10');varboolean1=true;varboolean2=Boolean('true');console.log(typeofstring1,typeofstring2);//输出'string,string'console.log(typeofnumber1,typeofnumber2);//输出'number,number'console.log(typeofboolean1,typeofboolean2);//输出'boolean,boolean'//如果使用构造函数和new关键字创建对象varmyString=newString('male');varmyNumber=newNumber(23);varmyBoolean=newBoolean(false);console.log(typeofmyString,typeofmyNumber,typeofmyBoolean);//object,object,object如果我们使用字面量语法创建一个值,我们可以看到数据类型的输出它是一个基本类型。如果使用new关键字创建String()、Number()、Boolean()值,创建的对象实际上是一个对象(引用类型)。这意味着new关键字搞了一些花样,具体后续文章会对其进行介绍,也说明无论是创建带有字面值的值,还是调用不带new的基本包装类型,都会转换成它们的相应的类型。让str="Hello";console.log(str.toUpperCase());//为什么HELLO是基本类型有一种方法toUpperCase。既然是基本类型,那就是字符串。为什么会有方法?方法从何而来?Elevation4的解释是:每当以读模式访问一个字符串值时,都会在后台执行以下三个步骤:创建一个String类型的实例;在实例上调用特定方法来销毁实例。这三个步骤可以想象为执行如下3行ECMAScript代码:lets1=newString("sometext")lets2=s1.substring(2)s1=nullJavaScriptInfo给出的答案是:这里是JavaScript的创建者面临的悖论:人们可能会想到像字符串或数字这样的原始类型执行许多操作并且最好使用方法访问。原始类型必须尽可能简单和轻量级。而且解决方案看起来有些别扭,如下:原始类型仍然是原始的。正如预期的那样,提供单个值的JavaScript允许访问字符串、数字、布尔值和符号的方法和属性。为了让它们工作,创建了特殊的“对象包装器”以提供额外的功能并在使用后销毁。每种原始类型的“对象包装器”都不同,它们称为String、Number、Boolean、Symbol和BigInt。因此,它们提供了不同的方法。两者都给出了答案:ECMAScript引擎在调用字符串、数字等基本类型时,会使用基本封装类型作为构造函数,创建基于它的实例,调用后,得到生成的结果。调用时删除实例,所以也说明了虽然是基本类型,但是可以调用各种原型方法。也体现了个别类型两者兼备的特殊场景(轻量级和小内存,还有方便的方法),都是为了提高性能。在JavaScript中一切都是对象?回到开头说的:如何理解JavaScript中一切皆对象?笔者的回答是:不能说全,但基本上还不错。JavaScript按照数据类型分为原始类型和引用类型。原始类型也称为原始值,包括string、number、boolean、null、undefined、symbol、bigint;而引用类型是对象,其对象分为内置对象、宿主对象和自定义对象。内置对象包括Object、Array、类型化数组、Date、RegExp、Function、基本封装类型(String、Number、Boolean)、单个内置对象(Global、Math)、ES6新引用类型(Map、WeakMap、Set),WeakSet)等。更多细节可以查看MDN。你写的代码都是除了基本类型之外的所有对象,基本类型中的string、number、boolean、symbol、bigInt都有对基本封装类型的调用。原型方法删除实例的关系后。简单来说,它们不仅享受了基本类型的轻便,占用内存少,还获得了调用内置构造函数的各种原型方法。基本类型中,除了null和undefined,其余都和对象有关,而引用类型指的是Object,所以JavaScript中的一切都是对象,大致是正确的。下一节,我们来看看对象中的内置构造函数——对象参考JavaScript高级编程第四版JavaScript权威指南JavaScript启示录MDN现代JavaScript教程系列文章深入理解JavaScript-入门深入理解ofJavaScript——什么是JavaScript深入理解JavaScript——JavaScript由什么组成深入理解JavaScript——万物皆对象JavaScript——new做了什么深入理解JavaScript——Object.create深入深入理解JavaScript——copy的秘诀深入理解JavaScript——Prototypinginstanceof——找祖宗了解JavaScript——Function深入理解JavaScript——Scope深入理解JavaScript——this关键字深入理解JavaScript——call、apply、bind三将深入理解JavaScript——立即执行函数(IIFE)深入理解UnderstandingJavaScript—LexicalEnvironment深入理解JavaScript—执行上下文和调用栈深入理解JavaScript—ScopeVSExecutionContext深入理解JavaScript—Closure深入理解JavaScript—防抖与节流深入理解JavaScript—函数式编程In-深入理解JavaScript——垃圾回收机制深入理解JavaScript——Array深入理解JavaScript——循环来了
