JavaScript全面学习(入门)

1.NaN === NaN; // false   Not a Number与所有其他值都不相等,包括它自己

  isNaN(NaN); // true

  1 / 3 === (1 - 2 / 3); // false  浮点数在运算过程中会产生误差

2.大多数情况下,我们都应该用nullundefined仅仅在判断函数参数是否传递的情况下有用

3.启用严格模式:JavaScript代码的第一行写上 'use strict';

4.ES6新增了一种多行字符串的表示方法,用` ... `表示(键盘左上角的点)

  ES6新增了一种模板字符串,可以如下写:

var name = '小明';
var age = 20;
alert(`你好, ${name}, 你今年${age}岁了!`);

5.字符串是不可变的

var s = 'Test';
s[0] = 'X';
alert(s); // s仍然为'Test'
alert(s[0]);  //仍然为'T'

调用一些字符串方法本身不会改变原有字符串的内容,而是返回一个新字符串

var s = 'hello, world'  //中间有空格
s.substring(0, 5); // 从索引0开始到5(不包括5),返回'hello'
s.substring(7); // 从索引7开始到结束,返回'world'

6.直接给Arraylength赋一个新的值会导致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]

Array的索引进行赋值会直接修改这个Array,与上面的字符串有所不同。

var arr = ['A', 'B', 'C'];
arr[1] = 99;
arr; // arr现在变为['A', 99, 'C']

7.indexOf

var arr = [10, 20, '30', 'xyz'];
arr.indexOf(10); // 元素10的索引为0
arr.indexOf(20); // 元素20的索引为1
arr.indexOf(30); // 元素30没有找到,返回-1,  arr.indexOf(xyz)也是-1
arr.indexOf('30'); // 元素'30'的索引为2

8.slice()类似于上面的substring(),只不过是用于数组。如果不给slice()传递任何参数,它就会从头到尾截取所有元素。

var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
arr.slice(0, 3); // 从索引0开始,到索引3结束,但不包括索引3: ['A', 'B', 'C']
arr.slice(3); // 从索引3开始到结束: ['D', 'E', 'F', 'G']

9.push()Array的末尾添加若干元素,     pop()则把Array的最后一个元素删除掉。

   unshift()向Array的头部添加若干元素shift()则把Array的第一个元素删掉。空数组继续pop或者shift不会报错,而是返回undefined

10.sort()可以对当前Array进行重新默认排序(按ASCII码,小写字母在大写字母之后),10会在2之前!

    reverse()把整个Array的元素倒序

   要按数字大小排序,我们可以这么写:

var arr = [10, 20, 1, 2];
arr.sort(function (x, y) {
    if (x < y) {
        return -1;
    }
    if (x > y) {
        return 1;
    }
    return 0;
}); // [1, 2, 10, 20]

忽略大小写,按照字母序排序:

var arr = ['Google', 'apple', 'Microsoft'];
arr.sort(function (s1, s2) {
    x1 = s1.toUpperCase();
    x2 = s2.toUpperCase();
    if (x1 < x2) {
        return -1;
    }
    if (x1 > x2) {
        return 1;
    }
    return 0;
}); // ['apple', 'Google', 'Microsoft']

注意,sort()方法会直接对Array进行修改保存:

var a1 = ['B', 'A', 'C'];
var a2 = a1.sort();
a1; // ['A', 'B', 'C']
a2; // ['A', 'B', 'C']
a1 === a2; // true, a1和a2是同一对象

 

11.splice()方法

var arr = ['Microsoft', 'Apple', 'Yahoo', 'AOL', 'Excite', 'Oracle'];
arr.splice(2, 3, 'Google', 'Facebook'); //从[2]开始,删除3个元素 ['Yahoo', 'AOL', 'Excite'],同时这3个元素也是返回值,并把'Google', 'Facebook'放在这里。
arr; // 结果是['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']
arr.splice(2, 2); // 从[2]开始,删除2个元素['Google', 'Facebook'],同时也是返回值
arr; // ['Microsoft', 'Apple', 'Oracle']arr.splice(2, 0, 'Google', 'Facebook'); // 返回[],因为没有删除任何元素
arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']

12.concat()方法把当前的Array和另一个Array连接起来,并且自动把Array拆开

