js中数据类型记录

(在基于阅读很多大佬的博客下的笔记)
基本数据类型:undefined null number boolean string
引用数据类型:object array function data等

基本数据类型:
undefined和null
undefined指声明了变量,但未进行初始化
null,用typeof会返回object,因为它被认为是空对象的引用,如果定义的变量以后相当做对象来用,可初始化为null
number boolean string
在数值中,js存在一个特殊的值NaN(Nor a number),其与任何数都不相等,NaN!=NaN,(不是一个数字不一定等于不是一个数字🐶,好有道理的说),任何操作都会返回NaN
NaN:
当表达式中-,*,/运算时,会试图将每个项先转化为number类型,转化失败,返回NaN
+,由于js表达式执行顺序按照运算符优先级从左到右依次进行,只有两边都是number才是数字相加,一个是字符串就是字符串相加了。
类型转化失败返回NaN
isNaN()可以检查一个值是否被Numner()成功转化
在字符串中,单引号和双引号作用效果一致
在布尔中,可以用Boolean()将其他值转为布尔类型

两者的区别
基本数据类型是存放在栈中的数据段
基本数据类型不可以添加属性和方法
基本数据类型赋值是简单赋值,一个变量向另一个变量赋值时,会在变量对象上创建一个新值,然后把这个值复制到为新变量分配的位置上,两个变量不会互相影响。
基本数据类型的值是不可变的,比如在学字符串方法的时候,我们知道调用concat等方法[^1]时不会改变原字符串,

var name=“abc”;
name=“def”;console.log(name)//def ???
看起来像是改变了name的值,然而,abc并未改变,name是指向abc的一个指针,我们改变的是指针的指向。我们所说的基础数据类型是abc

基础数据类型比较时比较的是值


引用数据类型是存放在堆中的对象,在栈中存放堆内存中具体内容的引用地址和变量标识符
引用数据类型可以添加属性方法
引用数据类型的赋值,仍然是值复制到新变量分配的位置上,由于引用数据类型保存在栈中的变量是堆地址,所以相当于两个地址指向同一个对象,会互相影响
引用数据类型的值可以改变
引用数据类型在比较时,比较的是地址。

通过上面我们可以知道typeof无法精准区分数据类型,可以利用object对象上的tostring方法进行判断。
object.prototype.tostring.call() 返回示例:[object 类型]
最推荐的方式,可以自己写一个前面不带object的返回直接得到类型(≧∇≦)/
instanceof可以正确判断引用数据类型,但基本数据类型不可以判断,instanceof用来测试一个对象在其原型链中是否存在一个构造函数的prototype属性,而基本数据类型没有被实例化为对象。
还可以用constructor判断,但更改原型后就不正确了。null和undefined不可以判断。
涉及的原型链有缘继续


[^1]基本数据类型不应该有方法,而此时调用的方法,ecmascript提供了三个特殊的引用类型Boolean String Number ,称为基本包装类型当读取对应三个基本数据类型时,会创建一个对应包装对象。基本包装类型只会存在代码的执行瞬间,然后销毁,而引用数据类型实例在离开作用域前都会保存在内存中,因此,两者不同。
感谢好多好多大佬的讲解。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值