typeof 共返回6种数据格式:
1、object
2、undefined
3、string
4、number
5、boolean
6、function
特别注意 typeof [ ] 和 typeof null 返回的都是object ,typeof
对于原始类型来说,除了 null
都可以显示正确的类型
typeof(Object)和typeof(Array)的结果是function,因为Object和Array本身就是内置函数。
javascript中的数据类型:
ECMAScript 中包含两种不同数据类型的值:基本类型值
和 引用类型值
。基本类型值
就是简单的 数据段,而 引用类型值
指那些可能由多个值构成的 对象。
基本数据类型:Undefined
、Null
、Boolean
、Number
、和 String、symbol
(symbol是ES6中新增的数据类型)
按值访问的,因为可以操作保存在变量中的实际的值。
首先原始类型存储的都是值,是没有函数可以调用的,比如 undefined.toString(),但
'1'.toString()
是可以使用的。其实在这种情况下,'1'
已经不是原始类型了,而是被强制转换成了 String
类型也就是对象类型,所以可以调用 toString
函数。
引用数据(对象)类型:Object,array,function ( 基本上所有的对象最终都是继承于Object(null和undefined没有原型对象),)
对象类型和原始类型不同的是,原始类型存储的是值,对象类型存储的是地址(指针)。当你创建了一个对象类型的时候,计算机会在内存中帮我们开辟一个空间来存放值,但是我们需要找到这个空间,这个空间会拥有一个地址(指针)。
我们来看个例子:
function test(person) {
person.age = 26
person = {
name: 'yyy',
age: 30
}
return person
}
const p1 = {
name: 'yck',
age: 25
}
const p2 = test(p1)
console.log(p1) // {name:'yck',age:26}
console.log(p2) // {name:'yyy',age:30}
- 首先,函数传参是传递对象指针的副本
- 到函数内部修改参数的属性这步,我相信大家都知道,当前
p1
的值也被修改了 - 但是当我们重新为
person
分配了一个对象时就出现了分歧
所以最后 person
拥有了一个新的地址(指针),也就和 p1
没有任何关系了,导致了最终两个变量的值是不相同的。
javascript数据类型中的一些小知识点:
1.0.1 + 0.2 = 0.3?
在JS中,0.1+0.2是不等于0.3的,因为0.1在计算机中用二进制表示的话,会产生无限循环位数。类似于十进制中,三分之一就是无限循环小数。
所以对这些循环小数进行数学运算时,并将二进制数据再转换成十进制时,也还是无线循环小数,对末尾进行截取后,得到的值就是0.30000000000000004
正确的比较方法是使用JS提供的最小精度值,检查等式左右两边差的绝对值是否小于最小精度:
Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON (true)
2. 666 和 new Number(666)的区别
123 是一个number类型的数字,而Number(123)是一个对象类型的数据。
‘HELLO
'.charAt(1) ==》 '
E'
点(.)运算符提供了装箱操作,会根据一个基础类型构造一个临时对象,所以能在基础类型上调用对应对象的方法
3. parseInt 和 parseFloat
parseInt(string, radix)-------将字符串转换成整型类型数字
parseInt 会忽略字符串前面的空格,直到找到第一个非空格字符,如果第一个字符是数字字符会继续解析第二个字符,直到遇到非数字字符停止,如果第一个不是数字字符,该方法将返回NaN,不再继续执行其他操作。
parseInt可以识别各种整数格式,如:8进制,10进制,16进制,所以可以接收第二个参数表示要转换为多少进制
parseFloat -------将字符串转换成浮点类型的数字
与parseInt()方法的处理方式相似,从位置0开始查看每个字符,直到找到第一个非有效的字符为止,然后把该字 符之前的字符串转换成数字。
不过,对于这个方法来说,第一个出现的小数点是有效字符。如果有两个小数点,第二个小数点将被看作无效的, parseFloat
()方法会把这个小数点之前的字符串转换成数字。这意味着字符串 "22.34.5 "将被解析成22.34。
使用parseFloat()方法的另一不同之处在于,字符串必须以十进制形式表示浮点数,而不能用八进制形式或十六进制形式。
4. 类型转换