稀土掘金 稀土掘金

【JS基础】JS的数据类型和区别

“ 本文正在参加 「金石计划」 ”

JS的数据类型有哪些?

yuque_diagram.jpg 注意:没有数组,函数,日期这些,这些都是类,不是类型

数据类型如何进行区分?

因为ECMAScript的类型是松散的(所以其实太自由也不好,类型不安全,后来引入了TypeScript),所以需要一种手段来确定任意变量的数据类型 这个时候就出现了操作符typeof,以下是变量输出typeof的判断依据

  • ”undefined“ 表示未定义;
  • ”boolean“表示布尔值;
  • ”string“表示字符串;
  • ”number“表示数值;
  • ”object“表示值为对象(而不是函数)或者null
  • ”function“表示值为函数
  • ”symbol“表示值为符号

其中比较特殊的已经标志出来了

问题一:为什么null明明是一个简单数据类型,但使用typeof来判断的时候会输出object呢?

这是因为特殊值null会被认为是一个对空对象的引用 (其实这也是null和undefined的区别,我们一般用null来初始化一个对象)

一般来说不会显式的给某个变量赋值undefined,它在ECMA-262第三版之前是不存在的,增加这个特殊值的目的就是为了正式明确空对象指针(null)和未初始变量的区别——js红宝书

问题二:为什么”function“表示值为函数

严格意义上来说,函数在ECMAScript中被认为是对象,并不代表一种数据类型,可是,函数也有自己特殊的属性,为此,就有必要通过typeof操作符来区分函数和其他对象——js红宝书

(typeof belike:既然你这么特殊,我就给你个单独的名份function吧)

这两种数据类型有什么区别?

首先原始值引用值的定义方式很类似,都是创建一个变量然后赋值

但是在赋值后,能对这个变量做什么就很不同了

第一个区别:动态属性

引用值而言可以随时添加,修改和删除属性和方法

原始值不能有属性,即使尝试给原始值添加属性也不会报错

总结:只有引用值可以动态添加后面可以使用的属性(其实和他们存储方式是有关联的~)

let person = new Object();
person.name = "fyyy";
console.log(person.name); //"fyyy"

let person = "fyyy";
person.age = 18;
console.log(person.age) //undefined

第二个区别:复制值

原始值复制值

原始值在复制值的时候是重新在栈区申请了一块空间,变量之间互不干扰

let num1 = 5;
let num2 = num1;

引用值复制值

let object1 = new Object();
let Object2 = object1; //其实c++中相当于变量取别名地址传递的感觉

new之后发生了什么?至少会在堆内存中开辟一块内存对吧,也就是说new之后返回了一个操作这块儿内存的指针(我们暂时称为temp),但我们知道在js中不像cpp能直接操作对象所在的内存空间,所以这块个temp是对应保存在object1所在的栈区的,我们就通过object1间接去按引用访问,而非实际的对象本身temp

5d01e227f3cc6201733ee2bad7887cd.jpg

那如果我想实现和原始值一样的赋值,都有一个单独的空间,互不打扰,怎么办呢?

深拷贝和浅拷贝,这个地方obj1和obj都指向同一块堆内存就是浅拷贝 而深拷贝会重新开辟一块堆内存给ojb2

第三个区别:传递参数

变量有按值和按引用访问,但是在ECMAScript中传参只有按值传递,为什么这么说呢?

我们来看下面一段代码:

在传递原始值的时候,如果是按照引用传递那么count就会变成30,所以原始值是按值传递进行传参的这没什么疑问

function addTen(num)
  {
    num += 10;
    return num;
  }
let count = 20;
let result = addTen(count);
console.log(count);//还是20 并不会被影响
console.log(result);//30

但是在传递引用值的时候呢?

function setName(obj)
  {
    obj.name = "fyyyy";
  }
let person = new Object(); //创建对象
setName(person);//把这个对象传给setName ,并被复制到参数obj中,这个时候obj和person指向同一个对象
console.log(person.name) //"fyyyy"

结果就是即使是按照值传递的方式把person放入了函数,obj也会通过引用访问对象,使得person身上有了name的属性并且值为fyyyy,那我们传递引用值就是按照引用传递的吗?

不是的,还是刚才提到的,在js中,传参只会按值传递

那是什么原因使得person添加了name呢

这是因为obj指向的对象person保存在全局作用域的栈内存上,而不是因为引用值就是按照引用传递

如果引用值是按照引用传递,那么下面这段代码

function setName(obj)
  {
    obj.name = "fyyyy";
    obj = new Object();//obj指向的对象改变了
    obj.name = "dkkkk";//局部变量 用完就销毁了
  }
let person = new Object(); //创建对象
setName(person);//把这个对象传给setName ,并被复制到参数obj中,这个时候obj和person指向同一个对象
console.log(person.name) //还是输出"fyyyy"

第四个区别:确定类型

typeof操作符最适合用来判断一个变量是否为原始值,(上面已经提到特殊的两个就是object和null用typeof判断的时候都是object) typeof对引用值的用处不是很大,因为我们通常关心的不是这个值是不是对象,而是这个对象是什么类型的对象,这个时候就需要instanceof

XXX instanceof 引用类型最适合用来判断一个变量是否为引用值 (引用类型由原型链决定,可以参考我之前写的对象的原型与原型链那篇文章: 对象的原型与原型链 )

console.log(xiaoming instanceof Person) //true
console.log(xiaoming instanceof Object) //true

按照定义 所有引用值都是Object的实例(js一切皆对象说法的来源),如果用instanceof来检测原始值则会始终输出false

最后总结

原始值与引用值的区别就是:

  1. 存储位置不同:原始值存储在栈内存中,引用值存储在堆内存中。
  2. 传递方式不同:原始值通过值传递的方式进行传递,引用值通过引用传递的方式进行传递。(深浅拷贝)
  3. 比较方式不同:原始值通过值的比较进行比较,引用值通过引用的比较进行比较。(引用值的比较就是看是不是指向同一块堆内存)
  4. 原始值不可变:原始值在被创建后无法修改,只能重新赋值。而引用值可以修改其属性和方法。(动态属性)

玻璃钢生产厂家三门峡室外玻璃钢彩绘雕塑公司陕西玻璃钢人物雕塑生产公司玻璃钢动物雕塑模具培训怎样制作玻璃钢雕塑青州玻璃钢花盆花器商场柱子美陈大邑玻璃钢花盆花器玻璃钢蔬菜水果雕塑桥北商场亮化美陈成都玻璃钢雕塑怎么样玻璃钢雕塑加工厂欢迎来电咨询蚌埠个性化玻璃钢雕塑制作玻璃钢幼儿园景观雕塑商场美陈快闪辽宁火烈鸟玻璃钢雕塑价格庆阳大型玻璃钢雕塑安装常宁玻璃钢气球雕塑熊猫雕塑玻璃钢欧式玻璃钢卡通雕塑有哪些江苏艺术商场美陈生产厂家玻璃钢雕塑饰品厂家大兴区玻璃钢雕塑卢湾玻璃钢花盆特色玻璃钢雕塑摆件开发精美玻璃钢花盆厂家仿真人物玻璃钢雕塑定做商场户外美陈报价漯河景观玻璃钢卡通雕塑倾销玻璃钢dp主题雕塑深圳周边商场美陈厂家直销香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化