var arr = ['A', 'B', 'C'];
arr.concat(1, 2, [3, 4]); // ['A', 'B', 'C', 1, 2, 3, 4]

13.join()把当前Array的每个元素都用指定的字符串连接起来,然后返回连接后的字符串

var arr = ['A', 'B', 'C', 1, 2, 3];
arr.join('-'); // 'A-B-C-1-2-3'

14.如果属性名包含特殊字符,如-之类的,就必须用''括起来,且无法用.访问,要用['XXX']访问

var xiaohong = {
    name: '小红',
    'middle-school': 'No.1 Middle School'
};

xiaohong['middle-school']; // 'No.1 Middle School' xiaohong['name']; // '小红' xiaohong.name; // '小红'

访问不存在的属性不报错,而是返回undefined,但是可以直接定义一个属性且赋值,如xiaoming.age = 18;

在属性前加 delete 可以删除属性,如 delete xiaoming.age; // 删除age属性

15.如果我们要检测xiaoming是否拥有某一属性,可以用in操作符

var xiaoming = {
    name: '小明',
    birth: 1990,
    school: 'No.1 Middle School',
};
'name' in xiaoming; // true
'grade' in xiaoming; // false

但是显示true的属性不一定就是xiaoming本身的,有可能是继承的。

用hasOwnProperty()方法可以判断准确,只有自身的才会是true

xiaoming.hasOwnProperty('name'); // true

16.JavaScript把nullundefined0NaN和空字符串''视为false,其他值一概视为true

17.for ... in循环遍历

var aa = {
    name: 'Jack',
    age: 20,
    city: 'Beijing'
};
for (var key in aa) {
    alert(key); // 'name', 'age', 'city'
}

如果拥有继承属性,这样写还会把继承的属性遍历出来。要过滤掉对象继承的属性,用hasOwnProperty()来实现

var o = {
    name: 'Jack',
    age: 20,
    city: 'Beijing'
};
for (var key in o) {
    if (o.hasOwnProperty(key)) {
        alert(key); // 'name', 'age', 'city'
    }
}

对于数组,直接像上面那样遍历只会得出索引编号。而且是字符串类型

var a = ['A', 'B', 'C'];
for (var i in a) {
    alert(i); // '0', '1', '2'
    alert(a[i]); // 'A', 'B', 'C'
}

同时每一个索引其实也是一个属性

var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x in a) {
    alert(x); // '0', '1', '2', 'name'
}

 

18.JavaScript的对象的键必须是字符串

 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

Set和Map类似,但是key不能重复,示例:

var s = new Set([1, 2, 3, 3, '3']);
s; // Set {1, 2, 3, "3"}
s.add(4); //添加4

s; // Set {1, 2, 3, "3",4}

19.遍历Array可以采用下标循环,遍历MapSet就无法使用下标。

    ArrayMapSet都属于iterable类型,可以统一通过新的for ... of循环来遍历,用法如下:

var a = ['A', 'B', 'C'];
var s = new Set(['A', 'B', 'C']);
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
for (var x of a) { // 遍历Array
    alert(x);
}
for (var x of s) { // 遍历Set
    alert(x);
}
for (var x of m) { // 遍历Map
    alert(x[0] + '=' + x[1]);
}

这样与上面的for...in有很大区别,输出不再是索引,也不再是属性

var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x of a) {
    alert(x); // 'A', 'B', 'C'
}

20.还有一种更好的遍历方法用forEach函数

var a = ['A', 'B', 'C'];
a.forEach(function (element, index, array) {
    // element: 指向当前元素的值
    // index: 指向当前索引
    // array: 指向Array对象本身   
//一般(element)就够了,不用后面两个参数。
alert(element); //element返回A,B,C。index返回0,1,2。array返回3次A,B,C });

对于Set

var s = new Set(['A', 'B', 'C']);
s.forEach(function (element, sameElement, set) {
    alert(element);       //前两个都是返回A,B,C。set则返回3次[object Set]
});

对于Map

var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
m.forEach(function (value, key, map) {
    alert(value);      //value返回x,y,z。key返回1,2,3。map返回3次[object Map]
});

 

posted @ 2016-12-11 15:24  森森森shen  阅读(187)  评论(0编辑  收藏  举报