看过阮一峰的JavaScript教程之后,深有感触,为了对自己所学的知识进行巩固,因此写下了这篇博客。
一、js的数据类型
在es6中js的数据类型有七种:number、string、boolean 、Symbol、null、undefined、object.
typeof运算符可以用来判断一个值的数据类型
1.typeof 1 =number;
2.typeof ‘a’ =string;
3.typeof true=boolean;
4.typeof null=object;
5.typeof undefined=undfined;
6.typeof function(){}=function;
7.typeof {1:3}=odject;
1.number
JavaScript 内部的数字都是以(64位的)浮点数存在的。需要整数时对应的数字会转换成32位的整数。
1.数值的表示
科学计数法
123e3 // 123000
123e-3 // 0.123
当符合一下情况时,用科学计数法表示。
(1)小数点前的数字多于21位。
(2)小数点后的零多于5个。
除此之外用直接字面量表示。
2.数值的进制
通常情况下都是十进制。
0xff // 255 十六进制
0o377 // 255 八进制
0b11 // 3 二进制
3.NaN非数字,是number的特殊值。
NaN和任何值都不相等,包括自身。
NaN和任何值运算都是NaN。
不能使用indexof运算符。
4.与数字相关的全局方法
1.paresInt()用于将字符串转换成整数,不是字符串的会先转换成字符串。开头的空格会被忽略。
返回值:十进制数字/NaN
2.parseFloat()用于将一个字符串转为浮点数。
返回值:十进制数字/NaN
3.number(),他比parseInt90更为严格,parseInt单个字符解析,number()是将整个看做整体进行解析
* 使用 Number 作为函数来转换 Date 对象为数字值:
var d = new Date("December 17, 1995 03:24:00");
print(Number(d));
这将输出 "819199440000"。
*转换数字字符串为数字
Number("123") // 123
Number("") // 0
Number("0x11") // 17
Number("0b11") // 3
Number("0o11") // 9
Number("foo") // NaN
Number("100a") // NaN
4.isNaN()用来判断一个值是否为NaN.只对数值有效,如果传入其他值,会被先转成数值
对于空数组和只有一个元素的数组会返回false。
5.isFinite()方法返回一个布尔值,表示某个值是否为正常的数值。
isFinite(Infinity) // false
isFinite(-Infinity) // false
isFinite(NaN) // false
isFinite(undefined) // false
isFinite(null) // true
isFinite(-1) // true
2.字符串
字符串是字符数组的集合用单引号或者双引号括起来
1.如果在是字符串内部使用符号,需要在符号前面加上转义符\
2.如果长字符串必须分成多行,可以在每一行的尾部使用反斜杠。
var longString = 'Long \
long \
long \
string';
或者使用+好链接
在es6中使用 反引号`
。
3.需要用反斜杠转义的特殊字符,主要有下面这些。
\0 :null(\u0000)
\b :后退键(\u0008)
\f :换页符(\u000C)
\n :换行符(\u000A)
\r :回车键(\u000D)
\t :制表符(\u0009)
\v :垂直制表符(\u000B)
\' :单引号(\u0027)
\" :双引号(\u0022)
\\ :反斜杠(\u005C)
4.符串内部的单个字符无法改变和增删,这些操作会默默地失败。
三、null (空)和 undefined(未定义)
null与undefined都可以表示“没有”,含义非常相似。
1.变量没有值-undefined
2.空对象-null
3.非对象不想给值-undefined
四、boolean
下面六个值被转为false,其他值都视为true。
undefined
null
false
0
NaN
""或''(空字符串)
五、对象(哈希表)
对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。
1.生成方法
var obj ={}\new object();
2.键名
1.当键名符合标识符规则时,可以不用引号。如果相似用特殊符号则需要引号。
2.如果键名是数值,会被自动转为字符串。
3.
var obj = {
1: 'a',
3.2: 'b',
1e2: true,
1e-2: true,
.234: true,
0xFF: true
};
obj
// Object {
// 1: "a",
// 3.2: "b",
// 100: true,
// 0.01: true,
// 0.234: true,
// 255: true
// }
obj['100'] // true
上面代码中,对象obj的所有键名虽然看上去像数值,实际上都被自动转成了字符串。
3.对象的引用
var a =obj1;
a存储的是odj1对象的地址值。称a引用了对象。
1.如果a\b同时引用了同一对象,单独修改会相互影响。
4.对象属性的操作
点运算符和方括号运算符
1.使用方括号运算符,键名必须放在引号里面,否则会被当作变量处理。
2.注意,数值键名不能使用点运算符(因为会被当成小数点),只能使用方括号运算符。
3.在键名符合标识符规则的情况下才能使用点操作,并且点操作符会把键名转变成字符串(obj.name=obj[“name”])。
点运算符和方括号运算符都可以增加对象的属性或者读取对象属性。
关于对象属性的其他操作
1.delete obj.p
删除对象的p属性.
2.判断对象属性是否存在:in 运算符
p in obj
返回值:true/false
in运算符的一个问题是,它不能识别哪些属性是对象自身的,哪些属性是继承的。
这时,可以使用对象的hasOwnProperty方法判断一下,是否为对象自身的属性。
var obj = {};
if ('toString' in obj) {
console.log(obj.hasOwnProperty('toString')) // false
}
3.for…in 循环 遍历对象属性
for…in循环用来遍历一个对象的全部属性。
var obj = {a: 1, b: 2, c: 3};
for (var i in obj) {
console.log(i, obj[i]);
}
for…in循环有两个使用注意点。
它遍历的是对象所有可遍历(enumerable)的属性,会跳过不可遍历的属性。
它不仅遍历对象自身的属性,还遍历继承的属性。
遍历的顺序是随机的。
一般情况下,都是只想遍历对象自身的属性,所以使用for…in的时候,应该结合使用hasOwnProperty方法,在循环内部判断一下,某个属性是否为对象自身的属性。
var person = { name: '老张' };
for (var key in person) {
if (person.hasOwnProperty(key)) {
console.log(key);
}
}
Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,顺序与手动遍历该对象属性时的一致。
var a={"a":1,"name":"wanag",age:"23"}
undefined
Object.keys(a)
// ["a", "name", "age"]
4.with 语句
with语句的格式如下:
with (对象) {
语句;
}
它的作用是操作同一个对象的多个属性时,提供一些书写的方便。
// 例一
var obj = {
p1: 1,
p2: 2,
};
with (obj) {
p1 = 4;
p2 = 5;
}
// 等同于
obj.p1 = 4;
obj.p2 = 5;
注意:with对对象不存在的属性进行赋值操作时,会创造一个当前作用域的全局变量。所以with语句应先给对象创建属性。
with区块没有改变作用域,它的内部依然是当前作用域。这造成了with语句的一个很大的弊病,就是绑定对象不明确。建议不要使用with语句。