JS 知识碎片

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]);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值