考虑到在后面的开发中,需要大量的使用js语言去进行开发,所以准备重新规整一下javascript的知识点,专门开了一个js的专栏,用来复习一下js语言。万事开头难,要是后面写的有问题的,欢迎大家在下方无情抽脸!!!

在<code>JavaScript</code>中大体存在2大类数据类型,<code>值类型</code>与<code>引用类型</code>;
值类型:<code>String</code>、<code>Number</code>、<code>Boolean</code>、<code>Null</code>、<code>Undefined</code>以及<code>Symbol</code>
值类型是按值存储,数据存储在内存栈中,
<code>Number</code>,<code>String</code>,<code>Boolean</code>,<code>Symbol</code>都对应了一个包装对象,例如:<code>new Number(5)</code>
这也是能用原始数据类型调用方法的原理:
eg:<code>('happy').toString()</code>,'happy'是一个基本数据类型,本身没有toString的这个方法,所以通过调用ToObject [spec]将值转换为对象,然后去它的包装对象new String('happy')中调用,调用完成后包装对象就会消失,下次需要就会重新创建。
引用类型: <code>Object</code>、<code>Array</code>、<code>Function</code>
引用类型按引用存储的,存储的不是值,而是一个地址,数据存储在内存堆中
<code>typeof</code> 主要用于原始类型的检测
<code>instanceof</code> 主要用于检测自定义对象
<code>Object.prototype.toString.call</code>数据类型判断的终极方法
该方法本质就是依托<code>Object.prototype.toString()</code>方法得到对象内部属性 <code>[[Class]]</code>
传入原始类型却能够判定出结果是因为对值进行了包装
<code>null</code> 和 <code>undefined</code> 能够输出结果是内部实现有做处理
最开始使用<code>javascript</code>的时候<code>var</code>耍的那叫一个炉火纯青,等es6出来后提供的<code>let</code>和<code>const</code>关键字一开始觉得没有<code>var</code>好用,等实际用过后才发现真香!!!(≖ᴗ≖)✧基本现在<code>var</code>已经给淘汰了。
<code>var</code>:全局作用域(函数内),声明存在变量提升,好用是好用,难受也难受!
执行<code>javascript</code>代码时会分为俩个阶段,<code>预编译阶段</code>和<code>运行时阶段</code>,
其中在预编译阶段时候会进行变量声明提升,意思就是会将<code>var</code>定义的变量声明放到代码顶部,变量赋值则是在代码运行时阶段进行,可以通过下面的实例来理解一下JS执行时的变量提升。
当然,除了变量提升外,函数提升也是一样的,大家感兴趣的可以自己试一下。
<code>let</code>:块级作用域,可以看成<code>{}</code>形成一个块级作用域
首先<code>let</code>声明变量不会进行变量提升,也就是说如果想要使用<code>let</code>声明的变量,必须在使用之前声明该变量;
在for循环中可以通过<code>let</code>来给每一次循环时的变量分配各自作用域,从而互不影响。
<code>const</code>:块级作用域
和<code>let</code>关键字一样会形成块级作用域,但是<code>const</code>通常用来声明一个常量!
对于栈存储类型数据来说,通过const申明赋值之后便不可更改;
对于堆存储类型数据来说,通过const申明赋值之后堆引用地址不可更改,但是可以更改堆地址对应的数据(比如对象的属性,数组的选项等!)
以上就是总结的<code>javascript</code>基础中一部分了,关于<code>javascript</code>基础还有很多内容,这边就不再详细介绍了,下一篇讲一下JS的事件循环(Event Loop),感兴趣的小伙伴可以关注一下,想要了解哪些内容也可以下方评论留言,以上内容如有错误也可以留言告知本人。ヽ( ̄▽ ̄)ノ