JavaScript中每一个值,都属于某一种数据结构,JavaScript中的数据类型有七种,分别为:
- undefined:表示已声明但未定义或未赋值
- null:表示空值
- Boolean:表示布尔值,只存在true(真)和false(假)两种值
- object:表示对象,复杂数据类型
- string:表示字符
- number:表示数值
- symbol:表示当前类型的唯一性,属于Es6新增,本文暂不涉及
而在JS中原始数据类型只有六种分别是undefined,null,boolean,string,number,symbol(Es6新增),object包含有object、array、date等,所以他属于引用数据类型
undefined和null
在阮一峰老师的JavaScript教程中对两个值做出了如下解释
null表示空值,即该处的值现在为空。调用函数时,某个参数未设置任何值,这时就可以传入null,表示该参数为空。比如,某个函数接受引擎抛出的错误作为参数,如果运行过程中未出错,那么这个参数就会传入null,表示未发生错误
undefined表示“未定义”,即已声明但是并未赋值
他们两个都可以表示没有,含义非常的接近
undefined==null //true
undefined===null//false
上面代码中在两个值进行等同比较时返回的结果为ture,只有当恒等的时候才为false,可见这两个值有多么的相似。
而为什么上述代码中,在恒等时候回返回false呢?其实在JavaScript的最初版本是这样区分的:
-
null是一个表示"无"的对象,转为数值时为0
-
undefined是一个表示"无"的原始值,转为数值时为NaN所以null和undefined基本是同义的,只有一些细微的差别。
Boolean
boolean表示布尔值,主要用于逻辑判断,布尔值只有true(真)和false(假)这两个返回值,用typeof检查一个布尔值时会返回boolean
-
在运算符中前置逻辑运算符,相等运算符,比较运算符会返回为布尔值。
-
而如果某个位置预期会转化成布尔值,在JavaScript中以下六种情况也会返回为false,其他值都会为true
undefined?true:false; //false
null?true:false; //false
0?true:false; //false
false?true:false; //false
""?true:false; //false
NaN?true:false; //false
String
string表示字符串,就是零个或多个排在一起的字符,放在单引号或双引号之中。
var s="hello word";
var s1='hello word';
反斜杠(\)在字符串内有特殊含义,用来表示一些特殊字符,所以又称为转义符。需要用反斜杠转义的特殊字符,主要有下面这些:
- \0 :null
- \b :后退键
- \f :换页符
- \n :换行符
- \r :回车键
- \t :制表符
- \v :垂直制表符
- ’ :单引号
- " :双引号
- \ :反斜杠
var s2="hello";
console.log(s2[0]); //h
console.log(s2[1]); //e
console.log(s2[2]); //l
console.log(s2[3]); //l
console.log(s2[4]); //o
console.log(s2[5]); //undefined
console.log(s2.length); //5
例如上面代码,在字符串中字符是以字符数组形式存储的,所以用数组的形式访问字符串也可以访问到,但是这样访问到的数值只能具有只读性,而无法更改。
a[0]='w';
a //hello
number
number表示数值,包括整数和浮点数,并且所有数字都是以64位浮点数形式储存。
var num=10 ;
var num1=0.1;
var num2=0.2;
由于在JavaScript中浮点数不是精确的值,所以在比较浮点数时要特别的小心,
num1+num2===0.3 //false
0.3/num1 //2.9999999999999996
在JavaScript中64位浮点数的指数部分的长度是11个二进制位,意味着指数部分的最大值是2047。也就是说,64位浮点数的指数部分的值最大为2047,分出一半表示负数,则JavaScript能够表示的数值范围为21024到2-1023,超出这个范围的数无法表示。
如果一个数大于等于2的1024次方,那么就会发生“正向溢出”,即 JavaScript 无法表示这么大的数,这时就会返回Infinity。
Math.pow(2, 1024) // Infinity
如果一个数小于等于2的-1075次方,那么就会发生为“负向溢出”,即 JavaScript 无法表示这么小的数,这时会直接返回0。
Math.pow(2, -1075) // 0
NaN(not a number)是JavaScript中的一个特殊值,表示为"非数字"。
1–"a" //NaN
1/"a" //NaN
0/0 //NaN
上面代码运行时,会自动将字符串x转为数值,但是由于x不是数值,所以最后得到结果为NaN,表示它是“非数字”(NaN)。
NaN===NaN //false
上面代码中,可以看得出NaN不等于任何值,包括它本身
object
object表示对象,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合
创建对象的方式通常有两种方式:构造函数和对象字面量
构造函数创建:
var obj = new Object();
obj.name = "last code";
obj.age =18;
obj.sex="男";
}
字面量创建:
var obj1 = {
name="last code",
age=18,
sex="男"
};
在对象中,读取属性的方法有俩种方法,分别是:
obj.name // "last code"
obj['name'] // "last code"
请注意,如果使用方括号运算符,键名必须放在引号里面,否则会被当作变量处理。
在对象中不仅可以读取值还可以赋值,例如:
obj.hobby="玩游戏";
obj["height"]=1.88;
在对象中查看对象的所有值可以用Object.keys(对象名)的方法。
Object.keys(obj1) //['name','age','sex']
在对象中查看属性是否存在可以用:in 运算符
'name' in obj // true
'sex' in obj //true
注意,in不能识别哪些属性是对象自身的,哪些属性是继承的
属性的遍历可以用for…in
for (var i in obj1) {
console.log('键名:', i);
console.log('键值:', obj1[i]);
}
//键名: name
// 键值:last code
// 键名:sex
// 键值:10
// 键名:age
// 键值:男
注意它遍历的是对象所有可遍历的属性,会跳过不可遍历的属性,它不仅会遍历对象自身的属性,还遍历继承的属性