3.4 数据类型
- Undefined
- Null
- Boolean
- Number
- String
- Object
原始类型存值 对象类型存地址
理解:
const a = []
const b = a
b.push(1)
console.log(a) // [1]
假设const a = [ ]在内存地址#001存了"[ ]"
而const b = a代表的是b复制了a存的地址#001 而改变b的值相当于改变这个地址的值即#001的值"[ ]"
3.4.1 typeof 操作符
ECMAScript 为松散类型(即var),用typeof可以检测数据类型。
var message = "some string";
alert(typeof message); //"string"
alert(typeof 100); //"number"
1.Undefined
未经初始化的变量值就为Undefined
var message; //"undefined"
alert(message == undefined); //true
对未初始化和未声明的变量使用typeof操作符都返回undefined。
2.Null
Null是一个空对象指针
var car = null;
alert(typeof car); //"object"
alert(null == undefined); //"true"
typeof null === "object"原因补充:
因为JS最初版本使用得是32位系统,出于性能考虑使用了低位来存储变量得类型信息
而000开头的二进制代表为对象,由于null的二进制表示为全0,因此才被解析为对象
3.Boolean
布尔类型区分大小写:大写的True与False只是标识符,需要用true和false
转型函数Boolean();
var message = "Hello world!";
var messageAsBoolean = Boolean(message); //true
Boolean(0); //false
Boolean(NaN); //false
Boolean(null); //false
Boolean(undefined); //false
Boolean(""); //false
4.Number
十进制:20;
八进制:024;
十六进制:0x15;
科学计数法:e前面的数值乘以10的e后面数值的幂。
3.123e4 ==31230。 ** **
3e-5 == 0.00003。
保存浮点数需要内存为整数的两倍;因此当小数点后没有数或为0时,ES规则会自动转换为整数节约内存。
注:0.1+0.2 != 0.3 0.15+0.25 == 0.4
1.ES中最小数值Number.MIN_VALUE5e-327;
最大数值Number.MAX_VALUE1.7976931348623157e+308;
若超出则正数转换为正无穷反之负无穷。
2.NaN :非数值 (Not a Number)
用于表示一个要返回数值的操作数未返回的情况。
1.任何数值除以NaN会返回NaN。
2.任何涉及NaN的操作都会返回NaN。
3.NaN != NaN。
3.isNaN(x):x为任一参数,此函数可以确认x是否 ”不为数值“
此函数的过程为:先调用valueOf()来确定是否可以装换为数值,若不能则基于此返回值再调用toString()方法再测试返回值。
1.任何不能被转换为数值的值会返回true
eg: isNaN(NaN),isNaN(“blue”)
2.能被转换为数值的值会返回false
eg: isNaN(10),isNaN(“10”),isNaN(true)
4.数值转换
有3个函数可把非数值转换为数值:1.Number() 2.parseInt() 3.parseFloat
3个函数对于同样的输入会返回不同的结果。
1.Number()可以转换任意数据类型,但转换字符串时较为复杂,规则较多,推荐用后两种方式。
var num1 = Number("hello world!"); //NaN
var num2 = Number(true); //1
var num3 = Number("00001012"); //1012
var num4 = Number(""); //0
var num5 = Number("0xf"); //15
2.parseInt() ,parseFloat()
1.paserInt()会忽略字符串前的空格,直至找到第一个非空格字符,若第一个字符不是数字或符号则返回NaN
即对空字符返回NaN,而Number()返回0
var num1 = parseInt("1234blue"); //1234
var num2 = parseInt(""); //NaN
var num3 = parseInt("0xA"); //10
var num4 = parseInt(22.5); //22
注: parseInt()在ES3与ES5中对八进制解析有分歧
parseInt(“070”) 在ES3中为56 而在ES5中为70
因为在ES5中无法解析八进制因此前导的0无效
使用双参数可以选定转换的形式:parseInt(“070”,8),则在ES3与ES5中都为56
2.parseFloat()可以转换带一个小数点的数值且会忽略前导的0,因此转换16进制时会返回0
其他功能与parseInt()类似
5.String
在ES中双引号和单引号都可表示字符串
一些字面量含义:
\n 换行
\t 制表
\b 退格
\r 回车
\f 进纸
’ 单引号字符串中表示单引号
" 双引号字符串中表示双引号
在字符串中加入转义序列被视为一个字符
ES中字符串的特点:不可变。
var lang = "java";
lang = lang + "script"; //javascript
在这个过程中是先创建一个能容纳10字符的字符串,然后再这个字符串中填充"java"和"script”,最后一步是销毁原来字符串"java"和"script"。这也是老浏览器拼接字符串慢的原因。
toString()方法:
var age = 11;
var ageAsString = age.toString(); //"11"
var found = true;
var foundAsString = found.toString(); //"true"
数值,布尔值,对象,字符串都有toString()方法(字符串返回它的一个副本),而null和undefined没有此方法
调用时一般不加参数,里面加的参数为要转换成的进制。
String()方法:
能将任意类型数据转换为字符串,其过程为:若值有toString()方法则调用并返回,若为null则返回null,undefined返回undefined
6.Object
<1>
var a = new Object();
对象实例属性及方法:
1.constructor:保存用于创建当前对象的函数,在1中构造函数就是Object().
2.hasOwnProperty(propertyName):检查给定属性在当前对象实例中是否存在。(propertyName)中参数为字符串.
3.isPrototypeOf(object):检查传入对象是否为当前对象原型.
4.toLoacalString():返回对象的字符串形式.<与执行环境对应>.
5.toString():返回对象的字符串形式.
6.valueOf():返回对象的字符串,数值,布尔值表示