一、
JavaScript 数据类型
JavaScript 是一种弱类型或者说动态语言。这意味着不用提前声明变量的类型,在程序运行过程中,类型会被自动确定。也可以使用同一个变量保存不同类型的数据。
原始值:除 Object 以外的所有类型都是不可变的(值本身无法被改变)。
例如,与 C 语言不同,JavaScript 中字符串是不可变的(译注:如,JavaScript 中对字符串的操作一定返回了一个新字符串,原始字符串并没有被改变)。我们称这些类型的值为“原始值”。
(1)分类:
- 7 种原始类型,使用 typeof 运算符检查:
Undefined,Null,Boolean,Number,String,BigInt,Symbol
- 1种引用类型,Object(对象、数组、函数)
(2)区别:
1.存储位置不同
- 原始数据类型:直接存储在栈(stack)中的简单数据段,占据空间小,大小固定,属于被频繁使用的数据,所以存储在栈中;
- 引用数据类型:存储在堆(heap)中的对象,占据空间大,大小不固定,如果存储在栈中,将会影响程序运行的性能。引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址,当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后,从堆中获得实体。
2.传值方式不同
- 基本数据类型:按值传递
- 不可变(immutable)性质:基本类型是不可变的(immutable),只有对象是可变的(mutable). 有时我们会尝试“改变”字符串的内容,但在JS中,任何看似对string值的"修改"操作,实际都是创建新的string值。任何方法都无法改变一个基本类型的值
- 引用类型:按引用传递
-
引用类型的值是可变的:引用类型的值是同时保存在栈内存和堆内存中的对象。javascript和其他语言不同,其不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间,那我们操作啥呢? 实际上,是操作对象的引用,引用类型的值是按引用访问的。
3.两种数据类型在实参和形参中的区别
- 首先要明白什么实参什么是形参。
- 实参:可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。
- 形参:全称为“形式参数”,是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数。形参的作用是实现主调函数与被调函数之间的联系,通常将函数所处理的数据,影响函数功能的因素或者函数处理的结果作为形参。
- 将 num作为实参传入方法 addNum是 param作为形参接受并在方法体内使用,且num在全局中没用改变。但当实参为引用类型时,在方法体内改变形参,将同时改变实参。
二、
原型 ?
js中万物皆对象。
__proto__是每个对象都有的属性,prototype是函数对象特有的属性。
__proto__指向对象构造函数的prototype,prototype指向原型对象。
每个原型对象,都包含一个指针constructor指向构造函数
原型链 ?
当访问一个对象的某个属性的时候,会先在这个对象的本身属性上找,如果没有找到,会去它的__proto__上找,即它的构造函数的prototype,如果还没找到,会在构造函数的prototype的__proto__上找。这样一层层向上查找就会形成一个链式结构,称为原型链。