前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JS基础知识总结(一)

JS基础知识总结(一)

原创
作者头像
前端林子
修改2018-12-30 22:31:36
2.9K0
修改2018-12-30 22:31:36
举报
文章被收录于专栏:前端技术总结前端技术总结

1.变量类型

1.1原始类型和复合类型

ECMAScript中定义了6种原始类型:

number

string

boolean

undefined

null

symbol(ES6新定义)

除了原始类型,其他的function、object、array等都是复合类型

那么如何判断类型呢?

2.类型判断

2.1 typeof

typeof xxx的结果有7种:

number、string、boolean、undefined、object、function、symbol

注意:

(1)老生常谈了,typeof null的结果是object,虽然null是原始类型,而非引用类型。

这是因为在JS的最初版本中,使用的是32位系统,为了性能考虑使用低位存储变量的类型信息。000开头代表的就是对象,另外null表示为全零。因此将null错误地判断为object

(2)typeof 复合类型,除了function类型的结果是function,其他的都是object,注意typeof xxx并没有array这一项,typeof []为object。因此使用tyoeof xxx并不能准确判断变量的类型:

代码语言:javascript
复制
typeof [] //object
typeof {} //object
typeof console.log //function

(3)ES6新增:typeof symbol类型的值,结果是symbol

代码语言:javascript
复制
typeof Symbol() //symbol

2.2 instanceOf

用于实例和构造函数的对应。

上面介绍过typeof []的结果是object,无法判断除数组类型,但是可用instanceOf来判断:

代码语言:javascript
复制
[] instanceof Array //true

再例如:

代码语言:javascript
复制
function Fruit(name) {
    this.name = name;
}
var apple = new Fruit("apple");
console.log('apple instanceof Fruit', apple instanceof Fruit) //true

3.数据类型转换

3.1显式类型转换

也叫强制类型转换,js中类型转换有三种情况:

转换为数字、转换为字符串、转换为boolean值

3.2隐式类型转换

==:先把两边的变量转换成同一类型,然后再做比较;

===:不转换,直接比较;

-、*、/:(只做运算),会自动转换成数字再运算;

+:一是做做字符串连接;二是数字相加。不会自动转换;

在条件判断时,除了0、’’、false、undefined、null、NaN,其他所有值(包括对象)都是true。

3.3对象转换为原始类型

对象在转换为原始类型,会调用内置的toPrimitive()函数

代码语言:javascript
复制
toPrimitive(input,preferedType)

其算法逻辑:

input是输入的值,preferedType是期望转换的类型,他可以是字符串,也可以是数字。

如果转换的类型是number,会执行以下步骤:

1)如果input是原始值,直接返回这个值;

2)否则,如果input是对象,调用input.valueOf(),如果结果是原始值,返回结果;

3)否则,调用input.toString()。如果结果是原始值,返回结果;

4)否则,抛出错误。

如果转换的类型是string,2和3会交换执行,即先执行toString()方法。

4.值类型、引用类型

根据变量类型传递方法,变量又可以分为值类型和引用类型。

值类型:存储的是在栈中的数据。在参数传递方式上,值类型是按值传递。

引用类型:真实的数据存放在堆内存里,存储的是该对象在栈中引用。在参数传递方法上,引用类型是按共享传递。

typeof xxx识别出的类型中,除去object和function是引用类型,其他都是值类型。

两个例子快速比较下值类型和引用类型的参数传递的不同。值类型示例:

代码语言:javascript
复制
 var a = 30;
 var b = a;
 b = 31;
 console.log('a',a) //30
 console.log('b',b) //31

引用类型示例:

代码语言:javascript
复制
var a = { x: 1, y: 2 };
var b = a;
b.x = 7;
b.y = 8;
console.log('a', a) //{x:7,y:8}
console.log('b', b) //{x:7,y:8}

上述例子中,当a、b是值类型时,修改值时二者不会互相影响。而当a、b是引用类型时,修改了b的属性值之后,发现a的值也随之变化。原因是a、b是引用类型时,指向的是同一内存地址,引用的是同一个值,因此修改b的属性时,a的值随之变化。

5.小结

本文主要是回顾梳理JS的基础知识,主要包含变量类型、类型判断的方法、类型转换,以及值类型和引用类型。下一篇JS基础知识总结(二)中,会重点讲一下浅拷贝和深拷贝的有关知识,包括基本概念,和浅拷贝、深拷贝的实现方式。如有问题,欢迎指正。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.变量类型
    • 1.1原始类型和复合类型
    • 2.类型判断
      • 2.1 typeof
        • 2.2 instanceOf
        • 3.数据类型转换
          • 3.1显式类型转换
            • 3.2隐式类型转换
              • 3.3对象转换为原始类型
              • 4.值类型、引用类型
              • 5.小结
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档