strict模式
启用strict模式的方法是在JavaScript代码的第一行写上:
'use strict';
-
数据类型
Number
1.计算机中的float类型都是不能直接比较的
2.NaN:not a number,表示无法计算结果。
3.Infinity:表示无限大。
比较运算符
1.==,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果;
2.===,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较;
3.不要使用==比较,始终坚持使用===比较。
4.NaN这个特殊的number与所有其他值都不相等,包括它自己。NaN===NaN;//false
4.所以,判断NaN只能通过isNaN()函数。isNaN(NaN);//true
5.要比较两个浮点数是否相等,只能计算它们之差的绝对值,看是否小于某个阈值。
1 / 3 === (1 - 2 / 3); // false
Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
null 与 undefined
null表示一个“空”的值,它和0以及空字符串''不同,
0是一个数值,''表示长度为0的字符串,而null表示“空”。
还有一个和null类似的undefined,它表示“未定义”。
JavaScript的设计者希望用null表示一个空的值,而undefined表示值未定义。
事实证明,这并没有什么卵用,区分两者的意义不大。
大多数情况下,我们都应该用null。undefined仅仅在判断函数参数是否传递的情况下有用。
String
*需要特别注意的是*,字符串是不可变的,
如果对字符串的某个索引赋值,不会有任何错误,但是,也没有任何效果。
而JavaScript为字符串提供的一些常用方法,注意,调用这些方法本身不会改变原有字符串的内容,而是返回一个新字符串。
数组
1.JavaScript的Array可以包含任意数据类型,并通过索引来访问每个元素。
var arr = [1, 2, 3.14, 'Hello', null, true];
2.要取得Array的长度,直接访问length属性。
arr.length; // 6
3.*请注意*,直接给Array的length赋一个新的值会导致Array大小的变化。
var arr = [1, 2, 3];
arr.length; // 3
arr.length = 6;
arr; // arr变为[1, 2, 3, undefined, undefined, undefined]
arr.length = 2;
arr; // arr变为[1, 2]
4.*请注意*,如果通过索引赋值时,索引超过了范围,同样会引起Array大小的变化。
var arr = [1, 2, 3];
arr[5] = 'x';
arr; // arr变为[1, 2, 3, undefined, undefined, 'x']
但是,如果仅是访问而没有赋值是不会改变的。
var a=[1,2,3];
alert(a);//1,2,3
var x=a[5];
alert(a[5]);//undefined
alert(a);//1,2,3
对象
JavaScript的对象是一种无序的集合数据类型,它由若干键值对组成。
var xiaoming = {
name: '小明',
birth: 1990,
'middle-school': 'No.1 Middle School',
height: 1.70,
weight: 65,
score: null
};
访问属性是通过.操作符完成的,但这要求属性名必须是一个有效的变量名。如果属性名包含特殊字符,就必须用''括起来:
xiaoming.name; // '小明'
xiaoming.birth; // 1990
xiaohong['middle-school']; // 'No.1 Middle School'
xiaohong['name']; // '小明'
xiaohong.name; // '小明'
如果访问一个不存在的属性会返回什么呢?JavaScript规定,访问不存在的属性不报错,而是返回undefined。
由于JavaScript的对象是动态类型,你可以自由地给一个对象添加或删除属性:
var xiaoming = {
name: '小明'
};
xiaoming.age; // undefined
xiaoming.age = 18; // 新增一个age属性
xiaoming.age; // 18
delete xiaoming.age; // 删除age属性
xiaoming.age; // undefined
delete xiaoming['name']; // 删除name属性
xiaoming.name; // undefined
delete xiaoming.school; // 删除一个不存在的school属性也不会报错
要判断一个属性是否是xiaoming自身拥有的,而不是继承得到的,可以用hasOwnProperty()方法:
var xiaoming = {
name: '小明'
};
xiaoming.hasOwnProperty('name'); // true
xiaoming.hasOwnProperty('toString'); // false
条件判断
JavaScript把null、undefined、0、NaN和空字符串''视为false,其他值一概视为true。
Map和Set
1.JavaScript的默认对象表示方式{}可以视为其他语言中的Map或Dictionary的数据结构,即一组键值对。
2.但是JavaScript的对象有个小问题,就是键必须是字符串。
但实际上Number或者其他数据类型作为键也是非常合理的。
为了解决这个问题,最新的ES6规范引入了新的数据类型Map。
var m = new Map();
var s = new Set();
3.初始化Map需要一个二维数组,或者直接初始化一个空Map。Map具有以下方法:
var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
m.get('Michael'); // 95
var m = new Map(); // 空Map
m.set('Adam', 67); // 添加新的key-value
m.set('Bob', 59);
m.has('Adam'); // 是否存在key 'Adam': true
m.get('Adam'); // 67
m.delete('Adam'); // 删除key 'Adam'
m.get('Adam'); // undefined
4.在Set中,没有重复的key。
要创建一个Set,需要提供一个Array作为输入,或者直接创建一个空Set:
var s1 = new Set(); // 空Set
var s2 = new Set([1, 2, 3]); // 含1, 2, 3
重复元素在Set中自动被过滤:
var s = new Set([1, 2, 3, 3, '3']);
s; // Set {1, 2, 3, "3"}
5.通过add(key)方法可以添加元素到Set中,可以重复添加,但不会有效果,
通过delete(key)方法可以删除元素。
iterable
1.遍历Array可以采用下标循环,遍历Map和Set就无法使用下标。
2.for ... in循环由于历史遗留问题,它遍历的实际上是对象的属性名称。
一个Array数组实际上也是一个对象,它的每个元素的索引被视为一个属性。
当我们手动给Array对象添加了额外的属性后,for ... in循环将带来意想不到的意外效果:
var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x in a) {
alert(x); // '0', '1', '2', 'name'
}
3.for ... of循环则完全修复了这些问题,它只循环集合本身的元素:
var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x of a) {
alert(x); // 'A', 'B', 'C'
}
4.更好的方式是直接使用iterable内置的forEach方法,
它接收一个函数,每次迭代就自动回调该函数
var a = ['A', 'B', 'C'];
a.forEach(function (element, index, array) {
// element: 指向当前元素的值
// index: 指向当前索引
// array: 指向Array对象本身
alert(element);
});
Set与Array类似,但Set没有索引,因此回调函数的前两个参数都是元素本身:
var s = new Set(['A', 'B', 'C']);
s.forEach(function (element, sameElement, set) {
alert(element);
});
Map的回调函数参数依次为value、key和map本身:
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
m.forEach(function (value, key, map) {
alert(value);
});
如果对某些参数不感兴趣,由于JavaScript的函数调用不要求参数必须一致,因此可以忽略它们。
例如,只需要获得Array的element:
var a = ['A', 'B', 'C'];
a.forEach(function (element) {
alert(element);
});
网友评论