1、返回一个 undefined 值:
var a = 1, b = 3, c = void a, d = undefined;
console.log(a, b, c, d, c === d); //1 3 undefined undefined true
2、slice() 函数使用:
不带参数,将返回当前数组的一个浅复本。
var a = [1, 2, 3, 4];
var b = a.slice();
a.push(5);
console.log(a, b); //[ 1, 2, 3, 4, 5 ] [ 1, 2, 3, 4 ]
3、new String(str);
创建的是 str 字符串的封闭对象,而非基本类型值。
在不同浏览器 Debug 显示结果有所不同:
var a = new String("abc");
console.log(a);
//旧版本的 Chrome 显示如下:{ '0': 'a', '1': 'b', '2': 'c' }
//新版本的 Chrome 显示如下:String {0: "a", 1: "b", 2: "c", length: 3, [[PrimitiveValue]]: "abc"}
//旧版本的 Firefox 显示如下:"abc"
//新版本的 Firefox 显示如下:String ["a","b","c"]
console.log(a.toString(), Object.prototype.toString.call(a));
//旧版本的 Chrome 显示如下:abc [object String]
//新版本的 Chrome 显示如下:"abc" "[object String]"
4、封闭对象 Boolean:
var a = new Boolean(false); //这里创建的是一个 Boolean 对象
if (!a) { //对象不为 [空|false]
console.log(a);//执行不到这里
}
5、Date:
从 ES5 之后,获取当前的时间,可以直接使用 Date.now():
console.log(new Date(), new Date().getTime(), Date.now()); //Wed Sep 13 2017 15:11:22 GMT+0800 (China Standard Time) 1505286682763 1505286682763
//Date.now 函数的内部实现:
Date.now = function() {
return (new Date()).getTime();
};
6、Symbols
ymbols集中的值可以由程序创建和并作为属性的键来使用,也不用担心名称冲突。
调用Symbol()来创建一个新的Symbol值,它不会等同于其他值。
每一次通过 Symbol() 创建的值都是唯一的。
symbol键值是被设计来避免冲突的,所以JavaScript最基本的对象检测特性是会忽略symbol键值的。以for-in循环为例,循环只会遍历对象的字符串类型的键。Symbol键直接被忽略过了。
Object.key(obj)和 Object.getOwnPropertyNames(obj) 也是这样运作的。但是sysmbols并不完全是私有的:可以使用新API——Object.getOwnPropertySymbols(obj)将所对象的所有symbol键;另一个新API—— Reflect.ownKeys(obj),将会同时返回string和symbol类型的键。
有三种方法来获取symbol:
Call Symbol()。我们已经讨论过这种方法了,每一次调用它都将返回一个唯一的symbol。
Call Symbol.for(string)。这种方法访问一组已经存在的symbol注册表。与通过Symbol()来定一个唯一值不同的是,symbol注册表中的symbols是共享的。如果你调用Symbol.for(“cat”)三十次,每一次返回都将是同一个symbol。在多页面或者单页面的多模块需要共享symbol时,这是很有效的方法。
使用标准中定义的Symbol.iterator。标准委员会自己定义了几种symbols。每一种都有它的特殊意义。
7、循环
对一个数组循环,有以下几种方式:
1). 传统的方式:
书写比较麻烦,不是很简捷
var a = [1,2,3,4,5];
a.name = "aName";
for (var i = 0; i < a.length; i++) {
if (i == 2) {
continue; //可以使用 continue | break |return 关键字
}
console.log(i, a[i]);
if (i == 6) {
break;
}
}
//结果:
0 1
1 2
3 4
4 5
2). 使用 forEach() 函数
a.forEach(function(idx, val, arr) {
//if (idx == 2) {
// continue; //不能使用 continue | break |return 关键字
//}
console.log(idx, val, arr);
});
//结果:
1 0 [ 1, 2, 3, 4, 5, name: 'aName' ]
2 1 [ 1, 2, 3, 4, 5, name: 'aName' ]
3 2 [ 1, 2, 3, 4, 5, name: 'aName' ]
4 3 [ 1, 2, 3, 4, 5, name: 'aName' ]
5 4 [ 1, 2, 3, 4, 5, name: 'aName' ]
3). 使用 for … in,会将其他的一些属性也列出来:
>用于遍历对象属性
a.name = "aName";
for (var idx in a) {
if (idx == 2) {
continue; //可以使用 continue | break |return 关键字
}
console.log(idx, a[idx]);
if (idx == 6) {
break;
}
}
//结果:
0 1
1 2
3 4
4 5
name aName
4). 使用 for … of,但下标需要转换:
var a = ["a","b","c","d","e"];
for (var val of a) {
if (val == 2) {
continue;//可以使用 continue | break |return 关键字
}
console.log(a.indexOf(val), val);
if (val == "f") {
break;
}
}
//结果:
0 "a"
1 "b"
2 "c"
3 "d"
4 "e"
for … of 用于遍历数据,可以运用于其他的集合中,而不光是数组中,比如:
字符串:
var a = "abcdef"; for (var val of a) { console.log(a.indexOf(val), val); }
set 对象 :
var uniqueWords = new Set(a); for (var word of uniqueWords) { console.log(word); }
map 对象 :
var a = new Map([[1, 'x'], [2, 'y'], [3, 'z']]); for (var [key, val] of a) { console.log(key, val); }
Object 对象 :
Object 的遍历还是建议使用 for … in,对于 for … of 可以使用如下方式
var a = {a: "a", b: "b", c: "c"}; for (var key of Object.keys(a)) { console.log(key, a[key]); }