ECMAScript中定义了6种原始类型:
number
string
boolean
undefined
null
symbol(ES6新定义)
除了原始类型,其他的function、object、array等都是复合类型
那么如何判断类型呢?
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并不能准确判断变量的类型:
typeof [] //object
typeof {} //object
typeof console.log //function
(3)ES6新增:typeof symbol类型的值,结果是symbol
typeof Symbol() //symbol
用于实例和构造函数的对应。
上面介绍过typeof []的结果是object,无法判断除数组类型,但是可用instanceOf来判断:
[] instanceof Array //true
再例如:
function Fruit(name) {
this.name = name;
}
var apple = new Fruit("apple");
console.log('apple instanceof Fruit', apple instanceof Fruit) //true
也叫强制类型转换,js中类型转换有三种情况:
转换为数字、转换为字符串、转换为boolean值
==:先把两边的变量转换成同一类型,然后再做比较;
===:不转换,直接比较;
-、*、/:(只做运算),会自动转换成数字再运算;
+:一是做做字符串连接;二是数字相加。不会自动转换;
在条件判断时,除了0、’’、false、undefined、null、NaN,其他所有值(包括对象)都是true。
对象在转换为原始类型,会调用内置的toPrimitive()函数
toPrimitive(input,preferedType)
其算法逻辑:
input是输入的值,preferedType是期望转换的类型,他可以是字符串,也可以是数字。
如果转换的类型是number,会执行以下步骤:
1)如果input是原始值,直接返回这个值;
2)否则,如果input是对象,调用input.valueOf(),如果结果是原始值,返回结果;
3)否则,调用input.toString()。如果结果是原始值,返回结果;
4)否则,抛出错误。
如果转换的类型是string,2和3会交换执行,即先执行toString()方法。
根据变量类型传递方法,变量又可以分为值类型和引用类型。
值类型:存储的是在栈中的数据。在参数传递方式上,值类型是按值传递。
引用类型:真实的数据存放在堆内存里,存储的是该对象在栈中引用。在参数传递方法上,引用类型是按共享传递。
typeof xxx识别出的类型中,除去object和function是引用类型,其他都是值类型。
两个例子快速比较下值类型和引用类型的参数传递的不同。值类型示例:
var a = 30;
var b = a;
b = 31;
console.log('a',a) //30
console.log('b',b) //31
引用类型示例:
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的值随之变化。
本文主要是回顾梳理JS的基础知识,主要包含变量类型、类型判断的方法、类型转换,以及值类型和引用类型。下一篇JS基础知识总结(二)中,会重点讲一下浅拷贝和深拷贝的有关知识,包括基本概念,和浅拷贝、深拷贝的实现方式。如有问题,欢迎指正。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。