函数

高阶函数

every

判断所有元素是否满足测试条件

var arr = ['Apple', 'pear', 'orange'];
console.log(arr.every(function (s) {
return s.length > 0;
})); // true, 因为每个元素都满足s.length>0

console.log(arr.every(function (s) {
return s.toLowerCase() === s;
})); // false, 因为不是每个元素都全部是小写

find

查找符合条件的第一个元素

var arr = ['Apple', 'pear', 'orange'];
console.log(arr.find(function (s) {
return s.toLowerCase() === s;
})); // 'pear', 因为pear全部是小写

console.log(arr.find(function (s) {
return s.toUpperCase() === s;
})); // undefined, 因为没有全部是大写的元素

findIndex

返回索引

firEach

类似map无返回值

闭包

箭头函数

x => x*x
function (x){
return x*x;
}

(x, y) => x*x+y*y

() => 3.14

(x, y, ...rest) => {
var i, sum = x + y;
for(i=0; i<rest.length; i++){
sum+=rest[i];
}
return sum;
}

返回对象

x => ({foo: x})

this指向

// 错误
var obj = {
birth: 1990,
getAge: function () {
var b = this.birth; // 1990
var fn = function () {
return new Date().getFullYear() - this.birth; // this指向window或undefined
};
return fn();
}
};

// 正确 使用了箭头函数
var obj = {
birth: 1990,
getAge: function () {
var b = this.birth; // 1990
var fn = () => new Date().getFullYear() - this.birth; // this指向obj对象
return fn();
}
};
obj.getAge(); // 25

由于this在箭头函数中已经按照词法作用域绑定了,所以,用call()或者apply()调用箭头函数时,无法对this进行绑定,即传入的第一个参数被忽略

var obj = {
birth: 1990,
getAge: function (year) {
var b = this.birth; // 1990
var fn = (y) => y - this.birth; // this.birth仍是1990
return fn.call({birth:2000}, year);
}
};
obj.getAge(2015); // 这里是25 不是15

generate

生成器,和python的一样

自增器

function* next_id(){
    var i=1;
    while(true){
        yield i;
        i++;
    }
}

调用

var g = next_id();
g.next().value;

for (var x of next_id()){
    console.log(x);
}

标准对象

typeof 123; // 'number'
typeof NaN; // 'number'
typeof 'str'; // 'string'
typeof true; // 'boolean'
typeof undefined; // 'undefined'
typeof Math.abs; // 'function'
typeof null; // 'object'
typeof []; // 'object'
typeof {}; // 'object'

数据转换

var n = Number('123'); // 123,相当于parseInt()或parseFloat()
typeof n; // 'number'
parseInt('123');parseFloat('123.45');

var b = Boolean('true'); // true
typeof b; // 'boolean'

var b2 = Boolean('false'); // true! 'false'字符串转换结果为true!因为它是非空字符串!
var b3 = Boolean(''); // false

var s = String(123.45); // '123.45'
typeof s; // 'string'
  • 判断Array要使用Array.isArray(arr);

  • 判断null请使用myVar === null;

  • 判断某个全局变量是否存在用typeof window.myVar === ‘undefined’;

  • 函数内部判断某个变量是否存在用typeof myVar === ‘undefined’

    (123).toString(); // ‘123’

Date

var now = new Date();
now; // Wed Jul 27 2022 14:34:31 GMT+0800 (中国标准时间)
now.getFullYear(); // 2022, 年份
now.getMonth(); // 6, 月份,注意月份范围是0~11,6表示七月
now.getDate(); // 27, 表示24号
now.getDay(); // 3, 表示星期三
now.getHours(); // 14, 24小时制
now.getMinutes(); // 35, 分钟
now.getSeconds(); // 22, 秒
now.getMilliseconds(); // 875, 毫秒数
now.getTime(); // 1658903671874, 以number形式表示的时间戳

解析

var d = Date.parse('2022-07-27T14:39:40.20+08:00'); // 1658903980200 时间戳
d = new Date(d); // Wed Jul 27 2022 14:39:40 GMT+0800 (中国标准时间)

时间戳

Date.now();
new Date().getTime();

正则表达式

var re1 = /ABC\-001/;
var re2 = new RegExp('ABC\-001');

判断是否匹配

var re = /^\d{3}\-\d{3,8}$/;
re.test('010-12345'); // true
re.test('010-1234x'); // false
re.test('010 12345'); // false

切分字符串

'a,b;; c  d'.split(/[\s\,\;]+/); // ['a', 'b', 'c', 'd']

提取字串

var re = /^(\d{3})-(\d{3,8})$/;
re.exec('010-12345'); // ['010-12345', '010', '12345']
re.exec('010 12345'); // null

第一个元素是正则表达式匹配到的整个字符串,后面的字符串表示匹配成功的子串。

贪婪匹配

var re = /^(\d+?)(0*)$/; // 加?匹配尽可能少
re.exec('102300'); // ['102300', '1023', '00']

全局搜索

匹配多个,要不只能匹配第一个

var s = 'JavaScript, VBScript, JScript and ECMAScript';
var re=/[a-zA-Z]+Script/g;

// 使用全局匹配:
re.exec(s); // ['JavaScript']
re.lastIndex; // 10

re.exec(s); // ['VBScript']
re.lastIndex; // 20

re.exec(s); // ['JScript']
re.lastIndex; // 29

re.exec(s); // ['ECMAScript']
re.lastIndex; // 44

re.exec(s); // null,直到结束仍没有匹配到

匹配邮箱

var re = /^[0-9a-zA-Z\.]+@\w+\.[a-z]{2,3}$/;

json

序列化

var xiaoming = {
name: '小明',
age: 14,
gender: true,
height: 1.65,
grade: null,
'middle-school': '\"W3C\" Middle School',
skills: ['JavaScript', 'Java', 'Python', 'Lisp']
};
var s = JSON.stringify(xiaoming);
/*
{"name":"小明","age":14,"gender":true,"height":1.65,"grade":null,"middle-school":"\"W3C\" Middle School","skills":["JavaScript","Java","Python","Lisp"]}
*/

var s = JSON.stringify(xiaoming, null, ' ');
/*
{
"name": "小明",
"age": 14,
"gender": true,
"height": 1.65,
"grade": null,
"middle-school": "\"W3C\" Middle School",
"skills": [
"JavaScript",
"Java",
"Python",
"Lisp"
]
}
*/

// 过滤属性
var s = JSON.stringify(xiaoming, ['name', 'skills'], ' ');

// 传处理函数
function convert(key, value) {
if (typeof value === 'string') {
return value.toUpperCase();
}
return value;
}
JSON.stringify(xiaoming, convert, ' ');

// 自定义序列化
var xiaoming = {
name: '小明',
age: 14,
gender: true,
height: 1.65,
grade: null,
'middle-school': '\"W3C\" Middle School',
skills: ['JavaScript', 'Java', 'Python', 'Lisp'],
toJSON: function () {
return { // 只输出name和age,并且改变了key:
'Name': this.name,
'Age': this.age
};
}
};
JSON.stringify(xiaoming); // '{"Name":"小明","Age":14}'

解析

JSON.parse('[1,2,3,true]'); // [1, 2, 3, true]
JSON.parse('{"name":"小明","age":14}'); // Object {name: '小明', age: 14}
JSON.parse('true'); // true
JSON.parse('123.45'); // 123.45

面向对象

创建

类似结构体

function Student(name) { // 大写
this.name = name;
this.hello = function () {
alert('Hello, ' + this.name + '!');
}
}
var hdh = new Student('hdh');
hdh.name;
hdh.hello();

function Student(name) {
this.name = name;
}

Student.prototype.hello = function () {
alert('Hello, ' + this.name + '!');
};

继承

拥抱ES6

class Student {
constructor(name){
this.name = name;
}

hello(){
alert(`hello, ${this.name}!`);
}
}
class PrimaryStudent extends Student {
constructor(name, grade){
super(name); // 父类构造方法
this.grade = grade;
}

myGrade(){
alert(this.grade);
}
}

猫类

class Animal {
constructor(name) {
this.name = name;
}
}
class Cat extends Animal{
constructor(name) {
super(name);
}
say(){
return `Hello, ${this.name}!`
}
}

浏览器

内置对象

window

  • innerWidth
  • innerHeight
  • outerWidth
  • outerHeight

navigator

  • navigator.appName:浏览器名称;
  • navigator.appVersion:浏览器版本;
  • navigator.language:浏览器设置的语言;
  • navigator.platform:操作系统类型;
  • navigator.userAgent:浏览器设定的User-Agent字符串。

screen

  • screen.width:屏幕宽度,以像素为单位;
  • screen.height:屏幕高度,以像素为单位;
  • screen.colorDepth:返回颜色位数,如8、16、24。

location

  • location.protocol; // ‘http’
  • location.host; // ‘www.example.com'
  • location.port; // ‘8080’
  • location.pathname; // ‘/path/index.html’
  • location.search; // ‘?a=1&b=2’
  • location.hash; // ‘TOP’
  • location.assign(‘url’) // 加载新页面
  • location.reload() // 刷新

document

操作DOM树的根节点